BaseObservable

trait BaseObservable[+Self <: (Observable), +A] extends Source[A] with Named

This trait represents a reactive value that can be subscribed to.

It has only one direct subtype, Observable, which in turn has two direct subtypes, EventStream and Signal.

BaseObservable is the same as Observable, it just lives in a separate trait for technical reasons (the Self type param).

All Observables are lazy. An Observable starts when it gets its first observer (internal or external), and stops when it loses its last observer (again, internal or external).

Basic idea: Lazy Observable only holds references to those children that have any observers (either directly on themselves, or on any of their descendants). What this achieves:

  • Stream only propagates its value to children that (directly or not) have observers
  • Stream calculates its value only once regardless of how many observers / children it has) (so, all streams are "hot" observables)
  • Stream doesn't hold references to Streams that no one observes, allowing those Streams to be garbage collected if they are otherwise unreachable (which they should become when their subscriptions are killed by their owners)
Companion:
object
trait Named
trait Source[A]
class Object
trait Matchable
class Any
trait EventStream[A]
class MergeStream[A]
trait MultiParentStream[I, O]
class CombineStreamN[A, Out]
class SampleCombineStreamN[A, Out]
trait SingleParentStream[I, O]
class CollectStream[A, B]
class DropStream[A]
class FilterStream[A]
class MapStream[I, O]
class TakeStream[A]
class DelayStream[A]
class SwitchStream[I, O]
trait Observable[A]
trait Signal[A]
trait MultiParentSignal[I, O]
class CombineSignalN[A, Out]
class SampleCombineSignalN[A, Out]
trait SingleParentSignal[I, O]
class MapSignal[I, O]
class DerivedVarSignal[A, B]
class ScanLeftSignal[A, B]
class SplitSignal[M, Input, Output, Key]
class SwitchSignal[A]
class Val[A]
trait StrictSignal[A]
trait OwnedSignal[A]
trait CustomSource[A]

Value members

Abstract methods

def addObserver(observer: Observer[A])(implicit owner: Owner): Subscription

Subscribe an external observer to this observable

Subscribe an external observer to this observable

def debugWith(debugger: Debugger[A]): Self[A]

Create a new observable that listens to this one and has a debugger attached.

Create a new observable that listens to this one and has a debugger attached.

Use the resulting observable in place of the original observable in your code. See docs for details.

There are more convenient methods available implicitly from DebuggableObservable and DebuggableSignal, such as debugLog(), debugSpyEvents(), etc.

def distinctTry(isSame: (Try[A], Try[A]) => Boolean): Self[A]

Distinct all values (both events and errors) using a comparison function

Distinct all values (both events and errors) using a comparison function

def map[B](project: A => B): Self[B]
Value parameters:
project

Note: guarded against exceptions

def recover[B >: A](pf: PartialFunction[Throwable, Option[B]]): Self[B]
Value parameters:
pf

Note: guarded against exceptions

def recoverToTry: Self[Try[A]]

Convert this to an observable that emits Failure(err) instead of erroring

Convert this to an observable that emits Failure(err) instead of erroring

Concrete methods

def distinct: Self[A]

Distinct events (but keep all errors) by == (equals) comparison

Distinct events (but keep all errors) by == (equals) comparison

def distinctBy(isSame: (A, A) => Boolean): Self[A]

Distinct events (but keep all errors) using a comparison function

Distinct events (but keep all errors) using a comparison function

def distinctByKey(key: A => Any): Self[A]

Distinct events (but keep all errors) by matching key Note: key(event) might be evaluated more than once for each event

Distinct events (but keep all errors) by matching key Note: key(event) might be evaluated more than once for each event

def distinctByRef(implicit ev: A <:< AnyRef): Self[A]

Distinct events (but keep all errors) by reference equality (eq)

Distinct events (but keep all errors) by reference equality (eq)

def distinctErrors(isSame: (Throwable, Throwable) => Boolean): Self[A]

Distinct errors only (but keep all events) using a comparison function

Distinct errors only (but keep all events) using a comparison function

final override def equals(obj: Any): Boolean

Airstream may internally use Scala library functions which use == or hashCode for equality, for example List.contains. Comparing observables by structural equality pretty much never makes sense, yet it's not that hard to run into that, all you need is to create a case class subclass, and the Scala compiler will generate a structural-equality equals and hashCode methods for you behind the scenes.

Airstream may internally use Scala library functions which use == or hashCode for equality, for example List.contains. Comparing observables by structural equality pretty much never makes sense, yet it's not that hard to run into that, all you need is to create a case class subclass, and the Scala compiler will generate a structural-equality equals and hashCode methods for you behind the scenes.

To prevent that, we make equals and hashCode methods final, using the default implementation (which is reference equality).

Definition Classes
Any
def flatMap[B, Inner[_], Output <: (Observable)](compose: A => Inner[B])(implicit strategy: FlattenStrategy[Self, Inner, Output]): Output[B]
Value parameters:
compose

Note: guarded against exceptions

def foreach(onNext: A => Unit)(implicit owner: Owner): Subscription

Create an external observer from a function and subscribe it to this observable.

Create an external observer from a function and subscribe it to this observable.

Note: since you won't have a reference to the observer, you will need to call Subscription.kill() to unsubscribe

final override def hashCode(): Int

Force reference equality checks. See comment for equals.

Force reference equality checks. See comment for equals.

Definition Classes
Any
def mapTo[B](value: => B): Self[B]

value is passed by name, so it will be evaluated whenever the Observable fires. Use it to sample mutable values (e.g. myInput.ref.value in Laminar).

value is passed by name, so it will be evaluated whenever the Observable fires. Use it to sample mutable values (e.g. myInput.ref.value in Laminar).

See also: mapToStrict

Value parameters:
value

Note: guarded against exceptions

def mapToStrict[B](value: B): Self[B]

value is evaluated strictly, only once, when this method is called.

value is evaluated strictly, only once, when this method is called.

See also: mapTo

def mapToUnit: Self[Unit]
def matchStreamOrSignal[B](ifStream: EventStream[A] => B, ifSignal: Signal[A] => B): B
def recoverIgnoreErrors: Self[A]
def throwFailure[B](implicit ev: A <:< Try[B]): Self[B]

Unwrap Try to "undo" recoverToTry – Encode Failure(err) as observable errors, and Success(v) as events

Unwrap Try to "undo" recoverToTry – Encode Failure(err) as observable errors, and Success(v) as events

def toSignalIfStream[B >: A](ifStream: EventStream[A] => Signal[B]): Signal[B]
def toStreamIfSignal[B >: A](ifSignal: Signal[A] => EventStream[B]): EventStream[B]
def toWeakSignal: Signal[Option[A]]

Convert this observable to a signal of Option[A]. If it is a stream, set initial value to None.

Convert this observable to a signal of Option[A]. If it is a stream, set initial value to None.

Inherited methods

protected def defaultDisplayName: String

This is the method that subclasses override to preserve the user's ability to set custom display names.

This is the method that subclasses override to preserve the user's ability to set custom display names.

Inherited from:
Named
final def displayName: String
Inherited from:
Named
def setDisplayName(name: String): Named.this.type

Set the display name for this instance (observable or observer).

Set the display name for this instance (observable or observer).

  • This method modifies the instance and returns this. It does not create a new instance.
  • New name you set will override the previous name, if any. This might change in the future. For the sake of sanity, don't call this more than once for the same instance.
  • If display name is set, toString will output it instead of the standard type@hashcode string
Inherited from:
Named
Inherited from:
Source
final override def toString: String

Override defaultDisplayName instead of this, if you need to.

Override defaultDisplayName instead of this, if you need to.

Definition Classes
Named -> Any
Inherited from:
Named