Usage
Wrap
You can Rx.wrap a reactive (or raw source) in an object for fluent, chainable function calls.
After calling wrap, you can invoke operators directly, for example:
// Print out number of clicks in a 200ms time-windowRx.wrap(Rx.From.event(document, `pointerup`, { x:0, y:0 })) .chunk({ elapsed: 200 }) .transform(v => v.length) .onValue(v => { console.log(v) });
Sources can be another wrapped reactive, a normal reactive, iterable, generator, array or function that returns a value.
For example:
Rx.wrap([1,2,3,4,5,6]) .chunk({ quantity: 2 }) .onValue(v => { // Reads the source array in arrays of length 2 });
Rx.wrap
is nice because you get good code-completion and it can be very concise. The downside is that you don’t get access to the individual parts of a flow if they need to be manipulated after creation.
Run
Compose a source and set of operators together with Rx.run . It returns a new reactive emitting the value of the last operator in the list.
const rx = Rx.run( Rx.From.array([ 5, 2, 3, 9, 5]), // Source Rx.Ops.max() // One or more operators to follow);rx.onValue(v=>{ // 5, 9})
Writable
Rx.run will return a reactive that essentially captures the last operator in the list. It doesn’t make sense to write to this reactive since it represents the tail-end.
If you need to be able to write to the head of a composed flow and read the final result, use Rx.writable . Naturally, the source needs to be a writable one.
// Only outputs a value if the maximum changesconst rx = Rx.writable( Rx.From.number(10), Rx.Ops.max());
rx.onValue(v => { console.log(v);});
rx.set(11); // prints 11rx.set(5); // doesn't print anythingrx.set(100); // prints 100
Fine-grained
Most of the given examples of Rx.run
and Rx.writable
create and compose sources and operators in one go. But we can use sources and operators more directly if needed:
// Reactive objectconst source = Rx.From.object({ size: 10, colour: `red` });
// Transform input objects' 'size' propertyconst transform = Rx.transform(source, v => ({...v, size: v.size * 2 }))
// The 'transform' stream will emit a value of 28source.updateField(`size`, 14);