Skip to content

Instantly share code, notes, and snippets.

@kosich
Created March 5, 2019 14:03
Show Gist options
  • Save kosich/dffd23fb4fe78cdbf539a6f0913742f4 to your computer and use it in GitHub Desktop.
Save kosich/dffd23fb4fe78cdbf539a6f0913742f4 to your computer and use it in GitHub Desktop.
Pausable Observable using takeUntil with repeatWhen
const { rxObserver, palette } = require('api/v0.3');
const { timer, Subject, from, empty } = require('rxjs');
const { takeUntil, take, repeatWhen, filter, zip, map, share } = require('rxjs/operators');
// stream for coloring
const palette$ = from(palette);
const source$ = timer(0, 10).pipe(
take(10),
// get color for each item
zip(palette$, Marble),
share()
);
const pause$ = new Subject();
const ons$ = pause$.pipe(filter(v=>v));
const offs$ = pause$.pipe(filter(v=>!v));
const result$ = source$.pipe(
takeUntil(ons$),
repeatWhen(()=>offs$)
);
turnPause(true, 30);
turnPause(false, 60);
source$.subscribe(rxObserver());
pause$.pipe(
map(v => v
? Marble('||', '#ffffff')
: Marble('▶', '#ffffff'))
)
.subscribe(rxObserver());
result$.subscribe(rxObserver());
// helpers
function turnPause(value, delay){
setTimeout(()=>{
pause$.next(value);
}, delay);
}
// creates a colored Marble
function Marble(value,color) {
return {
valueOf: ()=>value
, color
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment