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

Commit 49397b3

Browse files
CombineLatest for perf for Issue #519
1 parent bcae4e8 commit 49397b3

21 files changed

Lines changed: 517 additions & 347 deletions

Gruntfile.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ var browsers = [{
117117
'src/core/linq/observable/catchproto.js',
118118
'src/core/linq/observable/catch.js',
119119
'src/core/linq/observable/combinelatestproto.js',
120-
'src/core/linq/observable/combinelatest.js',
120+
'src/core/perf/operators/combinelatest.js',
121121
'src/core/linq/observable/concatproto.js',
122122
'src/core/linq/observable/concat.js',
123123
'src/core/linq/observable/concatall.js',
@@ -405,7 +405,7 @@ var browsers = [{
405405
'src/core/linq/observable/catchproto.js',
406406
'src/core/linq/observable/catch.js',
407407
'src/core/linq/observable/combinelatestproto.js',
408-
'src/core/linq/observable/combinelatest.js',
408+
'src/core/perf/operators/combinelatest.js',
409409
'src/core/linq/observable/concatproto.js',
410410
'src/core/linq/observable/concat.js',
411411
'src/core/linq/observable/concatall.js',
@@ -693,7 +693,7 @@ var browsers = [{
693693
'src/core/linq/observable/catchproto.js',
694694
'src/core/linq/observable/catch.js',
695695
'src/core/linq/observable/combinelatestproto.js',
696-
'src/core/linq/observable/combinelatest.js',
696+
'src/core/perf/operators/combinelatest.js',
697697
'src/core/linq/observable/concatproto.js',
698698
'src/core/linq/observable/concat.js',
699699
'src/core/linq/observable/concatall.js',
@@ -837,7 +837,7 @@ var browsers = [{
837837
'src/core/linq/observable/catchproto.js',
838838
'src/core/linq/observable/catch.js',
839839
'src/core/linq/observable/combinelatestproto.js',
840-
'src/core/linq/observable/combinelatest.js',
840+
'src/core/perf/operators/combinelatest.js',
841841
'src/core/linq/observable/concatproto.js',
842842
'src/core/linq/observable/concat.js',
843843
'src/core/linq/observable/concatall.js',
@@ -967,7 +967,7 @@ var browsers = [{
967967
'src/core/linq/observable/catchproto.js',
968968
'src/core/linq/observable/catch.js',
969969
'src/core/linq/observable/combinelatestproto.js',
970-
'src/core/linq/observable/combinelatest.js',
970+
'src/core/perf/operators/combinelatest.js',
971971
'src/core/linq/observable/concatproto.js',
972972
'src/core/linq/observable/concat.js',
973973
'src/core/linq/observable/concatall.js',
@@ -1132,7 +1132,7 @@ var browsers = [{
11321132
'src/core/linq/observable/catchproto.js',
11331133
'src/core/linq/observable/catch.js',
11341134
'src/core/linq/observable/combinelatestproto.js',
1135-
'src/core/linq/observable/combinelatest.js',
1135+
'src/core/perf/operators/combinelatest.js',
11361136
'src/core/linq/observable/concatproto.js',
11371137
'src/core/linq/observable/concat.js',
11381138
'src/core/linq/observable/concatall.js',

dist/rx.all.compat.js

Lines changed: 68 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3170,7 +3170,7 @@
31703170
* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
31713171
*/
31723172
observableProto.combineLatest = function () {
3173-
var args = slice.call(arguments);
3173+
for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }
31743174
if (Array.isArray(args[0])) {
31753175
args[0].unshift(this);
31763176
} else {
@@ -3179,70 +3179,85 @@
31793179
return combineLatest.apply(this, args);
31803180
};
31813181

3182-
/**
3183-
* Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.
3184-
*
3185-
* @example
3186-
* 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });
3187-
* 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });
3188-
* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
3189-
*/
3190-
var combineLatest = Observable.combineLatest = function () {
3191-
var args = slice.call(arguments), resultSelector = args.pop();
3182+
function falseFactory() { return false; }
31923183

3193-
if (Array.isArray(args[0])) {
3194-
args = args[0];
3184+
var CombineLatestObservable = (function(__super__) {
3185+
inherits(CombineLatestObservable, __super__);
3186+
function CombineLatestObservable(parameters, resultSelector) {
3187+
this.parameters = parameters;
3188+
this.resultSelector = resultSelector;
3189+
this.length = parameters.length;
3190+
this.hasValue = arrayInitialize(this.length, falseFactory);
3191+
this.hasValueAll = false;
3192+
this.isDone = arrayInitialize(this.length, falseFactory);
3193+
this.values = new Array(this.length);
3194+
__super__.call(this);
31953195
}
31963196

3197-
return new AnonymousObservable(function (observer) {
3198-
var falseFactory = function () { return false; },
3199-
n = args.length,
3200-
hasValue = arrayInitialize(n, falseFactory),
3201-
hasValueAll = false,
3202-
isDone = arrayInitialize(n, falseFactory),
3203-
values = new Array(n);
3204-
3205-
function next(i) {
3206-
var res;
3207-
hasValue[i] = true;
3208-
if (hasValueAll || (hasValueAll = hasValue.every(identity))) {
3209-
try {
3210-
res = resultSelector.apply(null, values);
3211-
} catch (ex) {
3212-
observer.onError(ex);
3213-
return;
3214-
}
3215-
observer.onNext(res);
3216-
} else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {
3217-
observer.onCompleted();
3218-
}
3219-
}
3220-
3221-
function done (i) {
3222-
isDone[i] = true;
3223-
if (isDone.every(identity)) {
3224-
observer.onCompleted();
3225-
}
3226-
}
3197+
CombineLatestObservable.prototype.subscribeCore = function(observer) {
3198+
var self = this, n = this.length, subscriptions = new Array(n);
32273199

3228-
var subscriptions = new Array(n);
32293200
for (var idx = 0; idx < n; idx++) {
32303201
(function (i) {
3231-
var source = args[i], sad = new SingleAssignmentDisposable();
3202+
var source = self.parameters[i], sad = new SingleAssignmentDisposable();
32323203
isPromise(source) && (source = observableFromPromise(source));
3233-
sad.setDisposable(source.subscribe(function (x) {
3234-
values[i] = x;
3235-
next(i);
3236-
},
3237-
function(e) { observer.onError(e); },
3238-
function () { done(i); }
3239-
));
3204+
sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, self)));
32403205
subscriptions[i] = sad;
32413206
}(idx));
32423207
}
32433208

32443209
return new CompositeDisposable(subscriptions);
3245-
}, this);
3210+
};
3211+
3212+
return CombineLatestObservable;
3213+
}(ObservableBase));
3214+
3215+
var CombineLatestObserver = (function(__super__) {
3216+
inherits(CombineLatestObserver, __super__);
3217+
function CombineLatestObserver(observer, i, parent) {
3218+
this.observer = observer;
3219+
this.i = i;
3220+
this.parent = parent;
3221+
__super__.call(this);
3222+
}
3223+
3224+
CombineLatestObserver.prototype.next = function(x) {
3225+
var i = this.i;
3226+
this.parent.values[i] = x;
3227+
this.parent.hasValue[i] = true;
3228+
if (this.parent.hasValueAll || (this.parent.hasValueAll = this.parent.hasValue.every(identity))) {
3229+
try {
3230+
var res = this.parent.resultSelector.apply(null, this.parent.values);
3231+
} catch (e) {
3232+
return this.observer.onError(e);
3233+
}
3234+
this.observer.onNext(res);
3235+
} else if (this.parent.isDone.filter(function (x, j) { return j !== i; }).every(identity)) {
3236+
this.observer.onCompleted();
3237+
}
3238+
};
3239+
CombineLatestObserver.prototype.error = function(e) { this.observer.onError(e); };
3240+
CombineLatestObserver.prototype.completed = function() {
3241+
this.parent.isDone[this.i] = true;
3242+
this.parent.isDone.every(identity) && this.observer.onCompleted();
3243+
};
3244+
3245+
return CombineLatestObserver;
3246+
}(AbstractObserver));
3247+
3248+
/**
3249+
* Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.
3250+
*
3251+
* @example
3252+
* 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });
3253+
* 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });
3254+
* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
3255+
*/
3256+
var combineLatest = Observable.combineLatest = function () {
3257+
for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }
3258+
var resultSelector = args.pop();
3259+
Array.isArray(args[0]) && (args = args[0]);
3260+
return new CombineLatestObservable(args, resultSelector);
32463261
};
32473262

32483263
/**

dist/rx.all.compat.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rx.all.compat.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rx.all.js

Lines changed: 68 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2981,7 +2981,7 @@
29812981
* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
29822982
*/
29832983
observableProto.combineLatest = function () {
2984-
var args = slice.call(arguments);
2984+
for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }
29852985
if (Array.isArray(args[0])) {
29862986
args[0].unshift(this);
29872987
} else {
@@ -2990,70 +2990,85 @@
29902990
return combineLatest.apply(this, args);
29912991
};
29922992

2993-
/**
2994-
* Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.
2995-
*
2996-
* @example
2997-
* 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });
2998-
* 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });
2999-
* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
3000-
*/
3001-
var combineLatest = Observable.combineLatest = function () {
3002-
var args = slice.call(arguments), resultSelector = args.pop();
2993+
function falseFactory() { return false; }
30032994

3004-
if (Array.isArray(args[0])) {
3005-
args = args[0];
2995+
var CombineLatestObservable = (function(__super__) {
2996+
inherits(CombineLatestObservable, __super__);
2997+
function CombineLatestObservable(parameters, resultSelector) {
2998+
this.parameters = parameters;
2999+
this.resultSelector = resultSelector;
3000+
this.length = parameters.length;
3001+
this.hasValue = arrayInitialize(this.length, falseFactory);
3002+
this.hasValueAll = false;
3003+
this.isDone = arrayInitialize(this.length, falseFactory);
3004+
this.values = new Array(this.length);
3005+
__super__.call(this);
30063006
}
30073007

3008-
return new AnonymousObservable(function (observer) {
3009-
var falseFactory = function () { return false; },
3010-
n = args.length,
3011-
hasValue = arrayInitialize(n, falseFactory),
3012-
hasValueAll = false,
3013-
isDone = arrayInitialize(n, falseFactory),
3014-
values = new Array(n);
3015-
3016-
function next(i) {
3017-
var res;
3018-
hasValue[i] = true;
3019-
if (hasValueAll || (hasValueAll = hasValue.every(identity))) {
3020-
try {
3021-
res = resultSelector.apply(null, values);
3022-
} catch (ex) {
3023-
observer.onError(ex);
3024-
return;
3025-
}
3026-
observer.onNext(res);
3027-
} else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {
3028-
observer.onCompleted();
3029-
}
3030-
}
3031-
3032-
function done (i) {
3033-
isDone[i] = true;
3034-
if (isDone.every(identity)) {
3035-
observer.onCompleted();
3036-
}
3037-
}
3008+
CombineLatestObservable.prototype.subscribeCore = function(observer) {
3009+
var self = this, n = this.length, subscriptions = new Array(n);
30383010

3039-
var subscriptions = new Array(n);
30403011
for (var idx = 0; idx < n; idx++) {
30413012
(function (i) {
3042-
var source = args[i], sad = new SingleAssignmentDisposable();
3013+
var source = self.parameters[i], sad = new SingleAssignmentDisposable();
30433014
isPromise(source) && (source = observableFromPromise(source));
3044-
sad.setDisposable(source.subscribe(function (x) {
3045-
values[i] = x;
3046-
next(i);
3047-
},
3048-
function(e) { observer.onError(e); },
3049-
function () { done(i); }
3050-
));
3015+
sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, self)));
30513016
subscriptions[i] = sad;
30523017
}(idx));
30533018
}
30543019

30553020
return new CompositeDisposable(subscriptions);
3056-
}, this);
3021+
};
3022+
3023+
return CombineLatestObservable;
3024+
}(ObservableBase));
3025+
3026+
var CombineLatestObserver = (function(__super__) {
3027+
inherits(CombineLatestObserver, __super__);
3028+
function CombineLatestObserver(observer, i, parent) {
3029+
this.observer = observer;
3030+
this.i = i;
3031+
this.parent = parent;
3032+
__super__.call(this);
3033+
}
3034+
3035+
CombineLatestObserver.prototype.next = function(x) {
3036+
var i = this.i;
3037+
this.parent.values[i] = x;
3038+
this.parent.hasValue[i] = true;
3039+
if (this.parent.hasValueAll || (this.parent.hasValueAll = this.parent.hasValue.every(identity))) {
3040+
try {
3041+
var res = this.parent.resultSelector.apply(null, this.parent.values);
3042+
} catch (e) {
3043+
return this.observer.onError(e);
3044+
}
3045+
this.observer.onNext(res);
3046+
} else if (this.parent.isDone.filter(function (x, j) { return j !== i; }).every(identity)) {
3047+
this.observer.onCompleted();
3048+
}
3049+
};
3050+
CombineLatestObserver.prototype.error = function(e) { this.observer.onError(e); };
3051+
CombineLatestObserver.prototype.completed = function() {
3052+
this.parent.isDone[this.i] = true;
3053+
this.parent.isDone.every(identity) && this.observer.onCompleted();
3054+
};
3055+
3056+
return CombineLatestObserver;
3057+
}(AbstractObserver));
3058+
3059+
/**
3060+
* Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.
3061+
*
3062+
* @example
3063+
* 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });
3064+
* 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });
3065+
* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
3066+
*/
3067+
var combineLatest = Observable.combineLatest = function () {
3068+
for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }
3069+
var resultSelector = args.pop();
3070+
Array.isArray(args[0]) && (args = args[0]);
3071+
return new CombineLatestObservable(args, resultSelector);
30573072
};
30583073

30593074
/**

dist/rx.all.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rx.all.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)