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))