JSFiddle - React, Tailwind, and code Playground
by KristjanLaane
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.0/Rx.js"></script>
JavaScript
const data$ = Rx.Observable.interval(1209).map(i => i + 1).share()
const gates$ = Rx.Observable.interval(4000)
.map(_ => Math.random() >= 0.5).startWith(true).distinctUntilChanged().share()
const ticks$ = gates$.filter(b => b)
const crosses$ = gates$.filter(b => !b)
const tickedData$ = data$.windowToggle(ticks$, _ => crosses$.take(1)).switch()
const crossedDataBuffers$ = data$.bufferToggle(crosses$, _ => ticks$.take(1))
const crossedData$ = Rx.Observable.from(crossedDataBuffers$)
const out$ = tickedData$.merge(crossedData$)
data$.map(_ => "data" + _).subscribe(s => report(s))
out$.map(_ => "out" + _).subscribe(s => report(s))
gates$.map(_ => _ ? "tick" : "cross").subscribe(s => report(s))
function report(s) {
const now = new Date()
const nowString = now.toISOString().substr(16, 5) + " "
console.log(nowString + s)
}