Created
May 4, 2018 21:50
-
-
Save JamieDixon/9a926da67dc07bc170045df7ba4fcfb6 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
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