Returns a new Rx
with updates where f
is defined and mapped by f
.
Returns a new Rx
with updates where f
is defined and mapped by f
.
If the first update is dropped, the default value is used instead.
Returns a new Rx
without updates fulfilling a predicate.
Returns a new Rx
without updates fulfilling a predicate.
If the first update is dropped, the default value is used instead.
val numbers: Rx[Int]
val even: Rx[Int] = numbers.dropIf(_ % 2 == 0)(-1)
// numbers => 0 0 3 4 5 6 ...
// even => -1 3 5 ...
Drop repeated value of this Rx
.
Drop repeated value of this Rx
.
val numbers: Rx[Int]
val noDups: Rx[Int] = numbers.dropRepeats
// numbers => 0 0 3 3 5 5 5 4 ...
// noDups => 0 3 5 4 ...
Note: This could also be implemented in terms of keepIf, map, and foldp.
Dynamically switch between different Rx
s according to the given
function, applied on each element of this Rx
.
Dynamically switch between different Rx
s according to the given
function, applied on each element of this Rx
. Each switch will cancel
the subscriptions for the previous outgoing Rx
and start a new
subscription on the next Rx
.
Together with Rx#map
and Rx.apply
, flatMap forms a Monad
. [Proof](https://github.com/OlivierBlanvillain/monadic-html/blob/master/monadic-rx-cats/src/main/scala/mhtml/cats.scala).
Produces a Rx
containing cumulative results of applying a binary
operator to each element of this Rx
, starting from a seed
and the
current value of the upstream Rx
, and moving forward in time; no internal
state is maintained.
Produces a Rx
containing cumulative results of applying a binary
operator to each element of this Rx
, starting from a seed
and the
current value of the upstream Rx
, and moving forward in time; no internal
state is maintained.
val numbers: Rx[Int]
val folded: Rx[Int] = numbers.foldp(0)(_ + _)
// numbers => 1 2 1 1 3 ...
// folded => 1 3 4 5 8 ...
Returns a new Rx
with updates fulfilling a predicate.
Returns a new Rx
with updates fulfilling a predicate.
If the first update is dropped, the default value is used instead.
val numbers: Rx[Int]
val even: Rx[Int] = numbers.keepIf(_ % 2 == 0)(-1)
// numbers => 0 0 3 4 5 6 ...
// even => 0 0 4 6 ...
Apply a function to each element of this Rx
.
Apply a function to each element of this Rx
.
val numbers: Rx[Int]
val doubles: Rx[Int] = numbers.map(2.*)
// numbers => 0 1 4 3 2 ...
// doubles => 0 2 8 6 4 ...
Merge two Rx
into one.
Merge two Rx
into one. Updates coming from either of the incoming Rx
trigger updates in the outgoing Rx
. Upon creation, the outgoing Rx
first receives the current value from this Rx
, then from the other Rx
.
val r1: Rx[Int]
val r2: Rx[Int]
val merged: Rx[Int] = r1.merge(r2)
// r1 => 0 8 3 ...
// r2 => 1 4 3 ...
// merged => 0 8 4 3 3 ...
With this operation, Rx
forms a Semigroup
. [Proof](https://github.com/OlivierBlanvillain/monadic-html/blob/master/monadic-rx-cats/src/main/scala/mhtml/cats.scala).
|+|
syntax is available via the monadic-rx-cats
package.
Sample this Rx
using another Rx
: every time an event occurs on
the second Rx
the output updates with the latest value of this Rx
.
Sample this Rx
using another Rx
: every time an event occurs on
the second Rx
the output updates with the latest value of this Rx
.
val r1: Rx[Char]
val r2: Rx[Int]
val sp: Rx[Int] = r2.sampleOn(r1)
// r1 => u u u u ...
// r2 => 1 2 3 4 ...
// sp => 1 3 3 4 ...
Create the Cartesian product of two Rx
.
Create the Cartesian product of two Rx
. The output tuple contains the
latest values from each input Rx
, which updates whenever the value from
either input Rx
update. This method is faster than combining Rx
s using
for { a <- ra; b <- rb } yield (a, b)
.
// r1 => 0 8 9 ...
// r2 => 1 4 5 6 ...
// zip => (0,1) (8,1) (8,4) (8,5) (8,6) (9,6) ...
This method, together with Rx.apply
, forms am Applicative
.
|@|
syntax is available via the monadic-rx-cats
package.