ReasonXstream
ReasonML bindings for xstream.
From the original lib description:
An extremely intuitive, small, and fast functional reactive stream library for JavaScript
- Only 26 core operators and factories
- Only "hot" streams
- Written in TypeScript
- Approximately 30 kB in size, when minified
- On average, faster than RxJS 4, Kefir, Bacon.js, as fast as RxJS 5, and slower than most.js
- Tailored for Cycle.js, or applications with limited use of subscribe
Installation
npm i -s reason-xstream
Example
/*Tick every second incremental numbers,only pass even numbers, then map them to their square,and stop after 5 seconds has passed*/let stream = Xs.( periodic(1000) |> filter(i => i mod 2 === 0) |> map(i => i * i) |> endWhen( periodic(5000) |> take(1) )); /*So far, the stream is idle.As soon as it gets its first listener, it starts executing.*/stream|> Xs.( addListener( listener( ~next= i => Js.log(i), ~error= err => Js.log(err), ~complete= () => Js.log("completed"), () ) ));
Currying
With ReasonXstream you may use currying as you would in any idiomatic Reason code.
/*Passing one argument at a time for a function which takes two arguments*/let a = Xs.(periodic(1000) |> mapTo("A"));let b = Xs.(periodic(2000) |> mapTo("B")); let combineWithA = Xs.combine(a); combineWithA(b) |> Xs.( subscribe( listener( ~next= v => Js.log(v), () ) )); /*Passing two arguments at once for a function which returns a function*/let c = Xs.(periodic(1000) |> mapTo("C"));let d = Xs.(periodic(2000) |> mapTo("D")); /*same as:let cWithLatestD = c |> XsExtra.sampleCombine(d);*/let cWithLatestD = XsExtra.sampleCombine(d, c);
TODO
- Create automated tests
- Write documentation/examples