This repository has been archived by the owner. It is now read-only.
Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| Observable.wrap = function (fn) { | |
| function createObservable() { | |
| return Observable.spawn.call(this, fn.apply(this, arguments)); | |
| } | |
| createObservable.__generatorFunction__ = fn; | |
| return createObservable; | |
| }; | |
| var spawn = Observable.spawn = function () { | |
| var gen = arguments[0], self = this, args = []; | |
| for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); } | |
| return new AnonymousObservable(function (o) { | |
| var g = new CompositeDisposable(); | |
| if (isFunction(gen)) { gen = gen.apply(self, args); } | |
| if (!gen || !isFunction(gen.next)) { | |
| o.onNext(gen); | |
| return o.onCompleted(); | |
| } | |
| function processGenerator(res) { | |
| var ret = tryCatch(gen.next).call(gen, res); | |
| if (ret === errorObj) { return o.onError(ret.e); } | |
| next(ret); | |
| } | |
| processGenerator(); | |
| function onError(err) { | |
| var ret = tryCatch(gen.next).call(gen, err); | |
| if (ret === errorObj) { return o.onError(ret.e); } | |
| next(ret); | |
| } | |
| function next(ret) { | |
| if (ret.done) { | |
| o.onNext(ret.value); | |
| o.onCompleted(); | |
| return; | |
| } | |
| var obs = toObservable.call(self, ret.value); | |
| var value = null; | |
| var hasValue = false; | |
| if (Observable.isObservable(obs)) { | |
| g.add(obs.subscribe(function(val) { | |
| hasValue = true; | |
| value = val; | |
| }, onError, function() { | |
| hasValue && processGenerator(value); | |
| })); | |
| } else { | |
| onError(new TypeError('type not supported')); | |
| } | |
| } | |
| return g; | |
| }); | |
| }; | |
| function toObservable(obj) { | |
| if (!obj) { return obj; } | |
| if (Observable.isObservable(obj)) { return obj; } | |
| if (isPromise(obj)) { return Observable.fromPromise(obj); } | |
| if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); } | |
| if (isFunction(obj)) { return thunkToObservable.call(this, obj); } | |
| if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); } | |
| if (isObject(obj)) {return objectToObservable.call(this, obj);} | |
| return obj; | |
| } | |
| function arrayToObservable (obj) { | |
| return Observable.from(obj).concatMap(function(o) { | |
| if(Observable.isObservable(o) || isObject(o)) { | |
| return toObservable.call(null, o); | |
| } else { | |
| return Rx.Observable.just(o); | |
| } | |
| }).toArray(); | |
| } | |
| function objectToObservable (obj) { | |
| var results = new obj.constructor(), keys = Object.keys(obj), observables = []; | |
| for (var i = 0, len = keys.length; i < len; i++) { | |
| var key = keys[i]; | |
| var observable = toObservable.call(this, obj[key]); | |
| if(observable && Observable.isObservable(observable)) { | |
| defer(observable, key); | |
| } else { | |
| results[key] = obj[key]; | |
| } | |
| } | |
| return Observable.forkJoin.apply(Observable, observables).map(function() { | |
| return results; | |
| }); | |
| function defer (observable, key) { | |
| results[key] = undefined; | |
| observables.push(observable.map(function (next) { | |
| results[key] = next; | |
| })); | |
| } | |
| } | |
| function thunkToObservable(fn) { | |
| var self = this; | |
| return new AnonymousObservable(function (o) { | |
| fn.call(self, function () { | |
| var err = arguments[0], res = arguments[1]; | |
| if (err) { return o.onError(err); } | |
| if (arguments.length > 2) { | |
| var args = []; | |
| for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); } | |
| res = args; | |
| } | |
| o.onNext(res); | |
| o.onCompleted(); | |
| }); | |
| }); | |
| } | |
| function isGenerator(obj) { | |
| return isFunction (obj.next) && isFunction (obj['throw']); | |
| } | |
| function isGeneratorFunction(obj) { | |
| var ctor = obj.constructor; | |
| if (!ctor) { return false; } | |
| if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; } | |
| return isGenerator(ctor.prototype); | |
| } | |
| function isObject(val) { | |
| return Object == val.constructor; | |
| } |