Skip to content
This repository was archived by the owner on Apr 20, 2018. It is now read-only.

Commit d7dc949

Browse files
Starting modern build
1 parent 213df8c commit d7dc949

25 files changed

Lines changed: 364 additions & 417 deletions
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
module.exports = (function () {
4+
var isFn = function (value) {
5+
return typeof value === 'function' || false;
6+
};
7+
8+
// fallback for older versions of Chrome and Safari
9+
if (isFn(/x/)) {
10+
isFn = function(value) {
11+
return typeof value === 'function' &&
12+
Object.prototype.toString.call(value) === '[object Function]';
13+
};
14+
}
15+
return isFn;
16+
}());

src/modular/modern/observable.js

Lines changed: 61 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,71 @@
1-
// TODO: Refactor longStackSupport and hasStacks
2-
var Rx.config = {
3-
longStackSupport = false;
4-
};
5-
var hasStacks = false;
1+
'use strict';
2+
3+
var Observer = require('./observer');
4+
var isFunction = require('./helpers/isFunction');
5+
var AnonymousObservable = require('./observable/anonymousobservable');
66

7-
function Observable(subscribe) {
8-
if (Rx.config.longStackSupport && hasStacks) {
9-
try {
10-
throw new Error();
11-
} catch (e) {
12-
this.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
13-
}
7+
function Observable() { }
148

15-
var self = this;
16-
this._subscribe = function (observer) {
17-
var oldOnError = observer.onError.bind(observer);
9+
/**
10+
* Creates an observable sequence from a specified subscribe method implementation.
11+
* @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.
12+
* @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.
13+
*/
14+
Observable.create = function (subscribe, parent) {
15+
return new AnonymousObservable(subscribe, parent);
16+
};
1817

19-
observer.onError = function (err) {
20-
makeStackTraceLong(err, self);
21-
oldOnError(err);
22-
};
2318

24-
return subscribe.call(self, observer);
25-
};
26-
} else {
27-
this._subscribe = subscribe;
28-
}
29-
}
19+
/**
20+
* Determines whether the given object is an Observable
21+
* @param {Any} An object to determine whether it is an Observable
22+
* @returns {Boolean} true if an Observable, else false.
23+
*/
24+
Observable.isObservable = function (o) {
25+
return o && isFunction(o.subscribe);
26+
};
3027

31-
// Class methods
32-
Observable['amb'] = require('./observable/amb');
33-
Observable['case'] = require('./observable/case');
34-
Observable['catch'] = require('./observable/catch');
35-
Observable['create'] = require('./observable/create');
36-
Observable['combineLatest'] = require('./observable/combinelatest');
37-
Observable['concat'] = require('./observable/concat');
38-
Observable['defer'] = require('./observable/defer');
39-
Observable['empty'] = require('./observable/empty');
40-
Observable['for'] = require('./observable/for');
41-
Observable['forkJoin'] = require('./observable/forkjoin');
42-
Observable['from'] = require('./observable/from');
43-
Observable['fromArray'] = require('./observable/fromarray');
44-
Observable['fromCallback'] = require('./observable/fromcallback');
45-
Observable['fromEvent'] = require('./observable/fromevent');
46-
Observable['fromEventPattern'] = require('./observable/fromeventpattern');
47-
Observable['fromNodeCallback'] = require('./observable/fromnodecallback');
48-
Observable['fromPromise'] = require('./observable/frompromise');
49-
Observable['generate'] = require('./observable/generate');
50-
Observable['generateWithAbsoluteTime'] = require('./observable/generatewithabsolutetime');
51-
Observable['generateWithRelativeTime'] = require('./observable/generatewithrelativetime');
52-
Observable['if'] = require('./observable/if');
53-
Observable['interval'] = require('./observable/interval');
54-
Observable['just'] = require('./observable/just');
55-
Observable['merge'] = require('./observable/merge');
56-
Observable['never'] = require('./observable/never');
57-
Observable['of'] = require('./observable/of');
58-
Observable['ofArrayChanges'] = require('./observable/ofarraychanges');
59-
Observable['ofObjectChanges'] = require('./observable/ofobjectchanges');
60-
Observable['onErrorResumeNext'] = require('./observable/onerrorresumenext');
61-
Observable['pairs'] = require('./observable/pairs');
62-
Observable['range'] = require('./observable/range');
63-
Observable['repeat'] = require('./observable/repeat');
64-
Observable['spawn'] = require('./observable/spawn');
65-
Observable['throw'] = require('./observable/throw');
66-
Observable['timer'] = require('./observable/timer');
67-
Observable['toAsync'] = require('./observable/toasync');
68-
Observable['using'] = require('./observable/using');
69-
Observable['when'] = require('./observable/when');
70-
Observable['zip'] = require('./observable/zip');
28+
/**
29+
* Subscribes an o to the observable sequence.
30+
* @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.
31+
* @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.
32+
* @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.
33+
* @returns {Diposable} A disposable handling the subscriptions and unsubscriptions.
34+
*/
35+
Observable.prototype.subscribe = function (oOrOnNext, onError, onCompleted) {
36+
return this._subscribe(typeof oOrOnNext === 'object' ?
37+
oOrOnNext :
38+
Observer.create(oOrOnNext, onError, onCompleted));
39+
};
7140

72-
// Instance methods
41+
/**
42+
* Subscribes to the next value in the sequence with an optional "this" argument.
43+
* @param {Function} onNext The function to invoke on each element in the observable sequence.
44+
* @param {Any} [thisArg] Object to use as this when executing callback.
45+
* @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.
46+
*/
47+
Observable.prototype.subscribeOnNext = function (onNext, thisArg) {
48+
return this._subscribe(Observer.create(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));
49+
};
7350

51+
/**
52+
* Subscribes to an exceptional condition in the sequence with an optional "this" argument.
53+
* @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.
54+
* @param {Any} [thisArg] Object to use as this when executing callback.
55+
* @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.
56+
*/
57+
Observable.prototype.subscribeOnError = function (onError, thisArg) {
58+
return this._subscribe(Observer.create(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));
59+
};
7460

61+
/**
62+
* Subscribes to the next value in the sequence with an optional "this" argument.
63+
* @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.
64+
* @param {Any} [thisArg] Object to use as this when executing callback.
65+
* @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.
66+
*/
67+
Observable.prototype.subscribeOnCompleted = function (onCompleted, thisArg) {
68+
return this._subscribe(Observer.create(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));
69+
};
7570

7671
module.exports = Observable;

src/modular/modern/observable/amb.js

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/modular/modern/observable/ambproto.js

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
' use strict';
2+
3+
var inherits = require('util').inherits;
4+
var isFunction = require('../helpers/isfunction');
5+
var Disposable = require('../disposable');
6+
var tryCatchUtils = require('../helpers/trycatch');
7+
var Observable = require('../observable');
8+
var AutoDetachObserver = require('../observer/autodetachobserver');
9+
10+
if (!globals.Rx.Scheduler.currentThread) {
11+
require('../scheduler/currentthread');
12+
}
13+
14+
inherits(AnonymousObservable, Observable);
15+
16+
// Fix subscriber to check for undefined or function returned to decorate as Disposable
17+
function fixSubscriber(subscriber) {
18+
return subscriber && isFunction(subscriber.dispose) ? subscriber :
19+
isFunction(subscriber) ? Disposable.create(subscriber) : Disposable.empty;
20+
}
21+
22+
function setDisposable(s, state) {
23+
var ado = state[0], self = state[1];
24+
var sub = tryCatchUtils.tryCatch(self.__subscribe).call(self, ado);
25+
if (sub === tryCatchUtils.errorObj && !ado.fail(sub.e)) { tryCatchUtils.thrower(sub.e); }
26+
ado.setDisposable(fixSubscriber(sub));
27+
}
28+
29+
function AnonymousObservable(subscribe, parent) {
30+
this.source = parent;
31+
this.__subscribe = subscribe;
32+
Observable.call(this);
33+
}
34+
35+
AnonymousObservable.prototype._subscribe = function (o) {
36+
var ado = new AutoDetachObserver(o), state = [ado, this];
37+
38+
if (Rx.Scheduler.currentThread.scheduleRequired()) {
39+
Rx.Scheduler.currentThread.schedule(state, setDisposable);
40+
} else {
41+
setDisposable(null, state);
42+
}
43+
return ado;
44+
};
45+
46+
module.exports = AnonymousObservable;

src/modular/modern/observable/case.js

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/modular/modern/observable/catch.js

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)