Observable

com.raquo.airstream.core.Observable
See theObservable companion object
trait Observable[+A] extends BaseObservable[Observable, A]

All the interesting stuff is in BaseObservable. This trait exists only as a sort of type alias for BaseObservable[Observable, A]. (I can't use an actual type alias for this due to an illegal cycle)

Attributes

Companion
object
Graph
Supertypes
trait Named
trait Source[A]
class Object
trait Matchable
class Any
Show all
Known subtypes
trait EventStream[A]
trait WritableStream[A]
class MergeStream[A]
trait MultiParentStream[I, O]
class CombineStreamN[A, Out]
class SampleCombineStreamN[A, Out]
trait SingleParentStream[I, O]
class DebuggerStream[A]
class DistinctStream[A]
class CollectStream[A, B]
class DropStream[A]
class FilterStream[A]
class MapStream[I, O]
class StreamFromSignal[A]
class TakeStream[A]
class DebounceStream[A]
class DelayStream[A]
class SyncDelayStream[A]
class ThrottleStream[A]
class EventBusStream[A]
class ConcurrentStream[A]
class SwitchStream[I, O]
class JsPromiseStream[A]
class PeriodicStream[A]
class AjaxStream
class FetchStream
trait Signal[A]
trait WritableSignal[A]
trait MultiParentSignal[I, O]
class CombineSignalN[A, Out]
class SampleCombineSignalN[A, Out]
trait SingleParentSignal[I, O]
class DebuggerSignal[A]
class DistinctSignal[A]
class MapSignal[I, O]
class DerivedVarSignal[A, B]
class ObservedSignal[A]
class ScanLeftSignal[A, B]
class SignalFromStream[A]
class SplitSignal[M, Input, Output, Key]
class SwitchSignal[A]
class Val[A]
class JsPromiseSignal[A]
trait StrictSignal[A]
trait OwnedSignal[A]
trait SyncObservable[A]
trait CustomSource[A]
Show all

Members list

Value members

Concrete methods

def debugBreak(when: Try[A] => Boolean): Self[A]
Implicitly added by toDebuggableObservable

Trigger JS debugger for emitted events and errors if when passes Note: for Signals this also triggers onStart (with the current value at the time)

Trigger JS debugger for emitted events and errors if when passes Note: for Signals this also triggers onStart (with the current value at the time)

Attributes

def debugBreakErrors(when: Throwable => Boolean): Self[A]
Implicitly added by toDebuggableObservable

Trigger JS debugger for emitted errors (but not events) if when passes Note: for Signals this also triggers onStart (if current value is an error)

Trigger JS debugger for emitted errors (but not events) if when passes Note: for Signals this also triggers onStart (if current value is an error)

Attributes

def debugBreakEvents(when: A => Boolean): Self[A]
Implicitly added by toDebuggableObservable

Trigger JS debugger for emitted events (but not errors) if when passes Note: for Signals this also triggers onStart (if current value is not an error)

Trigger JS debugger for emitted events (but not errors) if when passes Note: for Signals this also triggers onStart (if current value is not an error)

Attributes

def debugBreakLifecycle: Self[A]
Implicitly added by toDebuggableObservable

Trigger JS debugger when the observable starts and stops

Trigger JS debugger when the observable starts and stops

Attributes

def debugBreakStarts: Self[A]
Implicitly added by toDebuggableObservable

Trigger JS debugger when the observable starts

Trigger JS debugger when the observable starts

Attributes

def debugBreakStops: Self[A]
Implicitly added by toDebuggableObservable

Trigger JS debugger when the observable stops

Trigger JS debugger when the observable stops

Attributes

def debugLog(when: Try[A] => Boolean, useJsLogger: Boolean): Self[A]
Implicitly added by toDebuggableObservable

Log emitted events and errors if when condition passes, using dom.console.log if useJsLogger is true. Note: for Signals this also triggers on start (with the current value at the time)

Log emitted events and errors if when condition passes, using dom.console.log if useJsLogger is true. Note: for Signals this also triggers on start (with the current value at the time)

Attributes

def debugLogErrors(when: Throwable => Boolean): Self[A]
Implicitly added by toDebuggableObservable

Log emitted errors (but not regular events) if when condition passes Note: for Signals this also triggers onStart (if current value is an error)

Log emitted errors (but not regular events) if when condition passes Note: for Signals this also triggers onStart (if current value is an error)

Attributes

def debugLogEvents(when: A => Boolean, useJsLogger: Boolean): Self[A]
Implicitly added by toDebuggableObservable

Log emitted events (but not errors) if when condition passes, using dom.console.log if useJsLogger is true. Note: for Signals this also triggers onStart (if current value is not an error)

Log emitted events (but not errors) if when condition passes, using dom.console.log if useJsLogger is true. Note: for Signals this also triggers onStart (if current value is not an error)

Attributes

def debugLogLifecycle(logStarts: Boolean, logStops: Boolean): Self[A]
Implicitly added by toDebuggableObservable

Log when the observable starts and stops

Log when the observable starts and stops

Attributes

def debugLogStarts: Self[A]
Implicitly added by toDebuggableObservable

Log when the observable starts

Log when the observable starts

Attributes

def debugLogStops: Self[A]
Implicitly added by toDebuggableObservable

Log when the observable stops

Log when the observable stops

Attributes

def debugSpy(fn: Try[A] => Unit): Self[A]
Implicitly added by toDebuggableObservable

Execute fn on every emitted event or error Note: for Signals this also triggers onStart (with the current value at the time)

Execute fn on every emitted event or error Note: for Signals this also triggers onStart (with the current value at the time)

Attributes

def debugSpyErrors(fn: Throwable => Unit): Self[A]
Implicitly added by toDebuggableObservable

Execute fn on every emitted error (but not regular events) Note: for Signals this also triggers onStart (if current value is an error)

Execute fn on every emitted error (but not regular events) Note: for Signals this also triggers onStart (if current value is an error)

Attributes

def debugSpyEvents(fn: A => Unit): Self[A]
Implicitly added by toDebuggableObservable

Execute fn on every emitted event (but not error) Note: for Signals this also triggers onStart (if current value is not an error)

Execute fn on every emitted event (but not error) Note: for Signals this also triggers onStart (if current value is not an error)

Attributes

def debugSpyLifecycle(startFn: Int => Unit, stopFn: () => Unit): Self[A]
Implicitly added by toDebuggableObservable

Execute callbacks on when the observable starts and stops

Execute callbacks on when the observable starts and stops

Value parameters

startFn

topoRank => ()

Attributes

def debugSpyStarts(fn: Int => Unit): Self[A]
Implicitly added by toDebuggableObservable

Execute callbacks on when the observable starts

Execute callbacks on when the observable starts

Value parameters

fn

topoRank => ()

Attributes

def debugSpyStops(fn: () => Unit): Self[A]
Implicitly added by toDebuggableObservable

Execute callbacks on when the observable stops

Execute callbacks on when the observable stops

Attributes

def debugTopoRank: Int
Implicitly added by toDebuggableObservable

Return the observable's topoRank. This does not affect the observable in any way.

Return the observable's topoRank. This does not affect the observable in any way.

Attributes

def debugWithName(displayName: String): Self[A]
Implicitly added by toDebuggableObservable

Create a new observable that listens to the original, and set the displayName of the new observable. This is different from setDisplayName.

Create a new observable that listens to the original, and set the displayName of the new observable. This is different from setDisplayName.

If you say stream.debugWithName("foo").debugLog(), the displayName used by the logger will be "foo" verbatim, whereas if you say stream.setDisplayName("foo").debugLog(), the logger's displayName will be "foo|Debug" – with a suffix – to differentiate it from the "foo" displayName of stream itself.

Attributes

Inherited methods

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

Subscribe an external observer to this observable

Subscribe an external observer to this observable

Attributes

Inherited from:
BaseObservable
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.

Attributes

Inherited from:
BaseObservable
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.

Attributes

Inherited from:
Named
final def displayName: String

Attributes

Inherited from:
Named
def distinct: Self[A]

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

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

Attributes

Inherited from:
BaseObservable
def distinctBy(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

Attributes

Inherited from:
BaseObservable
def distinctByFn(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

Attributes

Inherited from:
BaseObservable
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)

Attributes

Inherited from:
BaseObservable
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

Attributes

Inherited from:
BaseObservable
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

Attributes

Inherited from:
BaseObservable
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).

Attributes

Definition Classes
Inherited from:
BaseObservable
def flatMap[B, Inner[_], Output <: (Observable)](project: A => Inner[B])(implicit strategy: SwitchingStrategy[Observable, Inner, Output], allowFlatMap: AllowFlatMap): Output[B]

#WARNING: DO NOT USE THIS METHOD. See https://github.com/raquo/Airstream/#flattening-observables

#WARNING: DO NOT USE THIS METHOD. See https://github.com/raquo/Airstream/#flattening-observables

Attributes

Inherited from:
BaseObservable
def flatMapCustom[B, Inner[_], Output <: (Observable)](project: A => Inner[B])(strategy: FlattenStrategy[Observable, Inner, Output]): Output[B]

Value parameters

project

Note: guarded against exceptions

Attributes

Inherited from:
BaseObservable
def flatMapMerge[B, Inner[_], Output <: (Observable)](project: A => Inner[B])(implicit strategy: MergingStrategy[Observable, Inner, Output]): Output[B]

Value parameters

project

Note: guarded against exceptions

Attributes

Inherited from:
BaseObservable
def flatMapSwitch[B, Inner[_], Output <: (Observable)](project: A => Inner[B])(implicit strategy: SwitchingStrategy[Observable, Inner, Output]): Output[B]

Value parameters

project

Note: guarded against exceptions

Attributes

Inherited from:
BaseObservable
def flatMapTo[B, Inner[_], Output <: (Observable)](s: Inner[B])(implicit strategy: SwitchingStrategy[Observable, Inner, Output]): Output[B]

Alias to flatMapSwitch(_ => s)

Alias to flatMapSwitch(_ => s)

Attributes

Inherited from:
BaseObservable
def flatMapWithStatus[B](innerStream: => EventStream[B]): Self[Status[A, B]]

Shorthand for flatMapWithStatus(_ => innerStream).

Shorthand for flatMapWithStatus(_ => innerStream).

Attributes

Inherited from:
BaseObservable
def flatMapWithStatus[B](project: A => EventStream[B]): Self[Status[A, B]]

Based on flatMapSwitch, but tracks the status of input and output to flatMap. See Status.

Based on flatMapSwitch, but tracks the status of input and output to flatMap. See Status.

Attributes

Inherited from:
BaseObservable
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

Attributes

Inherited from:
BaseObservable
final override def hashCode(): Int

Force reference equality checks. See comment for equals.

Force reference equality checks. See comment for equals.

Attributes

Definition Classes
Inherited from:
BaseObservable
def map[B](project: A => B): Self[B]

Value parameters

project

Note: guarded against exceptions

Attributes

Inherited from:
BaseObservable
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

Attributes

Inherited from:
BaseObservable
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

Attributes

Inherited from:
BaseObservable
def mapToUnit: Self[Unit]

Attributes

Inherited from:
BaseObservable
def matchStreamOrSignal[B](ifStream: EventStream[A] => B, ifSignal: Signal[A] => B): B

Attributes

Inherited from:
BaseObservable
def recover[B >: A](pf: PartialFunction[Throwable, Option[B]]): Self[B]

Value parameters

pf

Note: guarded against exceptions

Attributes

Inherited from:
BaseObservable
def recoverIgnoreErrors: Self[A]

Attributes

Inherited from:
BaseObservable
def recoverToEither: Self[Either[Throwable, A]]

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

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

Attributes

Inherited from:
BaseObservable
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

Attributes

Inherited from:
BaseObservable
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

Attributes

Inherited from:
Named
def tapEach[U](f: A => U): Self[A]

Execute a side effecting callback every time the observable emits. If it's a signal, it also runs when its initial value is evaluated.

Execute a side effecting callback every time the observable emits. If it's a signal, it also runs when its initial value is evaluated.

Note: some signals such as stream.startWith or signal.composeAll have cacheInitialValue config, which could affect the number of times this callback is called in cases when you re-start a signal that was previously started, but has never emitted events before. In such cases, if cacheInitialValue == false (the default) , it will cause the signal's initial value to be re-evaluated, and this will in turn trigger the provided tapEach callback.

See com.raquo.airstream.misc.SignalFromStream

// #TODO[API] How to better type this? Note: Do not provide a callback that returns a LAZY value such as EventStream, it will not be started. I may eventually add a flatTapEach method for this.

Note: Calling tapEach on an observable does not add observers to it. The callback will only run if something else is listening to the observable.

Note: The primary method of running side effects in Airstream is putting them into Observers. In general, it's good practice to keep Observables themselves free of side effects. Airstream is actually pretty good at handling non-"pure" observables, but it's better to have such separation of concerns for your own sanity and the code's predictability / maintainability.

Note: This method is called tapEach for consistency with Scala collections. Scala also has a general tap method available by importing util.chaining.*.

Attributes

Inherited from:
BaseObservable

Attributes

Inherited from:
Source
def toSignalIfStream[B >: A](ifStream: EventStream[A] => Signal[B]): Signal[B]

Attributes

Inherited from:
BaseObservable
def toStreamIfSignal[B >: A](ifSignal: Signal[A] => EventStream[B]): EventStream[B]

Attributes

Inherited from:
BaseObservable
final override def toString: String

Override defaultDisplayName instead of this, if you need to.

Override defaultDisplayName instead of this, if you need to.

Attributes

Definition Classes
Named -> Any
Inherited from:
Named
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.

Attributes

Inherited from:
BaseObservable

Concrete fields

val observable: BaseObservable[Self, A]
Implicitly added by toDebuggableObservable