Demo: defer
Using defer we can lazily create our desired observable at runtime.
//Creates one of the two observables based
// on the output from Math.random()
let input = defer(() => { return Math.random() > 0.5 ?
interval(500) : timer(1000, 2000);});
//take first 5 outputs
let process = take(5);
let output = input.pipe(process).subscribe(v=>console.log(v))