Skip to content

Instantly share code, notes, and snippets.

@fghibellini
Created January 27, 2018 21:16
Show Gist options
  • Save fghibellini/8ed796cc8098ece1ebc6c0c99330b6c5 to your computer and use it in GitHub Desktop.
Save fghibellini/8ed796cc8098ece1ebc6c0c99330b6c5 to your computer and use it in GitHub Desktop.
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