Skip to content

Instantly share code, notes, and snippets.

@JamieDixon
Created May 4, 2018 21:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JamieDixon/9a926da67dc07bc170045df7ba4fcfb6 to your computer and use it in GitHub Desktop.
Save JamieDixon/9a926da67dc07bc170045df7ba4fcfb6 to your computer and use it in GitHub Desktop.
const compose = (f, g) => x => f(g(x));
const identity = x => x;
const noop = () => {};
function Disposable(fn) {
this.dispose = fn;
}
Disposable.of = fn => new Disposable(fn);
function Observer(onNext = identity, onComplete = noop) {
this.onNext = onNext;
this.onComplete = onComplete;
}
Observer.of = (onNext, onComplete) => new Observer(onNext, onComplete);
Observer.prototype.map = function (onNext) {
return Observer.of(compose(onNext, this.onNext), this.onComplete);
}
function Observable(fn, observer = Observer.of()) {
this.fn = fn;
this.observer = observer;
}
Observable.of = (fn, observer) => new Observable(fn, observer);
Observable.prototype.subscribe = function (onNext, onComplete) {
return Disposable.of(this.fn(Observer.of(this.observer.map(onNext).onNext, onComplete)));
}
Observable.prototype.map = function(onNext) {
return Observable.of(this.fn, this.observer.map(onNext));
}
const fromEvent = (source, event) => {
return Observable.of(observer => {
source.addEventListener(event, observer.onNext);
return () => {
source.removeEventListener(event, observer.onNext);
}
});
}
const fromArray = arr => {
return Observable.of(observer => {
arr.forEach(observer.onNext);
observer.onComplete();
});
}
// Very basic example:
const basicObservable = Observable.of(observer => {
observer.onNext(1);
observer.onNext(2);
observer.onNext(3);
observer.onComplete();
return () => console.log('clean up/dispose code here');
});
basicObservable
.map(x => x * 2)
.subscribe(
x => console.log('x', x),
() => console.log('basicObservable complete')
);
// Observable array
fromArray([5, 6, 7, 8])
.map(x => x + 1)
.subscribe(
x => console.log('Array value ', x),
() => console.log('Array complete')
)
// Mouse move example:
const observable = fromEvent(document, 'mousemove');
const mouseSubscription = observable
.map(e => e.clientX)
.subscribe(
x => console.log('mouse ', x)
);
setTimeout(() => {
console.log('disposing of mouse');
mouseSubscription.dispose();
}, 5000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment