rxjs-rails 2.2.19 → 2.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,7 +37,7 @@
37
37
  defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },
38
38
  defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },
39
39
  defaultError = Rx.helpers.defaultError = function (err) { throw err; },
40
- isPromise = Rx.helpers.isPromise = function (p) { return typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; },
40
+ isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; },
41
41
  asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); },
42
42
  not = Rx.helpers.not = function (a) { return !a; };
43
43
 
@@ -1208,25 +1208,25 @@
1208
1208
  return SchedulePeriodicRecursive;
1209
1209
  }());
1210
1210
 
1211
- /**
1212
- * Gets a scheduler that schedules work immediately on the current thread.
1213
- */
1214
- var immediateScheduler = Scheduler.immediate = (function () {
1211
+ /**
1212
+ * Gets a scheduler that schedules work immediately on the current thread.
1213
+ */
1214
+ var immediateScheduler = Scheduler.immediate = (function () {
1215
1215
 
1216
- function scheduleNow(state, action) { return action(this, state); }
1216
+ function scheduleNow(state, action) { return action(this, state); }
1217
1217
 
1218
- function scheduleRelative(state, dueTime, action) {
1219
- var dt = normalizeTime(dt);
1220
- while (dt - this.now() > 0) { }
1221
- return action(this, state);
1222
- }
1218
+ function scheduleRelative(state, dueTime, action) {
1219
+ var dt = normalizeTime(dt);
1220
+ while (dt - this.now() > 0) { }
1221
+ return action(this, state);
1222
+ }
1223
1223
 
1224
- function scheduleAbsolute(state, dueTime, action) {
1225
- return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);
1226
- }
1224
+ function scheduleAbsolute(state, dueTime, action) {
1225
+ return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);
1226
+ }
1227
1227
 
1228
- return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);
1229
- }());
1228
+ return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);
1229
+ }());
1230
1230
 
1231
1231
  /**
1232
1232
  * Gets a scheduler that schedules work as soon as possible on the current thread.
@@ -1290,143 +1290,143 @@
1290
1290
  return currentScheduler;
1291
1291
  }());
1292
1292
 
1293
-
1294
- var scheduleMethod, clearMethod = noop;
1295
- (function () {
1296
-
1297
- var reNative = RegExp('^' +
1298
- String(toString)
1299
- .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
1300
- .replace(/toString| for [^\]]+/g, '.*?') + '$'
1301
- );
1302
-
1303
- var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&
1304
- !reNative.test(setImmediate) && setImmediate,
1305
- clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' &&
1306
- !reNative.test(clearImmediate) && clearImmediate;
1307
-
1308
- function postMessageSupported () {
1309
- // Ensure not in a worker
1310
- if (!root.postMessage || root.importScripts) { return false; }
1311
- var isAsync = false,
1312
- oldHandler = root.onmessage;
1313
- // Test for async
1314
- root.onmessage = function () { isAsync = true; };
1315
- root.postMessage('','*');
1316
- root.onmessage = oldHandler;
1317
-
1318
- return isAsync;
1319
- }
1293
+
1294
+ var scheduleMethod, clearMethod = noop;
1295
+ (function () {
1320
1296
 
1321
- // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout
1322
- if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
1323
- scheduleMethod = process.nextTick;
1324
- } else if (typeof setImmediate === 'function') {
1325
- scheduleMethod = setImmediate;
1326
- clearMethod = clearImmediate;
1327
- } else if (postMessageSupported()) {
1328
- var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),
1329
- tasks = {},
1330
- taskId = 0;
1331
-
1332
- function onGlobalPostMessage(event) {
1333
- // Only if we're a match to avoid any other global events
1334
- if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {
1335
- var handleId = event.data.substring(MSG_PREFIX.length),
1336
- action = tasks[handleId];
1337
- action();
1338
- delete tasks[handleId];
1339
- }
1340
- }
1297
+ var reNative = RegExp('^' +
1298
+ String(toString)
1299
+ .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
1300
+ .replace(/toString| for [^\]]+/g, '.*?') + '$'
1301
+ );
1302
+
1303
+ var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&
1304
+ !reNative.test(setImmediate) && setImmediate,
1305
+ clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' &&
1306
+ !reNative.test(clearImmediate) && clearImmediate;
1307
+
1308
+ function postMessageSupported () {
1309
+ // Ensure not in a worker
1310
+ if (!root.postMessage || root.importScripts) { return false; }
1311
+ var isAsync = false,
1312
+ oldHandler = root.onmessage;
1313
+ // Test for async
1314
+ root.onmessage = function () { isAsync = true; };
1315
+ root.postMessage('','*');
1316
+ root.onmessage = oldHandler;
1317
+
1318
+ return isAsync;
1319
+ }
1341
1320
 
1342
- if (root.addEventListener) {
1343
- root.addEventListener('message', onGlobalPostMessage, false);
1344
- } else {
1345
- root.attachEvent('onmessage', onGlobalPostMessage, false);
1321
+ // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout
1322
+ if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
1323
+ scheduleMethod = process.nextTick;
1324
+ } else if (typeof setImmediate === 'function') {
1325
+ scheduleMethod = setImmediate;
1326
+ clearMethod = clearImmediate;
1327
+ } else if (postMessageSupported()) {
1328
+ var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),
1329
+ tasks = {},
1330
+ taskId = 0;
1331
+
1332
+ function onGlobalPostMessage(event) {
1333
+ // Only if we're a match to avoid any other global events
1334
+ if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {
1335
+ var handleId = event.data.substring(MSG_PREFIX.length),
1336
+ action = tasks[handleId];
1337
+ action();
1338
+ delete tasks[handleId];
1346
1339
  }
1340
+ }
1347
1341
 
1348
- scheduleMethod = function (action) {
1349
- var currentId = taskId++;
1350
- tasks[currentId] = action;
1351
- root.postMessage(MSG_PREFIX + currentId, '*');
1352
- };
1353
- } else if (!!root.MessageChannel) {
1354
- var channel = new root.MessageChannel(),
1355
- channelTasks = {},
1356
- channelTaskId = 0;
1357
-
1358
- channel.port1.onmessage = function (event) {
1359
- var id = event.data,
1360
- action = channelTasks[id];
1361
- action();
1362
- delete channelTasks[id];
1363
- };
1342
+ if (root.addEventListener) {
1343
+ root.addEventListener('message', onGlobalPostMessage, false);
1344
+ } else {
1345
+ root.attachEvent('onmessage', onGlobalPostMessage, false);
1346
+ }
1364
1347
 
1365
- scheduleMethod = function (action) {
1366
- var id = channelTaskId++;
1367
- channelTasks[id] = action;
1368
- channel.port2.postMessage(id);
1369
- };
1370
- } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {
1371
-
1372
- scheduleMethod = function (action) {
1373
- var scriptElement = root.document.createElement('script');
1374
- scriptElement.onreadystatechange = function () {
1375
- action();
1376
- scriptElement.onreadystatechange = null;
1377
- scriptElement.parentNode.removeChild(scriptElement);
1378
- scriptElement = null;
1379
- };
1380
- root.document.documentElement.appendChild(scriptElement);
1381
- };
1382
-
1383
- } else {
1384
- scheduleMethod = function (action) { return setTimeout(action, 0); };
1385
- clearMethod = clearTimeout;
1386
- }
1387
- }());
1348
+ scheduleMethod = function (action) {
1349
+ var currentId = taskId++;
1350
+ tasks[currentId] = action;
1351
+ root.postMessage(MSG_PREFIX + currentId, '*');
1352
+ };
1353
+ } else if (!!root.MessageChannel) {
1354
+ var channel = new root.MessageChannel(),
1355
+ channelTasks = {},
1356
+ channelTaskId = 0;
1357
+
1358
+ channel.port1.onmessage = function (event) {
1359
+ var id = event.data,
1360
+ action = channelTasks[id];
1361
+ action();
1362
+ delete channelTasks[id];
1363
+ };
1364
+
1365
+ scheduleMethod = function (action) {
1366
+ var id = channelTaskId++;
1367
+ channelTasks[id] = action;
1368
+ channel.port2.postMessage(id);
1369
+ };
1370
+ } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {
1371
+
1372
+ scheduleMethod = function (action) {
1373
+ var scriptElement = root.document.createElement('script');
1374
+ scriptElement.onreadystatechange = function () {
1375
+ action();
1376
+ scriptElement.onreadystatechange = null;
1377
+ scriptElement.parentNode.removeChild(scriptElement);
1378
+ scriptElement = null;
1379
+ };
1380
+ root.document.documentElement.appendChild(scriptElement);
1381
+ };
1388
1382
 
1389
- /**
1390
- * Gets a scheduler that schedules work via a timed callback based upon platform.
1391
- */
1392
- var timeoutScheduler = Scheduler.timeout = (function () {
1383
+ } else {
1384
+ scheduleMethod = function (action) { return setTimeout(action, 0); };
1385
+ clearMethod = clearTimeout;
1386
+ }
1387
+ }());
1393
1388
 
1394
- function scheduleNow(state, action) {
1395
- var scheduler = this,
1396
- disposable = new SingleAssignmentDisposable();
1397
- var id = scheduleMethod(function () {
1398
- if (!disposable.isDisposed) {
1399
- disposable.setDisposable(action(scheduler, state));
1400
- }
1401
- });
1402
- return new CompositeDisposable(disposable, disposableCreate(function () {
1403
- clearMethod(id);
1404
- }));
1405
- }
1389
+ /**
1390
+ * Gets a scheduler that schedules work via a timed callback based upon platform.
1391
+ */
1392
+ var timeoutScheduler = Scheduler.timeout = (function () {
1393
+
1394
+ function scheduleNow(state, action) {
1395
+ var scheduler = this,
1396
+ disposable = new SingleAssignmentDisposable();
1397
+ var id = scheduleMethod(function () {
1398
+ if (!disposable.isDisposed) {
1399
+ disposable.setDisposable(action(scheduler, state));
1400
+ }
1401
+ });
1402
+ return new CompositeDisposable(disposable, disposableCreate(function () {
1403
+ clearMethod(id);
1404
+ }));
1405
+ }
1406
1406
 
1407
- function scheduleRelative(state, dueTime, action) {
1408
- var scheduler = this,
1409
- dt = Scheduler.normalize(dueTime);
1410
- if (dt === 0) {
1411
- return scheduler.scheduleWithState(state, action);
1412
- }
1413
- var disposable = new SingleAssignmentDisposable();
1414
- var id = setTimeout(function () {
1415
- if (!disposable.isDisposed) {
1416
- disposable.setDisposable(action(scheduler, state));
1417
- }
1418
- }, dt);
1419
- return new CompositeDisposable(disposable, disposableCreate(function () {
1420
- clearTimeout(id);
1421
- }));
1407
+ function scheduleRelative(state, dueTime, action) {
1408
+ var scheduler = this,
1409
+ dt = Scheduler.normalize(dueTime);
1410
+ if (dt === 0) {
1411
+ return scheduler.scheduleWithState(state, action);
1422
1412
  }
1413
+ var disposable = new SingleAssignmentDisposable();
1414
+ var id = setTimeout(function () {
1415
+ if (!disposable.isDisposed) {
1416
+ disposable.setDisposable(action(scheduler, state));
1417
+ }
1418
+ }, dt);
1419
+ return new CompositeDisposable(disposable, disposableCreate(function () {
1420
+ clearTimeout(id);
1421
+ }));
1422
+ }
1423
1423
 
1424
- function scheduleAbsolute(state, dueTime, action) {
1425
- return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);
1426
- }
1424
+ function scheduleAbsolute(state, dueTime, action) {
1425
+ return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);
1426
+ }
1427
1427
 
1428
- return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);
1429
- })();
1428
+ return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);
1429
+ })();
1430
1430
 
1431
1431
  /** @private */
1432
1432
  var CatchScheduler = (function (_super) {
@@ -2325,28 +2325,26 @@
2325
2325
  return new AnonymousObservable(subscribe);
2326
2326
  };
2327
2327
 
2328
- /**
2329
- * Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.
2330
- *
2331
- * @example
2332
- * var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });
2333
- * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence.
2334
- * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.
2335
- */
2336
- var observableDefer = Observable.defer = function (observableFactory) {
2337
- return new AnonymousObservable(function (observer) {
2338
- var result;
2339
- try {
2340
- result = observableFactory();
2341
- } catch (e) {
2342
- return observableThrow(e).subscribe(observer);
2343
- }
2344
-
2345
- // Check if promise
2346
- isPromise(result) && (result = observableFromPromise(result));
2347
- return result.subscribe(observer);
2348
- });
2349
- };
2328
+ /**
2329
+ * Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.
2330
+ *
2331
+ * @example
2332
+ * var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });
2333
+ * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.
2334
+ * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.
2335
+ */
2336
+ var observableDefer = Observable.defer = function (observableFactory) {
2337
+ return new AnonymousObservable(function (observer) {
2338
+ var result;
2339
+ try {
2340
+ result = observableFactory();
2341
+ } catch (e) {
2342
+ return observableThrow(e).subscribe(observer);
2343
+ }
2344
+ isPromise(result) && (result = observableFromPromise(result));
2345
+ return result.subscribe(observer);
2346
+ });
2347
+ };
2350
2348
 
2351
2349
  /**
2352
2350
  * Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.
@@ -2594,125 +2592,128 @@
2594
2592
  });
2595
2593
  };
2596
2594
 
2597
- /**
2598
- * Propagates the observable sequence that reacts first.
2599
- * @param {Observable} rightSource Second observable sequence.
2600
- * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.
2601
- */
2602
- observableProto.amb = function (rightSource) {
2603
- var leftSource = this;
2604
- return new AnonymousObservable(function (observer) {
2605
-
2606
- var choice,
2607
- leftChoice = 'L', rightChoice = 'R',
2608
- leftSubscription = new SingleAssignmentDisposable(),
2609
- rightSubscription = new SingleAssignmentDisposable();
2610
-
2611
- function choiceL() {
2612
- if (!choice) {
2613
- choice = leftChoice;
2614
- rightSubscription.dispose();
2615
- }
2616
- }
2595
+ /**
2596
+ * Propagates the observable sequence or Promise that reacts first.
2597
+ * @param {Observable} rightSource Second observable sequence or Promise.
2598
+ * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.
2599
+ */
2600
+ observableProto.amb = function (rightSource) {
2601
+ var leftSource = this;
2602
+ return new AnonymousObservable(function (observer) {
2603
+ var choice,
2604
+ leftChoice = 'L', rightChoice = 'R',
2605
+ leftSubscription = new SingleAssignmentDisposable(),
2606
+ rightSubscription = new SingleAssignmentDisposable();
2617
2607
 
2618
- function choiceR() {
2619
- if (!choice) {
2620
- choice = rightChoice;
2621
- leftSubscription.dispose();
2622
- }
2623
- }
2608
+ isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));
2624
2609
 
2625
- leftSubscription.setDisposable(leftSource.subscribe(function (left) {
2626
- choiceL();
2627
- if (choice === leftChoice) {
2628
- observer.onNext(left);
2629
- }
2630
- }, function (err) {
2631
- choiceL();
2632
- if (choice === leftChoice) {
2633
- observer.onError(err);
2634
- }
2635
- }, function () {
2636
- choiceL();
2637
- if (choice === leftChoice) {
2638
- observer.onCompleted();
2639
- }
2640
- }));
2610
+ function choiceL() {
2611
+ if (!choice) {
2612
+ choice = leftChoice;
2613
+ rightSubscription.dispose();
2614
+ }
2615
+ }
2641
2616
 
2642
- rightSubscription.setDisposable(rightSource.subscribe(function (right) {
2643
- choiceR();
2644
- if (choice === rightChoice) {
2645
- observer.onNext(right);
2646
- }
2647
- }, function (err) {
2648
- choiceR();
2649
- if (choice === rightChoice) {
2650
- observer.onError(err);
2651
- }
2652
- }, function () {
2653
- choiceR();
2654
- if (choice === rightChoice) {
2655
- observer.onCompleted();
2656
- }
2657
- }));
2617
+ function choiceR() {
2618
+ if (!choice) {
2619
+ choice = rightChoice;
2620
+ leftSubscription.dispose();
2621
+ }
2622
+ }
2658
2623
 
2659
- return new CompositeDisposable(leftSubscription, rightSubscription);
2660
- });
2661
- };
2624
+ leftSubscription.setDisposable(leftSource.subscribe(function (left) {
2625
+ choiceL();
2626
+ if (choice === leftChoice) {
2627
+ observer.onNext(left);
2628
+ }
2629
+ }, function (err) {
2630
+ choiceL();
2631
+ if (choice === leftChoice) {
2632
+ observer.onError(err);
2633
+ }
2634
+ }, function () {
2635
+ choiceL();
2636
+ if (choice === leftChoice) {
2637
+ observer.onCompleted();
2638
+ }
2639
+ }));
2662
2640
 
2663
- /**
2664
- * Propagates the observable sequence that reacts first.
2665
- *
2666
- * @example
2667
- * var = Rx.Observable.amb(xs, ys, zs);
2668
- * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.
2669
- */
2670
- Observable.amb = function () {
2671
- var acc = observableNever(),
2672
- items = argsOrArray(arguments, 0);
2673
- function func(previous, current) {
2674
- return previous.amb(current);
2641
+ rightSubscription.setDisposable(rightSource.subscribe(function (right) {
2642
+ choiceR();
2643
+ if (choice === rightChoice) {
2644
+ observer.onNext(right);
2645
+ }
2646
+ }, function (err) {
2647
+ choiceR();
2648
+ if (choice === rightChoice) {
2649
+ observer.onError(err);
2675
2650
  }
2676
- for (var i = 0, len = items.length; i < len; i++) {
2677
- acc = func(acc, items[i]);
2651
+ }, function () {
2652
+ choiceR();
2653
+ if (choice === rightChoice) {
2654
+ observer.onCompleted();
2678
2655
  }
2679
- return acc;
2680
- };
2656
+ }));
2681
2657
 
2682
- function observableCatchHandler(source, handler) {
2683
- return new AnonymousObservable(function (observer) {
2684
- var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();
2685
- subscription.setDisposable(d1);
2686
- d1.setDisposable(source.subscribe(observer.onNext.bind(observer), function (exception) {
2687
- var d, result;
2688
- try {
2689
- result = handler(exception);
2690
- } catch (ex) {
2691
- observer.onError(ex);
2692
- return;
2693
- }
2694
- d = new SingleAssignmentDisposable();
2695
- subscription.setDisposable(d);
2696
- d.setDisposable(result.subscribe(observer));
2697
- }, observer.onCompleted.bind(observer)));
2698
- return subscription;
2699
- });
2658
+ return new CompositeDisposable(leftSubscription, rightSubscription);
2659
+ });
2660
+ };
2661
+
2662
+ /**
2663
+ * Propagates the observable sequence or Promise that reacts first.
2664
+ *
2665
+ * @example
2666
+ * var = Rx.Observable.amb(xs, ys, zs);
2667
+ * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.
2668
+ */
2669
+ Observable.amb = function () {
2670
+ var acc = observableNever(),
2671
+ items = argsOrArray(arguments, 0);
2672
+ function func(previous, current) {
2673
+ return previous.amb(current);
2700
2674
  }
2675
+ for (var i = 0, len = items.length; i < len; i++) {
2676
+ acc = func(acc, items[i]);
2677
+ }
2678
+ return acc;
2679
+ };
2701
2680
 
2702
- /**
2703
- * Continues an observable sequence that is terminated by an exception with the next observable sequence.
2704
- * @example
2705
- * 1 - xs.catchException(ys)
2706
- * 2 - xs.catchException(function (ex) { return ys(ex); })
2707
- * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.
2708
- * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.
2709
- */
2710
- observableProto['catch'] = observableProto.catchException = function (handlerOrSecond) {
2711
- if (typeof handlerOrSecond === 'function') {
2712
- return observableCatchHandler(this, handlerOrSecond);
2681
+ function observableCatchHandler(source, handler) {
2682
+ return new AnonymousObservable(function (observer) {
2683
+ var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();
2684
+ subscription.setDisposable(d1);
2685
+ d1.setDisposable(source.subscribe(observer.onNext.bind(observer), function (exception) {
2686
+ var d, result;
2687
+ try {
2688
+ result = handler(exception);
2689
+ } catch (ex) {
2690
+ observer.onError(ex);
2691
+ return;
2713
2692
  }
2714
- return observableCatch([this, handlerOrSecond]);
2715
- };
2693
+ isPromise(result) && (result = observableFromPromise(result));
2694
+
2695
+ d = new SingleAssignmentDisposable();
2696
+ subscription.setDisposable(d);
2697
+ d.setDisposable(result.subscribe(observer));
2698
+ }, observer.onCompleted.bind(observer)));
2699
+
2700
+ return subscription;
2701
+ });
2702
+ }
2703
+
2704
+ /**
2705
+ * Continues an observable sequence that is terminated by an exception with the next observable sequence.
2706
+ * @example
2707
+ * 1 - xs.catchException(ys)
2708
+ * 2 - xs.catchException(function (ex) { return ys(ex); })
2709
+ * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.
2710
+ * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.
2711
+ */
2712
+ observableProto['catch'] = observableProto.catchException = function (handlerOrSecond) {
2713
+ return typeof handlerOrSecond === 'function' ?
2714
+ observableCatchHandler(this, handlerOrSecond) :
2715
+ observableCatch([this, handlerOrSecond]);
2716
+ };
2716
2717
 
2717
2718
  /**
2718
2719
  * Continues an observable sequence that is terminated by an exception with the next observable sequence.
@@ -2727,87 +2728,89 @@
2727
2728
  return enumerableFor(items).catchException();
2728
2729
  };
2729
2730
 
2730
- /**
2731
- * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
2732
- * This can be in the form of an argument list of observables or an array.
2733
- *
2734
- * @example
2735
- * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });
2736
- * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });
2737
- * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
2738
- */
2739
- observableProto.combineLatest = function () {
2740
- var args = slice.call(arguments);
2741
- if (Array.isArray(args[0])) {
2742
- args[0].unshift(this);
2743
- } else {
2744
- args.unshift(this);
2745
- }
2746
- return combineLatest.apply(this, args);
2747
- };
2748
-
2749
- /**
2750
- * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
2751
- *
2752
- * @example
2753
- * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });
2754
- * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });
2755
- * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
2756
- */
2757
- var combineLatest = Observable.combineLatest = function () {
2758
- var args = slice.call(arguments), resultSelector = args.pop();
2759
-
2760
- if (Array.isArray(args[0])) {
2761
- args = args[0];
2762
- }
2731
+ /**
2732
+ * 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.
2733
+ * This can be in the form of an argument list of observables or an array.
2734
+ *
2735
+ * @example
2736
+ * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });
2737
+ * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });
2738
+ * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
2739
+ */
2740
+ observableProto.combineLatest = function () {
2741
+ var args = slice.call(arguments);
2742
+ if (Array.isArray(args[0])) {
2743
+ args[0].unshift(this);
2744
+ } else {
2745
+ args.unshift(this);
2746
+ }
2747
+ return combineLatest.apply(this, args);
2748
+ };
2763
2749
 
2764
- return new AnonymousObservable(function (observer) {
2765
- var falseFactory = function () { return false; },
2766
- n = args.length,
2767
- hasValue = arrayInitialize(n, falseFactory),
2768
- hasValueAll = false,
2769
- isDone = arrayInitialize(n, falseFactory),
2770
- values = new Array(n);
2750
+ /**
2751
+ * 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.
2752
+ *
2753
+ * @example
2754
+ * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });
2755
+ * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });
2756
+ * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
2757
+ */
2758
+ var combineLatest = Observable.combineLatest = function () {
2759
+ var args = slice.call(arguments), resultSelector = args.pop();
2760
+
2761
+ if (Array.isArray(args[0])) {
2762
+ args = args[0];
2763
+ }
2771
2764
 
2772
- function next(i) {
2773
- var res;
2774
- hasValue[i] = true;
2775
- if (hasValueAll || (hasValueAll = hasValue.every(identity))) {
2776
- try {
2777
- res = resultSelector.apply(null, values);
2778
- } catch (ex) {
2779
- observer.onError(ex);
2780
- return;
2781
- }
2782
- observer.onNext(res);
2783
- } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {
2784
- observer.onCompleted();
2785
- }
2786
- }
2765
+ return new AnonymousObservable(function (observer) {
2766
+ var falseFactory = function () { return false; },
2767
+ n = args.length,
2768
+ hasValue = arrayInitialize(n, falseFactory),
2769
+ hasValueAll = false,
2770
+ isDone = arrayInitialize(n, falseFactory),
2771
+ values = new Array(n);
2772
+
2773
+ function next(i) {
2774
+ var res;
2775
+ hasValue[i] = true;
2776
+ if (hasValueAll || (hasValueAll = hasValue.every(identity))) {
2777
+ try {
2778
+ res = resultSelector.apply(null, values);
2779
+ } catch (ex) {
2780
+ observer.onError(ex);
2781
+ return;
2782
+ }
2783
+ observer.onNext(res);
2784
+ } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {
2785
+ observer.onCompleted();
2786
+ }
2787
+ }
2787
2788
 
2788
- function done (i) {
2789
- isDone[i] = true;
2790
- if (isDone.every(identity)) {
2791
- observer.onCompleted();
2792
- }
2793
- }
2789
+ function done (i) {
2790
+ isDone[i] = true;
2791
+ if (isDone.every(identity)) {
2792
+ observer.onCompleted();
2793
+ }
2794
+ }
2794
2795
 
2795
- var subscriptions = new Array(n);
2796
- for (var idx = 0; idx < n; idx++) {
2797
- (function (i) {
2798
- subscriptions[i] = new SingleAssignmentDisposable();
2799
- subscriptions[i].setDisposable(args[i].subscribe(function (x) {
2800
- values[i] = x;
2801
- next(i);
2802
- }, observer.onError.bind(observer), function () {
2803
- done(i);
2804
- }));
2805
- }(idx));
2806
- }
2796
+ var subscriptions = new Array(n);
2797
+ for (var idx = 0; idx < n; idx++) {
2798
+ (function (i) {
2799
+ var source = args[i], sad = new SingleAssignmentDisposable();
2800
+ isPromise(source) && (source = observableFromPromise(source));
2801
+ sad.setDisposable(source.subscribe(function (x) {
2802
+ values[i] = x;
2803
+ next(i);
2804
+ }, observer.onError.bind(observer), function () {
2805
+ done(i);
2806
+ }));
2807
+ subscriptions[i] = sad;
2808
+ }(idx));
2809
+ }
2807
2810
 
2808
- return new CompositeDisposable(subscriptions);
2809
- });
2810
- };
2811
+ return new CompositeDisposable(subscriptions);
2812
+ });
2813
+ };
2811
2814
 
2812
2815
  /**
2813
2816
  * Concatenates all the observable sequences. This takes in either an array or variable arguments to concatenate.
@@ -2966,48 +2969,49 @@
2966
2969
  });
2967
2970
  };
2968
2971
 
2969
- /**
2970
- * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.
2971
- * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.
2972
- * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.
2973
- */
2974
- observableProto.onErrorResumeNext = function (second) {
2975
- if (!second) {
2976
- throw new Error('Second observable is required');
2977
- }
2978
- return onErrorResumeNext([this, second]);
2979
- };
2972
+ /**
2973
+ * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.
2974
+ * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.
2975
+ * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.
2976
+ */
2977
+ observableProto.onErrorResumeNext = function (second) {
2978
+ if (!second) {
2979
+ throw new Error('Second observable is required');
2980
+ }
2981
+ return onErrorResumeNext([this, second]);
2982
+ };
2980
2983
 
2981
- /**
2982
- * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.
2983
- *
2984
- * @example
2985
- * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);
2986
- * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);
2987
- * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.
2988
- */
2989
- var onErrorResumeNext = Observable.onErrorResumeNext = function () {
2990
- var sources = argsOrArray(arguments, 0);
2991
- return new AnonymousObservable(function (observer) {
2992
- var pos = 0, subscription = new SerialDisposable(),
2993
- cancelable = immediateScheduler.scheduleRecursive(function (self) {
2994
- var current, d;
2995
- if (pos < sources.length) {
2996
- current = sources[pos++];
2997
- d = new SingleAssignmentDisposable();
2998
- subscription.setDisposable(d);
2999
- d.setDisposable(current.subscribe(observer.onNext.bind(observer), function () {
3000
- self();
3001
- }, function () {
3002
- self();
3003
- }));
3004
- } else {
3005
- observer.onCompleted();
3006
- }
3007
- });
3008
- return new CompositeDisposable(subscription, cancelable);
3009
- });
3010
- };
2984
+ /**
2985
+ * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.
2986
+ *
2987
+ * @example
2988
+ * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);
2989
+ * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);
2990
+ * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.
2991
+ */
2992
+ var onErrorResumeNext = Observable.onErrorResumeNext = function () {
2993
+ var sources = argsOrArray(arguments, 0);
2994
+ return new AnonymousObservable(function (observer) {
2995
+ var pos = 0, subscription = new SerialDisposable(),
2996
+ cancelable = immediateScheduler.scheduleRecursive(function (self) {
2997
+ var current, d;
2998
+ if (pos < sources.length) {
2999
+ current = sources[pos++];
3000
+ isPromise(current) && (current = observableFromPromise(current));
3001
+ d = new SingleAssignmentDisposable();
3002
+ subscription.setDisposable(d);
3003
+ d.setDisposable(current.subscribe(observer.onNext.bind(observer), function () {
3004
+ self();
3005
+ }, function () {
3006
+ self();
3007
+ }));
3008
+ } else {
3009
+ observer.onCompleted();
3010
+ }
3011
+ });
3012
+ return new CompositeDisposable(subscription, cancelable);
3013
+ });
3014
+ };
3011
3015
 
3012
3016
  /**
3013
3017
  * Returns the values from the source observable sequence only after the other observable sequence produces a value.
@@ -3103,86 +3107,88 @@
3103
3107
  });
3104
3108
  };
3105
3109
 
3106
- function zipArray(second, resultSelector) {
3107
- var first = this;
3108
- return new AnonymousObservable(function (observer) {
3109
- var index = 0, len = second.length;
3110
- return first.subscribe(function (left) {
3111
- if (index < len) {
3112
- var right = second[index++], result;
3113
- try {
3114
- result = resultSelector(left, right);
3115
- } catch (e) {
3116
- observer.onError(e);
3117
- return;
3118
- }
3119
- observer.onNext(result);
3120
- } else {
3121
- observer.onCompleted();
3122
- }
3123
- }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3124
- });
3125
- }
3110
+ function zipArray(second, resultSelector) {
3111
+ var first = this;
3112
+ return new AnonymousObservable(function (observer) {
3113
+ var index = 0, len = second.length;
3114
+ return first.subscribe(function (left) {
3115
+ if (index < len) {
3116
+ var right = second[index++], result;
3117
+ try {
3118
+ result = resultSelector(left, right);
3119
+ } catch (e) {
3120
+ observer.onError(e);
3121
+ return;
3122
+ }
3123
+ observer.onNext(result);
3124
+ } else {
3125
+ observer.onCompleted();
3126
+ }
3127
+ }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3128
+ });
3129
+ }
3126
3130
 
3127
- /**
3128
- * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.
3129
- * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the sources.
3130
- *
3131
- * @example
3132
- * 1 - res = obs1.zip(obs2, fn);
3133
- * 1 - res = x1.zip([1,2,3], fn);
3134
- * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
3135
- */
3136
- observableProto.zip = function () {
3137
- if (Array.isArray(arguments[0])) {
3138
- return zipArray.apply(this, arguments);
3131
+ /**
3132
+ * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.
3133
+ * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the sources.
3134
+ *
3135
+ * @example
3136
+ * 1 - res = obs1.zip(obs2, fn);
3137
+ * 1 - res = x1.zip([1,2,3], fn);
3138
+ * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.
3139
+ */
3140
+ observableProto.zip = function () {
3141
+ if (Array.isArray(arguments[0])) {
3142
+ return zipArray.apply(this, arguments);
3143
+ }
3144
+ var parent = this, sources = slice.call(arguments), resultSelector = sources.pop();
3145
+ sources.unshift(parent);
3146
+ return new AnonymousObservable(function (observer) {
3147
+ var n = sources.length,
3148
+ queues = arrayInitialize(n, function () { return []; }),
3149
+ isDone = arrayInitialize(n, function () { return false; });
3150
+
3151
+ function next(i) {
3152
+ var res, queuedValues;
3153
+ if (queues.every(function (x) { return x.length > 0; })) {
3154
+ try {
3155
+ queuedValues = queues.map(function (x) { return x.shift(); });
3156
+ res = resultSelector.apply(parent, queuedValues);
3157
+ } catch (ex) {
3158
+ observer.onError(ex);
3159
+ return;
3160
+ }
3161
+ observer.onNext(res);
3162
+ } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {
3163
+ observer.onCompleted();
3139
3164
  }
3140
- var parent = this, sources = slice.call(arguments), resultSelector = sources.pop();
3141
- sources.unshift(parent);
3142
- return new AnonymousObservable(function (observer) {
3143
- var n = sources.length,
3144
- queues = arrayInitialize(n, function () { return []; }),
3145
- isDone = arrayInitialize(n, function () { return false; });
3146
-
3147
- var next = function (i) {
3148
- var res, queuedValues;
3149
- if (queues.every(function (x) { return x.length > 0; })) {
3150
- try {
3151
- queuedValues = queues.map(function (x) { return x.shift(); });
3152
- res = resultSelector.apply(parent, queuedValues);
3153
- } catch (ex) {
3154
- observer.onError(ex);
3155
- return;
3156
- }
3157
- observer.onNext(res);
3158
- } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {
3159
- observer.onCompleted();
3160
- }
3161
- };
3165
+ };
3162
3166
 
3163
- function done(i) {
3164
- isDone[i] = true;
3165
- if (isDone.every(function (x) { return x; })) {
3166
- observer.onCompleted();
3167
- }
3168
- }
3167
+ function done(i) {
3168
+ isDone[i] = true;
3169
+ if (isDone.every(function (x) { return x; })) {
3170
+ observer.onCompleted();
3171
+ }
3172
+ }
3169
3173
 
3170
- var subscriptions = new Array(n);
3171
- for (var idx = 0; idx < n; idx++) {
3172
- (function (i) {
3173
- subscriptions[i] = new SingleAssignmentDisposable();
3174
- subscriptions[i].setDisposable(sources[i].subscribe(function (x) {
3175
- queues[i].push(x);
3176
- next(i);
3177
- }, observer.onError.bind(observer), function () {
3178
- done(i);
3179
- }));
3180
- })(idx);
3181
- }
3174
+ var subscriptions = new Array(n);
3175
+ for (var idx = 0; idx < n; idx++) {
3176
+ (function (i) {
3177
+ var source = sources[i], sad = new SingleAssignmentDisposable();
3178
+ isPromise(source) && (source = observableFromPromise(source));
3179
+ sad.setDisposable(source.subscribe(function (x) {
3180
+ queues[i].push(x);
3181
+ next(i);
3182
+ }, observer.onError.bind(observer), function () {
3183
+ done(i);
3184
+ }));
3185
+ subscriptions[i] = sad;
3186
+ })(idx);
3187
+ }
3182
3188
 
3183
- return new CompositeDisposable(subscriptions);
3184
- });
3185
- };
3189
+ return new CompositeDisposable(subscriptions);
3190
+ });
3191
+ };
3186
3192
  /**
3187
3193
  * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
3188
3194
  * @param arguments Observable sources.