Created
January 27, 2018 21:16
-
-
Save fghibellini/1109f250c724881da82772097e625349 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Observable { | |
constructor(gen) { | |
this.gen = gen; | |
} | |
subscribe(o) { | |
const observer = (o instanceof Observer) ? o : new Observer(o); | |
const cancellationFn = this.gen(observer); | |
return cancellationFn; | |
} | |
fmap(fn) { | |
return new Observable(observer => { | |
const uns = this.subscribe(x => observer.next(x)); | |
return uns; | |
}); | |
} | |
static of(x) { | |
return new Observable(observer => { | |
setTimeout(() => observer.next(x)); | |
}); | |
} | |
} | |
class Observer { | |
constructor(observerFn) { | |
this.observerFn = observerFn; | |
} | |
next(evt) { | |
this.observerFn(evt); | |
} | |
} | |
class SecondsEvent { | |
constructor(d) { | |
this.d = d; | |
this.preventDefaultCalled = false; | |
} | |
preventDefault() { | |
this.preventDefaultCalled = true; | |
} | |
} | |
const IntervalObservable = () => new Observable(function(observer) { | |
const intId = setInterval(() => { | |
const evt = new SecondsEvent(new Date()); | |
observer.next(evt); | |
console.log(evt.preventDefaultCalled ? "Gonna spare you this time" : "Destroying world!"); | |
}, 1000); | |
return () => clearInterval(intId); | |
}); | |
const t0 = new Date(); | |
const o1 = IntervalObservable(); | |
const o2 = o1.fmap(x => x.getTime() - t0.getTime()); | |
let counter = 0; | |
const unsub = o2.subscribe(x => { | |
x.preventDefault(); | |
console.log("tick: " + x.d); | |
if (++counter === 3) unsub(); | |
}); | |
const o3 = Observable.of(42); | |
o3.subscribe(x => console.log(x)); | |
console.log(41); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment