rxjs-rails 2.3.14 → 2.3.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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rxjs/rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/rx.aggregates.js +325 -370
  4. data/vendor/assets/javascripts/rx.aggregates.min.js +1 -1
  5. data/vendor/assets/javascripts/rx.all.compat.js +1115 -930
  6. data/vendor/assets/javascripts/rx.all.compat.min.js +4 -3
  7. data/vendor/assets/javascripts/rx.all.js +1113 -928
  8. data/vendor/assets/javascripts/rx.all.min.js +3 -3
  9. data/vendor/assets/javascripts/rx.async.compat.js +16 -20
  10. data/vendor/assets/javascripts/rx.async.compat.min.js +1 -1
  11. data/vendor/assets/javascripts/rx.async.js +14 -18
  12. data/vendor/assets/javascripts/rx.async.min.js +1 -1
  13. data/vendor/assets/javascripts/rx.backpressure.js +26 -10
  14. data/vendor/assets/javascripts/rx.backpressure.min.js +1 -1
  15. data/vendor/assets/javascripts/rx.binding.js +2 -14
  16. data/vendor/assets/javascripts/rx.binding.min.js +1 -1
  17. data/vendor/assets/javascripts/rx.coincidence.js +13 -13
  18. data/vendor/assets/javascripts/rx.coincidence.min.js +1 -1
  19. data/vendor/assets/javascripts/rx.compat.js +586 -378
  20. data/vendor/assets/javascripts/rx.compat.min.js +2 -2
  21. data/vendor/assets/javascripts/rx.experimental.js +37 -29
  22. data/vendor/assets/javascripts/rx.experimental.min.js +1 -1
  23. data/vendor/assets/javascripts/rx.js +586 -378
  24. data/vendor/assets/javascripts/rx.lite.compat.js +632 -394
  25. data/vendor/assets/javascripts/rx.lite.compat.min.js +2 -2
  26. data/vendor/assets/javascripts/rx.lite.extras.js +29 -25
  27. data/vendor/assets/javascripts/rx.lite.extras.min.js +1 -1
  28. data/vendor/assets/javascripts/rx.lite.js +630 -392
  29. data/vendor/assets/javascripts/rx.lite.min.js +2 -2
  30. data/vendor/assets/javascripts/rx.min.js +2 -2
  31. data/vendor/assets/javascripts/rx.sorting.js +72 -0
  32. data/vendor/assets/javascripts/rx.sorting.min.js +3 -0
  33. data/vendor/assets/javascripts/rx.testing.js +116 -83
  34. data/vendor/assets/javascripts/rx.testing.min.js +1 -1
  35. data/vendor/assets/javascripts/rx.time.js +127 -101
  36. data/vendor/assets/javascripts/rx.time.min.js +1 -1
  37. metadata +4 -2
@@ -24,7 +24,7 @@
24
24
  var Rx = {
25
25
  internals: {},
26
26
  config: {
27
- Promise: root.Promise // Detect if promise exists
27
+ Promise: root.Promise,
28
28
  },
29
29
  helpers: { }
30
30
  };
@@ -66,6 +66,104 @@
66
66
  var objectDisposed = 'Object has been disposed';
67
67
  function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } }
68
68
 
69
+ Rx.config.longStackSupport = false;
70
+ var hasStacks = false;
71
+ try {
72
+ throw new Error();
73
+ } catch (e) {
74
+ hasStacks = !!e.stack;
75
+ }
76
+
77
+ // All code after this point will be filtered from stack traces reported by RxJS
78
+ var rStartingLine = captureLine(), rFileName;
79
+
80
+ var STACK_JUMP_SEPARATOR = "From previous event:";
81
+
82
+ function makeStackTraceLong(error, observable) {
83
+ // If possible, transform the error stack trace by removing Node and RxJS
84
+ // cruft, then concatenating with the stack trace of `observable`.
85
+ if (hasStacks &&
86
+ observable.stack &&
87
+ typeof error === "object" &&
88
+ error !== null &&
89
+ error.stack &&
90
+ error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1
91
+ ) {
92
+ var stacks = [];
93
+ for (var o = observable; !!o; o = o.source) {
94
+ if (o.stack) {
95
+ stacks.unshift(o.stack);
96
+ }
97
+ }
98
+ stacks.unshift(error.stack);
99
+
100
+ var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
101
+ error.stack = filterStackString(concatedStacks);
102
+ }
103
+ }
104
+
105
+ function filterStackString(stackString) {
106
+ var lines = stackString.split("\n"),
107
+ desiredLines = [];
108
+ for (var i = 0, len = lines.length; i < len; i++) {
109
+ var line = lines[i];
110
+
111
+ if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
112
+ desiredLines.push(line);
113
+ }
114
+ }
115
+ return desiredLines.join("\n");
116
+ }
117
+
118
+ function isInternalFrame(stackLine) {
119
+ var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
120
+ if (!fileNameAndLineNumber) {
121
+ return false;
122
+ }
123
+ var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];
124
+
125
+ console.log(rFileName, rStartingLine, rEndingLine);
126
+
127
+ return fileName === rFileName &&
128
+ lineNumber >= rStartingLine &&
129
+ lineNumber <= rEndingLine;
130
+ }
131
+
132
+ function isNodeFrame(stackLine) {
133
+ return stackLine.indexOf("(module.js:") !== -1 ||
134
+ stackLine.indexOf("(node.js:") !== -1;
135
+ }
136
+
137
+ function captureLine() {
138
+ if (!hasStacks) { return; }
139
+
140
+ try {
141
+ throw new Error();
142
+ } catch (e) {
143
+ var lines = e.stack.split("\n");
144
+ var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
145
+ var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
146
+ if (!fileNameAndLineNumber) { return; }
147
+
148
+ rFileName = fileNameAndLineNumber[0];
149
+ return fileNameAndLineNumber[1];
150
+ }
151
+ }
152
+
153
+ function getFileNameAndLineNumber(stackLine) {
154
+ // Named functions: "at functionName (filename:lineNumber:columnNumber)"
155
+ var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
156
+ if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }
157
+
158
+ // Anonymous functions: "at filename:lineNumber:columnNumber"
159
+ var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
160
+ if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }
161
+
162
+ // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
163
+ var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
164
+ if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }
165
+ }
166
+
69
167
  // Shim in iterator support
70
168
  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||
71
169
  '_es6shim_iterator_';
@@ -76,7 +174,21 @@
76
174
 
77
175
  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };
78
176
 
79
- Rx.iterator = $iterator$;
177
+ var isIterable = Rx.helpers.isIterable = function (o) {
178
+ return o[$iterator$] !== undefined;
179
+ }
180
+
181
+ var isArrayLike = Rx.helpers.isArrayLike = function (o) {
182
+ return o && o.length !== undefined;
183
+ }
184
+
185
+ Rx.helpers.iterator = $iterator$;
186
+
187
+ var deprecate = Rx.helpers.deprecate = function (name, alternative) {
188
+ /*if (typeof console !== "undefined" && typeof console.warn === "function") {
189
+ console.warn(name + ' is deprecated, use ' + alternative + ' instead.', new Error('').stack);
190
+ }*/
191
+ }
80
192
 
81
193
  /** `Object#toString` result shortcuts */
82
194
  var argsClass = '[object Arguments]',
@@ -93,15 +205,16 @@
93
205
  var toString = Object.prototype.toString,
94
206
  hasOwnProperty = Object.prototype.hasOwnProperty,
95
207
  supportsArgsClass = toString.call(arguments) == argsClass, // For less <IE9 && FF<4
96
- suportNodeClass,
208
+ supportNodeClass,
97
209
  errorProto = Error.prototype,
98
210
  objectProto = Object.prototype,
211
+ stringProto = String.prototype,
99
212
  propertyIsEnumerable = objectProto.propertyIsEnumerable;
100
213
 
101
214
  try {
102
- suportNodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));
103
- } catch(e) {
104
- suportNodeClass = true;
215
+ supportNodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));
216
+ } catch (e) {
217
+ supportNodeClass = true;
105
218
  }
106
219
 
107
220
  var shadowedProps = [
@@ -206,7 +319,7 @@
206
319
  return typeof value.toString != 'function' && typeof (value + '') == 'string';
207
320
  }
208
321
 
209
- function isArguments(value) {
322
+ var isArguments = function(value) {
210
323
  return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;
211
324
  }
212
325
 
@@ -262,10 +375,10 @@
262
375
 
263
376
  case numberClass:
264
377
  // treat `NaN` vs. `NaN` as equal
265
- return (a != +a)
266
- ? b != +b
378
+ return (a != +a) ?
379
+ b != +b :
267
380
  // but treat `-0` vs. `+0` as not equal
268
- : (a == 0 ? (1 / a == 1 / b) : a == +b);
381
+ (a == 0 ? (1 / a == 1 / b) : a == +b);
269
382
 
270
383
  case regexpClass:
271
384
  case stringClass:
@@ -1175,15 +1288,13 @@ if (!Array.prototype.forEach) {
1175
1288
  return SchedulePeriodicRecursive;
1176
1289
  }());
1177
1290
 
1178
- /**
1179
- * Gets a scheduler that schedules work immediately on the current thread.
1180
- */
1291
+ /** Gets a scheduler that schedules work immediately on the current thread. */
1181
1292
  var immediateScheduler = Scheduler.immediate = (function () {
1182
1293
 
1183
1294
  function scheduleNow(state, action) { return action(this, state); }
1184
1295
 
1185
1296
  function scheduleRelative(state, dueTime, action) {
1186
- var dt = normalizeTime(dt);
1297
+ var dt = normalizeTime(dueTime);
1187
1298
  while (dt - this.now() > 0) { }
1188
1299
  return action(this, state);
1189
1300
  }
@@ -1297,24 +1408,24 @@ if (!Array.prototype.forEach) {
1297
1408
  oldHandler = root.onmessage;
1298
1409
  // Test for async
1299
1410
  root.onmessage = function () { isAsync = true; };
1300
- root.postMessage('','*');
1411
+ root.postMessage('', '*');
1301
1412
  root.onmessage = oldHandler;
1302
1413
 
1303
1414
  return isAsync;
1304
1415
  }
1305
1416
 
1306
- // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout
1307
- if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
1308
- scheduleMethod = process.nextTick;
1309
- } else if (typeof setImmediate === 'function') {
1417
+ // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout
1418
+ if (typeof setImmediate === 'function') {
1310
1419
  scheduleMethod = setImmediate;
1311
1420
  clearMethod = clearImmediate;
1421
+ } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
1422
+ scheduleMethod = process.nextTick;
1312
1423
  } else if (postMessageSupported()) {
1313
1424
  var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),
1314
1425
  tasks = {},
1315
1426
  taskId = 0;
1316
1427
 
1317
- function onGlobalPostMessage(event) {
1428
+ var onGlobalPostMessage = function (event) {
1318
1429
  // Only if we're a match to avoid any other global events
1319
1430
  if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {
1320
1431
  var handleId = event.data.substring(MSG_PREFIX.length),
@@ -1615,8 +1726,8 @@ if (!Array.prototype.forEach) {
1615
1726
  var e;
1616
1727
  try {
1617
1728
  e = sources[$iterator$]();
1618
- } catch(err) {
1619
- observer.onError();
1729
+ } catch (err) {
1730
+ observer.onError(err);
1620
1731
  return;
1621
1732
  }
1622
1733
 
@@ -1657,14 +1768,14 @@ if (!Array.prototype.forEach) {
1657
1768
  });
1658
1769
  };
1659
1770
 
1660
- Enumerable.prototype.catchException = function () {
1771
+ Enumerable.prototype.catchError = function () {
1661
1772
  var sources = this;
1662
1773
  return new AnonymousObservable(function (observer) {
1663
1774
  var e;
1664
1775
  try {
1665
1776
  e = sources[$iterator$]();
1666
- } catch(err) {
1667
- observer.onError();
1777
+ } catch (err) {
1778
+ observer.onError(err);
1668
1779
  return;
1669
1780
  }
1670
1781
 
@@ -1802,7 +1913,7 @@ if (!Array.prototype.forEach) {
1802
1913
  * @param {Scheduler} scheduler Scheduler to schedule observer messages on.
1803
1914
  * @returns {Observer} Observer whose messages are scheduled on the given scheduler.
1804
1915
  */
1805
- Observer.notifyOn = function (scheduler) {
1916
+ Observer.prototype.notifyOn = function (scheduler) {
1806
1917
  return new ObserveOnObserver(scheduler, this);
1807
1918
  };
1808
1919
 
@@ -1983,23 +2094,17 @@ if (!Array.prototype.forEach) {
1983
2094
 
1984
2095
  ScheduledObserver.prototype.next = function (value) {
1985
2096
  var self = this;
1986
- this.queue.push(function () {
1987
- self.observer.onNext(value);
1988
- });
2097
+ this.queue.push(function () { self.observer.onNext(value); });
1989
2098
  };
1990
2099
 
1991
- ScheduledObserver.prototype.error = function (err) {
2100
+ ScheduledObserver.prototype.error = function (e) {
1992
2101
  var self = this;
1993
- this.queue.push(function () {
1994
- self.observer.onError(err);
1995
- });
2102
+ this.queue.push(function () { self.observer.onError(e); });
1996
2103
  };
1997
2104
 
1998
2105
  ScheduledObserver.prototype.completed = function () {
1999
2106
  var self = this;
2000
- this.queue.push(function () {
2001
- self.observer.onCompleted();
2002
- });
2107
+ this.queue.push(function () { self.observer.onCompleted(); });
2003
2108
  };
2004
2109
 
2005
2110
  ScheduledObserver.prototype.ensureActive = function () {
@@ -2040,8 +2145,9 @@ if (!Array.prototype.forEach) {
2040
2145
  var ObserveOnObserver = (function (__super__) {
2041
2146
  inherits(ObserveOnObserver, __super__);
2042
2147
 
2043
- function ObserveOnObserver() {
2044
- __super__.apply(this, arguments);
2148
+ function ObserveOnObserver(scheduler, observer, cancel) {
2149
+ __super__.call(this, scheduler, observer);
2150
+ this._cancel = cancel;
2045
2151
  }
2046
2152
 
2047
2153
  ObserveOnObserver.prototype.next = function (value) {
@@ -2059,6 +2165,12 @@ if (!Array.prototype.forEach) {
2059
2165
  this.ensureActive();
2060
2166
  };
2061
2167
 
2168
+ ObserveOnObserver.prototype.dispose = function () {
2169
+ __super__.prototype.dispose.call(this);
2170
+ this._cancel && this._cancel.dispose();
2171
+ this._cancel = null;
2172
+ };
2173
+
2062
2174
  return ObserveOnObserver;
2063
2175
  })(ScheduledObserver);
2064
2176
 
@@ -2070,6 +2182,24 @@ if (!Array.prototype.forEach) {
2070
2182
  var Observable = Rx.Observable = (function () {
2071
2183
 
2072
2184
  function Observable(subscribe) {
2185
+ if (Rx.config.longStackSupport && hasStacks) {
2186
+ try {
2187
+ throw new Error();
2188
+ } catch (e) {
2189
+ this.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
2190
+ }
2191
+
2192
+ var self = this;
2193
+ this._subscribe = function (observer) {
2194
+ observer.onError = function (err) {
2195
+ makeStackTraceLong(self, err);
2196
+ observer.onError(err);
2197
+ };
2198
+
2199
+ subscribe(observer);
2200
+ };
2201
+ }
2202
+
2073
2203
  this._subscribe = subscribe;
2074
2204
  }
2075
2205
 
@@ -2134,7 +2264,7 @@ if (!Array.prototype.forEach) {
2134
2264
  var source = this;
2135
2265
  return new AnonymousObservable(function (observer) {
2136
2266
  return source.subscribe(new ObserveOnObserver(scheduler, observer));
2137
- });
2267
+ }, source);
2138
2268
  };
2139
2269
 
2140
2270
  /**
@@ -2156,7 +2286,7 @@ if (!Array.prototype.forEach) {
2156
2286
  d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer)));
2157
2287
  }));
2158
2288
  return d;
2159
- });
2289
+ }, source);
2160
2290
  };
2161
2291
 
2162
2292
  /**
@@ -2170,10 +2300,8 @@ if (!Array.prototype.forEach) {
2170
2300
 
2171
2301
  promise.then(
2172
2302
  function (value) {
2173
- if (!subject.isDisposed) {
2174
- subject.onNext(value);
2175
- subject.onCompleted();
2176
- }
2303
+ subject.onNext(value);
2304
+ subject.onCompleted();
2177
2305
  },
2178
2306
  subject.onError.bind(subject));
2179
2307
 
@@ -2209,36 +2337,34 @@ if (!Array.prototype.forEach) {
2209
2337
  };
2210
2338
 
2211
2339
  /**
2212
- * Creates a list from an observable sequence.
2213
- * @returns An observable sequence containing a single element with a list containing all the elements of the source sequence.
2340
+ * Creates an array from an observable sequence.
2341
+ * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.
2214
2342
  */
2215
2343
  observableProto.toArray = function () {
2216
- var self = this;
2344
+ var source = this;
2217
2345
  return new AnonymousObservable(function(observer) {
2218
2346
  var arr = [];
2219
- return self.subscribe(
2347
+ return source.subscribe(
2220
2348
  arr.push.bind(arr),
2221
2349
  observer.onError.bind(observer),
2222
2350
  function () {
2223
2351
  observer.onNext(arr);
2224
2352
  observer.onCompleted();
2225
2353
  });
2226
- });
2354
+ }, source);
2227
2355
  };
2228
2356
 
2229
2357
  /**
2230
2358
  * Creates an observable sequence from a specified subscribe method implementation.
2231
- *
2232
2359
  * @example
2233
2360
  * var res = Rx.Observable.create(function (observer) { return function () { } );
2234
2361
  * var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );
2235
2362
  * var res = Rx.Observable.create(function (observer) { } );
2236
- *
2237
2363
  * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.
2238
2364
  * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.
2239
2365
  */
2240
- Observable.create = Observable.createWithDisposable = function (subscribe) {
2241
- return new AnonymousObservable(subscribe);
2366
+ Observable.create = Observable.createWithDisposable = function (subscribe, parent) {
2367
+ return new AnonymousObservable(subscribe, parent);
2242
2368
  };
2243
2369
 
2244
2370
  /**
@@ -2282,6 +2408,60 @@ if (!Array.prototype.forEach) {
2282
2408
 
2283
2409
  var maxSafeInteger = Math.pow(2, 53) - 1;
2284
2410
 
2411
+ function StringIterable(str) {
2412
+ this._s = s;
2413
+ }
2414
+
2415
+ StringIterable.prototype[$iterator$] = function () {
2416
+ return new StringIterator(this._s);
2417
+ };
2418
+
2419
+ function StringIterator(str) {
2420
+ this._s = s;
2421
+ this._l = s.length;
2422
+ this._i = 0;
2423
+ }
2424
+
2425
+ StringIterator.prototype[$iterator$] = function () {
2426
+ return this;
2427
+ };
2428
+
2429
+ StringIterator.prototype.next = function () {
2430
+ if (this._i < this._l) {
2431
+ var val = this._s.charAt(this._i++);
2432
+ return { done: false, value: val };
2433
+ } else {
2434
+ return doneEnumerator;
2435
+ }
2436
+ };
2437
+
2438
+ function ArrayIterable(a) {
2439
+ this._a = a;
2440
+ }
2441
+
2442
+ ArrayIterable.prototype[$iterator$] = function () {
2443
+ return new ArrayIterator(this._a);
2444
+ };
2445
+
2446
+ function ArrayIterator(a) {
2447
+ this._a = a;
2448
+ this._l = toLength(a);
2449
+ this._i = 0;
2450
+ }
2451
+
2452
+ ArrayIterator.prototype[$iterator$] = function () {
2453
+ return this;
2454
+ };
2455
+
2456
+ ArrayIterator.prototype.next = function () {
2457
+ if (this._i < this._l) {
2458
+ var val = this._a[this._i++];
2459
+ return { done: false, value: val };
2460
+ } else {
2461
+ return doneEnumerator;
2462
+ }
2463
+ };
2464
+
2285
2465
  function numberIsFinite(value) {
2286
2466
  return typeof value === 'number' && root.isFinite(value);
2287
2467
  }
@@ -2290,8 +2470,18 @@ if (!Array.prototype.forEach) {
2290
2470
  return n !== n;
2291
2471
  }
2292
2472
 
2293
- function isIterable(o) {
2294
- return o[$iterator$] !== undefined;
2473
+ function getIterable(o) {
2474
+ var i = o[$iterator$], it;
2475
+ if (!i && typeof o === 'string') {
2476
+ it = new StringIterable(o);
2477
+ return it[$iterator$]();
2478
+ }
2479
+ if (!i && o.length !== undefined) {
2480
+ it = new ArrayIterable(o);
2481
+ return it[$iterator$]();
2482
+ }
2483
+ if (!i) { throw new TypeError('Object is not iterable'); }
2484
+ return o[$iterator$]();
2295
2485
  }
2296
2486
 
2297
2487
  function sign(value) {
@@ -2311,10 +2501,6 @@ if (!Array.prototype.forEach) {
2311
2501
  return len;
2312
2502
  }
2313
2503
 
2314
- function isCallable(f) {
2315
- return Object.prototype.toString.call(f) === '[object Function]' && typeof f === 'function';
2316
- }
2317
-
2318
2504
  /**
2319
2505
  * This method creates a new Observable sequence from an array-like or iterable object.
2320
2506
  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.
@@ -2326,66 +2512,52 @@ if (!Array.prototype.forEach) {
2326
2512
  if (iterable == null) {
2327
2513
  throw new Error('iterable cannot be null.')
2328
2514
  }
2329
- if (mapFn && !isCallable(mapFn)) {
2515
+ if (mapFn && !isFunction(mapFn)) {
2330
2516
  throw new Error('mapFn when provided must be a function');
2331
2517
  }
2332
2518
  isScheduler(scheduler) || (scheduler = currentThreadScheduler);
2519
+ var list = Object(iterable), it = getIterable(list);
2333
2520
  return new AnonymousObservable(function (observer) {
2334
- var list = Object(iterable),
2335
- objIsIterable = isIterable(list),
2336
- len = objIsIterable ? 0 : toLength(list),
2337
- it = objIsIterable ? list[$iterator$]() : null,
2338
- i = 0;
2521
+ var i = 0;
2339
2522
  return scheduler.scheduleRecursive(function (self) {
2340
- if (i < len || objIsIterable) {
2341
- var result;
2342
- if (objIsIterable) {
2343
- var next;
2344
- try {
2345
- next = it.next();
2346
- } catch (e) {
2347
- observer.onError(e);
2348
- return;
2349
- }
2350
- if (next.done) {
2351
- observer.onCompleted();
2352
- return;
2353
- }
2523
+ var next;
2524
+ try {
2525
+ next = it.next();
2526
+ } catch (e) {
2527
+ observer.onError(e);
2528
+ return;
2529
+ }
2530
+ if (next.done) {
2531
+ observer.onCompleted();
2532
+ return;
2533
+ }
2354
2534
 
2355
- result = next.value;
2356
- } else {
2357
- result = !!list.charAt ? list.charAt(i) : list[i];
2358
- }
2535
+ var result = next.value;
2359
2536
 
2360
- if (mapFn && isCallable(mapFn)) {
2361
- try {
2362
- result = thisArg ? mapFn.call(thisArg, result, i) : mapFn(result, i);
2363
- } catch (e) {
2364
- observer.onError(e);
2365
- return;
2366
- }
2537
+ if (mapFn && isFunction(mapFn)) {
2538
+ try {
2539
+ result = mapFn.call(thisArg, result, i);
2540
+ } catch (e) {
2541
+ observer.onError(e);
2542
+ return;
2367
2543
  }
2368
-
2369
- observer.onNext(result);
2370
- i++;
2371
- self();
2372
- } else {
2373
- observer.onCompleted();
2374
2544
  }
2545
+
2546
+ observer.onNext(result);
2547
+ i++;
2548
+ self();
2375
2549
  });
2376
2550
  });
2377
2551
  };
2378
2552
 
2379
2553
  /**
2380
2554
  * Converts an array to an observable sequence, using an optional scheduler to enumerate the array.
2381
- *
2382
- * @example
2383
- * var res = Rx.Observable.fromArray([1,2,3]);
2384
- * var res = Rx.Observable.fromArray([1,2,3], Rx.Scheduler.timeout);
2555
+ * @deprecated use Observable.from or Observable.of
2385
2556
  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.
2386
2557
  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.
2387
2558
  */
2388
2559
  var observableFromArray = Observable.fromArray = function (array, scheduler) {
2560
+ deprecate('fromArray', 'from');
2389
2561
  isScheduler(scheduler) || (scheduler = currentThreadScheduler);
2390
2562
  return new AnonymousObservable(function (observer) {
2391
2563
  var count = 0, len = array.length;
@@ -2453,29 +2625,36 @@ if (!Array.prototype.forEach) {
2453
2625
  });
2454
2626
  };
2455
2627
 
2628
+ function observableOf (scheduler, array) {
2629
+ isScheduler(scheduler) || (scheduler = currentThreadScheduler);
2630
+ return new AnonymousObservable(function (observer) {
2631
+ var count = 0, len = array.length;
2632
+ return scheduler.scheduleRecursive(function (self) {
2633
+ if (count < len) {
2634
+ observer.onNext(array[count++]);
2635
+ self();
2636
+ } else {
2637
+ observer.onCompleted();
2638
+ }
2639
+ });
2640
+ });
2641
+ }
2642
+
2456
2643
  /**
2457
2644
  * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.
2458
- * @example
2459
- * var res = Rx.Observable.of(1,2,3);
2460
2645
  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.
2461
2646
  */
2462
2647
  Observable.of = function () {
2463
- var len = arguments.length, args = new Array(len);
2464
- for(var i = 0; i < len; i++) { args[i] = arguments[i]; }
2465
- return observableFromArray(args);
2648
+ return observableOf(null, arguments);
2466
2649
  };
2467
2650
 
2468
2651
  /**
2469
2652
  * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.
2470
- * @example
2471
- * var res = Rx.Observable.of(1,2,3);
2472
2653
  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.
2473
2654
  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.
2474
2655
  */
2475
- var observableOf = Observable.ofWithScheduler = function (scheduler) {
2476
- var len = arguments.length - 1, args = new Array(len);
2477
- for(var i = 0; i < len; i++) { args[i] = arguments[i + 1]; }
2478
- return observableFromArray(args, scheduler);
2656
+ Observable.ofWithScheduler = function (scheduler) {
2657
+ return observableOf(scheduler, slice.call(arguments, 1));
2479
2658
  };
2480
2659
 
2481
2660
  /**
@@ -2532,7 +2711,7 @@ if (!Array.prototype.forEach) {
2532
2711
  * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.
2533
2712
  * @returns {Observable} An observable sequence containing the single specified element.
2534
2713
  */
2535
- var observableReturn = Observable['return'] = Observable.returnValue = Observable.just = function (value, scheduler) {
2714
+ var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {
2536
2715
  isScheduler(scheduler) || (scheduler = immediateScheduler);
2537
2716
  return new AnonymousObservable(function (observer) {
2538
2717
  return scheduler.schedule(function () {
@@ -2542,6 +2721,12 @@ if (!Array.prototype.forEach) {
2542
2721
  });
2543
2722
  };
2544
2723
 
2724
+ /** @deprecated use return or just */
2725
+ Observable.returnValue = function () {
2726
+ deprecate('returnValue', 'return or just');
2727
+ return observableReturn.apply(null, arguments);
2728
+ };
2729
+
2545
2730
  /**
2546
2731
  * Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.
2547
2732
  * There is an alias to this method called 'throwError' for browsers <IE9.
@@ -2684,7 +2869,7 @@ if (!Array.prototype.forEach) {
2684
2869
  }, observer.onCompleted.bind(observer)));
2685
2870
 
2686
2871
  return subscription;
2687
- });
2872
+ }, source);
2688
2873
  }
2689
2874
 
2690
2875
  /**
@@ -2695,19 +2880,35 @@ if (!Array.prototype.forEach) {
2695
2880
  * @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.
2696
2881
  * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.
2697
2882
  */
2698
- observableProto['catch'] = observableProto.catchError = observableProto.catchException = function (handlerOrSecond) {
2883
+ observableProto['catch'] = observableProto.catchError = function (handlerOrSecond) {
2699
2884
  return typeof handlerOrSecond === 'function' ?
2700
2885
  observableCatchHandler(this, handlerOrSecond) :
2701
2886
  observableCatch([this, handlerOrSecond]);
2702
2887
  };
2703
2888
 
2889
+ /**
2890
+ * @deprecated use #catch or #catchError instead.
2891
+ */
2892
+ observableProto.catchException = function (handlerOrSecond) {
2893
+ deprecate('catchException', 'catch or catchError');
2894
+ return this.catchError(handlerOrSecond);
2895
+ };
2896
+
2704
2897
  /**
2705
2898
  * Continues an observable sequence that is terminated by an exception with the next observable sequence.
2706
2899
  * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.
2707
2900
  * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.
2708
2901
  */
2709
- var observableCatch = Observable.catchException = Observable.catchError = Observable['catch'] = function () {
2710
- return enumerableOf(argsOrArray(arguments, 0)).catchException();
2902
+ var observableCatch = Observable.catchError = Observable['catch'] = function () {
2903
+ return enumerableOf(argsOrArray(arguments, 0)).catchError();
2904
+ };
2905
+
2906
+ /**
2907
+ * @deprecated use #catch or #catchError instead.
2908
+ */
2909
+ Observable.catchException = function () {
2910
+ deprecate('catchException', 'catch or catchError');
2911
+ return observableCatch.apply(null, arguments);
2711
2912
  };
2712
2913
 
2713
2914
  /**
@@ -2791,7 +2992,7 @@ if (!Array.prototype.forEach) {
2791
2992
  }
2792
2993
 
2793
2994
  return new CompositeDisposable(subscriptions);
2794
- });
2995
+ }, this);
2795
2996
  };
2796
2997
 
2797
2998
  /**
@@ -2817,13 +3018,19 @@ if (!Array.prototype.forEach) {
2817
3018
  return enumerableOf(argsOrArray(arguments, 0)).concat();
2818
3019
  };
2819
3020
 
2820
- /**
2821
- * Concatenates an observable sequence of observable sequences.
2822
- * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.
2823
- */
2824
- observableProto.concatObservable = observableProto.concatAll =function () {
2825
- return this.merge(1);
2826
- };
3021
+ /**
3022
+ * Concatenates an observable sequence of observable sequences.
3023
+ * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.
3024
+ */
3025
+ observableProto.concatAll = function () {
3026
+ return this.merge(1);
3027
+ };
3028
+
3029
+ /** @deprecated Use `concatAll` instead. */
3030
+ observableProto.concatObservable = function () {
3031
+ deprecate('concatObservable', 'concatAll');
3032
+ return this.merge(1);
3033
+ };
2827
3034
 
2828
3035
  /**
2829
3036
  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.
@@ -2870,43 +3077,37 @@ if (!Array.prototype.forEach) {
2870
3077
  activeCount === 0 && observer.onCompleted();
2871
3078
  }));
2872
3079
  return group;
2873
- });
3080
+ }, sources);
2874
3081
  };
2875
3082
 
2876
- /**
2877
- * Merges all the observable sequences into a single observable sequence.
2878
- * The scheduler is optional and if not specified, the immediate scheduler is used.
2879
- *
2880
- * @example
2881
- * 1 - merged = Rx.Observable.merge(xs, ys, zs);
2882
- * 2 - merged = Rx.Observable.merge([xs, ys, zs]);
2883
- * 3 - merged = Rx.Observable.merge(scheduler, xs, ys, zs);
2884
- * 4 - merged = Rx.Observable.merge(scheduler, [xs, ys, zs]);
2885
- * @returns {Observable} The observable sequence that merges the elements of the observable sequences.
2886
- */
2887
- var observableMerge = Observable.merge = function () {
2888
- var scheduler, sources;
2889
- if (!arguments[0]) {
2890
- scheduler = immediateScheduler;
2891
- sources = slice.call(arguments, 1);
2892
- } else if (arguments[0].now) {
2893
- scheduler = arguments[0];
2894
- sources = slice.call(arguments, 1);
2895
- } else {
2896
- scheduler = immediateScheduler;
2897
- sources = slice.call(arguments, 0);
2898
- }
2899
- if (Array.isArray(sources[0])) {
2900
- sources = sources[0];
2901
- }
2902
- return observableFromArray(sources, scheduler).mergeObservable();
2903
- };
3083
+ /**
3084
+ * Merges all the observable sequences into a single observable sequence.
3085
+ * The scheduler is optional and if not specified, the immediate scheduler is used.
3086
+ * @returns {Observable} The observable sequence that merges the elements of the observable sequences.
3087
+ */
3088
+ var observableMerge = Observable.merge = function () {
3089
+ var scheduler, sources;
3090
+ if (!arguments[0]) {
3091
+ scheduler = immediateScheduler;
3092
+ sources = slice.call(arguments, 1);
3093
+ } else if (isScheduler(arguments[0])) {
3094
+ scheduler = arguments[0];
3095
+ sources = slice.call(arguments, 1);
3096
+ } else {
3097
+ scheduler = immediateScheduler;
3098
+ sources = slice.call(arguments, 0);
3099
+ }
3100
+ if (Array.isArray(sources[0])) {
3101
+ sources = sources[0];
3102
+ }
3103
+ return observableOf(scheduler, sources).mergeAll();
3104
+ };
2904
3105
 
2905
3106
  /**
2906
3107
  * Merges an observable sequence of observable sequences into an observable sequence.
2907
3108
  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.
2908
3109
  */
2909
- observableProto.mergeObservable = observableProto.mergeAll = function () {
3110
+ observableProto.mergeAll = function () {
2910
3111
  var sources = this;
2911
3112
  return new AnonymousObservable(function (observer) {
2912
3113
  var group = new CompositeDisposable(),
@@ -2930,7 +3131,15 @@ if (!Array.prototype.forEach) {
2930
3131
  group.length === 1 && observer.onCompleted();
2931
3132
  }));
2932
3133
  return group;
2933
- });
3134
+ }, sources);
3135
+ };
3136
+
3137
+ /**
3138
+ * @deprecated use #mergeAll instead.
3139
+ */
3140
+ observableProto.mergeObservable = function () {
3141
+ deprecate('mergeObservable', 'mergeAll');
3142
+ return this.mergeAll.apply(this, arguments);
2934
3143
  };
2935
3144
 
2936
3145
  /**
@@ -2998,7 +3207,7 @@ if (!Array.prototype.forEach) {
2998
3207
  }));
2999
3208
 
3000
3209
  return disposables;
3001
- });
3210
+ }, source);
3002
3211
  };
3003
3212
 
3004
3213
  /**
@@ -3037,7 +3246,7 @@ if (!Array.prototype.forEach) {
3037
3246
  !hasLatest && observer.onCompleted();
3038
3247
  });
3039
3248
  return new CompositeDisposable(subscription, innerSubscription);
3040
- });
3249
+ }, sources);
3041
3250
  };
3042
3251
 
3043
3252
  /**
@@ -3053,7 +3262,7 @@ if (!Array.prototype.forEach) {
3053
3262
  source.subscribe(observer),
3054
3263
  other.subscribe(observer.onCompleted.bind(observer), observer.onError.bind(observer), noop)
3055
3264
  );
3056
- });
3265
+ }, source);
3057
3266
  };
3058
3267
 
3059
3268
  function zipArray(second, resultSelector) {
@@ -3074,7 +3283,7 @@ if (!Array.prototype.forEach) {
3074
3283
  observer.onCompleted();
3075
3284
  }
3076
3285
  }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3077
- });
3286
+ }, first);
3078
3287
  }
3079
3288
 
3080
3289
  /**
@@ -3136,7 +3345,7 @@ if (!Array.prototype.forEach) {
3136
3345
  }
3137
3346
 
3138
3347
  return new CompositeDisposable(subscriptions);
3139
- });
3348
+ }, parent);
3140
3349
  };
3141
3350
 
3142
3351
  /**
@@ -3206,7 +3415,7 @@ if (!Array.prototype.forEach) {
3206
3415
  * @returns {Observable} An observable sequence that hides the identity of the source sequence.
3207
3416
  */
3208
3417
  observableProto.asObservable = function () {
3209
- return new AnonymousObservable(this.subscribe.bind(this));
3418
+ return new AnonymousObservable(this.subscribe.bind(this), this);
3210
3419
  };
3211
3420
 
3212
3421
  /**
@@ -3230,60 +3439,58 @@ if (!Array.prototype.forEach) {
3230
3439
  });
3231
3440
  };
3232
3441
 
3233
- /**
3234
- * Dematerializes the explicit notification values of an observable sequence as implicit notifications.
3235
- * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.
3236
- */
3237
- observableProto.dematerialize = function () {
3238
- var source = this;
3239
- return new AnonymousObservable(function (observer) {
3240
- return source.subscribe(function (x) {
3241
- return x.accept(observer);
3242
- }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3243
- });
3244
- };
3442
+ /**
3443
+ * Dematerializes the explicit notification values of an observable sequence as implicit notifications.
3444
+ * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.
3445
+ */
3446
+ observableProto.dematerialize = function () {
3447
+ var source = this;
3448
+ return new AnonymousObservable(function (observer) {
3449
+ return source.subscribe(function (x) { return x.accept(observer); }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3450
+ }, this);
3451
+ };
3245
3452
 
3246
- /**
3247
- * Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.
3248
- *
3249
- * var obs = observable.distinctUntilChanged();
3250
- * var obs = observable.distinctUntilChanged(function (x) { return x.id; });
3251
- * var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });
3252
- *
3253
- * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.
3254
- * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.
3255
- * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.
3256
- */
3257
- observableProto.distinctUntilChanged = function (keySelector, comparer) {
3258
- var source = this;
3259
- keySelector || (keySelector = identity);
3260
- comparer || (comparer = defaultComparer);
3261
- return new AnonymousObservable(function (observer) {
3262
- var hasCurrentKey = false, currentKey;
3263
- return source.subscribe(function (value) {
3264
- var comparerEquals = false, key;
3265
- try {
3266
- key = keySelector(value);
3267
- } catch (exception) {
3268
- observer.onError(exception);
3269
- return;
3270
- }
3271
- if (hasCurrentKey) {
3272
- try {
3273
- comparerEquals = comparer(currentKey, key);
3274
- } catch (exception) {
3275
- observer.onError(exception);
3276
- return;
3277
- }
3278
- }
3279
- if (!hasCurrentKey || !comparerEquals) {
3280
- hasCurrentKey = true;
3281
- currentKey = key;
3282
- observer.onNext(value);
3283
- }
3284
- }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3285
- });
3286
- };
3453
+ /**
3454
+ * Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.
3455
+ *
3456
+ * var obs = observable.distinctUntilChanged();
3457
+ * var obs = observable.distinctUntilChanged(function (x) { return x.id; });
3458
+ * var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });
3459
+ *
3460
+ * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.
3461
+ * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.
3462
+ * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.
3463
+ */
3464
+ observableProto.distinctUntilChanged = function (keySelector, comparer) {
3465
+ var source = this;
3466
+ keySelector || (keySelector = identity);
3467
+ comparer || (comparer = defaultComparer);
3468
+ return new AnonymousObservable(function (observer) {
3469
+ var hasCurrentKey = false, currentKey;
3470
+ return source.subscribe(function (value) {
3471
+ var comparerEquals = false, key;
3472
+ try {
3473
+ key = keySelector(value);
3474
+ } catch (e) {
3475
+ observer.onError(e);
3476
+ return;
3477
+ }
3478
+ if (hasCurrentKey) {
3479
+ try {
3480
+ comparerEquals = comparer(currentKey, key);
3481
+ } catch (e) {
3482
+ observer.onError(e);
3483
+ return;
3484
+ }
3485
+ }
3486
+ if (!hasCurrentKey || !comparerEquals) {
3487
+ hasCurrentKey = true;
3488
+ currentKey = key;
3489
+ observer.onNext(value);
3490
+ }
3491
+ }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3492
+ }, this);
3493
+ };
3287
3494
 
3288
3495
  /**
3289
3496
  * Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.
@@ -3293,7 +3500,7 @@ if (!Array.prototype.forEach) {
3293
3500
  * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.
3294
3501
  * @returns {Observable} The source sequence with the side-effecting behavior applied.
3295
3502
  */
3296
- observableProto['do'] = observableProto.doAction = observableProto.tap = function (observerOrOnNext, onError, onCompleted) {
3503
+ observableProto['do'] = observableProto.tap = function (observerOrOnNext, onError, onCompleted) {
3297
3504
  var source = this, onNextFunc;
3298
3505
  if (typeof observerOrOnNext === 'function') {
3299
3506
  onNextFunc = observerOrOnNext;
@@ -3329,7 +3536,13 @@ if (!Array.prototype.forEach) {
3329
3536
  }
3330
3537
  observer.onCompleted();
3331
3538
  });
3332
- });
3539
+ }, this);
3540
+ };
3541
+
3542
+ /** @deprecated use #do or #tap instead. */
3543
+ observableProto.doAction = function () {
3544
+ deprecate('doAction', 'do or tap');
3545
+ return this.tap.apply(this, arguments);
3333
3546
  };
3334
3547
 
3335
3548
  /**
@@ -3367,13 +3580,10 @@ if (!Array.prototype.forEach) {
3367
3580
 
3368
3581
  /**
3369
3582
  * Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.
3370
- *
3371
- * @example
3372
- * var res = observable.finallyAction(function () { console.log('sequence ended'; });
3373
3583
  * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.
3374
3584
  * @returns {Observable} Source sequence with the action-invoking termination behavior applied.
3375
3585
  */
3376
- observableProto['finally'] = observableProto.finallyAction = function (action) {
3586
+ observableProto['finally'] = observableProto.ensure = function (action) {
3377
3587
  var source = this;
3378
3588
  return new AnonymousObservable(function (observer) {
3379
3589
  var subscription;
@@ -3392,7 +3602,15 @@ if (!Array.prototype.forEach) {
3392
3602
  action();
3393
3603
  }
3394
3604
  });
3395
- });
3605
+ }, this);
3606
+ };
3607
+
3608
+ /**
3609
+ * @deprecated use #finally or #ensure instead.
3610
+ */
3611
+ observableProto.finallyAction = function (action) {
3612
+ deprecate('finallyAction', 'finally or ensure');
3613
+ return this.ensure(action);
3396
3614
  };
3397
3615
 
3398
3616
  /**
@@ -3403,7 +3621,7 @@ if (!Array.prototype.forEach) {
3403
3621
  var source = this;
3404
3622
  return new AnonymousObservable(function (observer) {
3405
3623
  return source.subscribe(noop, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3406
- });
3624
+ }, source);
3407
3625
  };
3408
3626
 
3409
3627
  /**
@@ -3422,21 +3640,17 @@ if (!Array.prototype.forEach) {
3422
3640
  observer.onNext(notificationCreateOnCompleted());
3423
3641
  observer.onCompleted();
3424
3642
  });
3425
- });
3643
+ }, source);
3426
3644
  };
3427
3645
 
3428
- /**
3429
- * Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.
3430
- *
3431
- * @example
3432
- * var res = repeated = source.repeat();
3433
- * var res = repeated = source.repeat(42);
3434
- * @param {Number} [repeatCount] Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.
3435
- * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.
3436
- */
3437
- observableProto.repeat = function (repeatCount) {
3438
- return enumerableRepeat(this, repeatCount).concat();
3439
- };
3646
+ /**
3647
+ * Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.
3648
+ * @param {Number} [repeatCount] Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.
3649
+ * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.
3650
+ */
3651
+ observableProto.repeat = function (repeatCount) {
3652
+ return enumerableRepeat(this, repeatCount).concat();
3653
+ };
3440
3654
 
3441
3655
  /**
3442
3656
  * Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.
@@ -3449,7 +3663,7 @@ if (!Array.prototype.forEach) {
3449
3663
  * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.
3450
3664
  */
3451
3665
  observableProto.retry = function (retryCount) {
3452
- return enumerableRepeat(this, retryCount).catchException();
3666
+ return enumerableRepeat(this, retryCount).catchError();
3453
3667
  };
3454
3668
 
3455
3669
  /**
@@ -3496,7 +3710,7 @@ if (!Array.prototype.forEach) {
3496
3710
  observer.onCompleted();
3497
3711
  }
3498
3712
  );
3499
- });
3713
+ }, source);
3500
3714
  };
3501
3715
 
3502
3716
  /**
@@ -3515,7 +3729,7 @@ if (!Array.prototype.forEach) {
3515
3729
  q.push(x);
3516
3730
  q.length > count && observer.onNext(q.shift());
3517
3731
  }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3518
- });
3732
+ }, source);
3519
3733
  };
3520
3734
 
3521
3735
  /**
@@ -3554,10 +3768,10 @@ if (!Array.prototype.forEach) {
3554
3768
  q.push(x);
3555
3769
  q.length > count && q.shift();
3556
3770
  }, observer.onError.bind(observer), function () {
3557
- while(q.length > 0) { observer.onNext(q.shift()); }
3771
+ while (q.length > 0) { observer.onNext(q.shift()); }
3558
3772
  observer.onCompleted();
3559
3773
  });
3560
- });
3774
+ }, source);
3561
3775
  };
3562
3776
 
3563
3777
  /**
@@ -3580,7 +3794,7 @@ if (!Array.prototype.forEach) {
3580
3794
  observer.onNext(q);
3581
3795
  observer.onCompleted();
3582
3796
  });
3583
- });
3797
+ }, source);
3584
3798
  };
3585
3799
 
3586
3800
  /**
@@ -3620,27 +3834,27 @@ if (!Array.prototype.forEach) {
3620
3834
  function (x) {
3621
3835
  for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }
3622
3836
  var c = n - count + 1;
3623
- c >=0 && c % skip === 0 && q.shift().onCompleted();
3837
+ c >= 0 && c % skip === 0 && q.shift().onCompleted();
3624
3838
  ++n % skip === 0 && createWindow();
3625
- },
3839
+ },
3626
3840
  function (e) {
3627
3841
  while (q.length > 0) { q.shift().onError(e); }
3628
3842
  observer.onError(e);
3629
- },
3843
+ },
3630
3844
  function () {
3631
3845
  while (q.length > 0) { q.shift().onCompleted(); }
3632
3846
  observer.onCompleted();
3633
3847
  }
3634
3848
  ));
3635
3849
  return refCountDisposable;
3636
- });
3850
+ }, source);
3637
3851
  };
3638
3852
 
3639
3853
  function concatMap(source, selector, thisArg) {
3640
3854
  return source.map(function (x, i) {
3641
3855
  var result = selector.call(thisArg, x, i, source);
3642
3856
  isPromise(result) && (result = observableFromPromise(result));
3643
- (Array.isArray(result) || isIterable(result)) && (result = observableFrom(result));
3857
+ (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));
3644
3858
  return result;
3645
3859
  }).concatAll();
3646
3860
  }
@@ -3665,18 +3879,18 @@ if (!Array.prototype.forEach) {
3665
3879
  * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.
3666
3880
  */
3667
3881
  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {
3668
- if (typeof selector === 'function' && typeof resultSelector === 'function') {
3882
+ if (isFunction(selector) && isFunction(resultSelector)) {
3669
3883
  return this.concatMap(function (x, i) {
3670
3884
  var selectorResult = selector(x, i);
3671
3885
  isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));
3672
- (Array.isArray(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));
3886
+ (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));
3673
3887
 
3674
3888
  return selectorResult.map(function (y, i2) {
3675
3889
  return resultSelector(x, y, i, i2);
3676
3890
  });
3677
3891
  });
3678
3892
  }
3679
- return typeof selector === 'function' ?
3893
+ return isFunction(selector) ?
3680
3894
  concatMap(this, selector, thisArg) :
3681
3895
  concatMap(this, function () { return selector; });
3682
3896
  };
@@ -3730,7 +3944,7 @@ if (!Array.prototype.forEach) {
3730
3944
  observer.onNext(result);
3731
3945
  observer.onCompleted();
3732
3946
  });
3733
- }).concatAll();
3947
+ }, this).concatAll();
3734
3948
  };
3735
3949
 
3736
3950
  /**
@@ -3744,22 +3958,18 @@ if (!Array.prototype.forEach) {
3744
3958
  * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.
3745
3959
  */
3746
3960
  observableProto.defaultIfEmpty = function (defaultValue) {
3747
- var source = this;
3748
- if (defaultValue === undefined) {
3749
- defaultValue = null;
3750
- }
3751
- return new AnonymousObservable(function (observer) {
3752
- var found = false;
3753
- return source.subscribe(function (x) {
3754
- found = true;
3755
- observer.onNext(x);
3756
- }, observer.onError.bind(observer), function () {
3757
- if (!found) {
3758
- observer.onNext(defaultValue);
3759
- }
3760
- observer.onCompleted();
3761
- });
3961
+ var source = this;
3962
+ defaultValue === undefined && (defaultValue = null);
3963
+ return new AnonymousObservable(function (observer) {
3964
+ var found = false;
3965
+ return source.subscribe(function (x) {
3966
+ found = true;
3967
+ observer.onNext(x);
3968
+ }, observer.onError.bind(observer), function () {
3969
+ !found && observer.onNext(defaultValue);
3970
+ observer.onCompleted();
3762
3971
  });
3972
+ }, this);
3763
3973
  };
3764
3974
 
3765
3975
  // Swap out for Array.findIndex
@@ -3812,30 +4022,31 @@ if (!Array.prototype.forEach) {
3812
4022
  },
3813
4023
  observer.onError.bind(observer),
3814
4024
  observer.onCompleted.bind(observer));
3815
- });
4025
+ }, this);
3816
4026
  };
3817
4027
 
3818
4028
  /**
3819
- * Projects each element of an observable sequence into a new form by incorporating the element's index.
4029
+ * Projects each element of an observable sequence into a new form by incorporating the element's index.
3820
4030
  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.
3821
4031
  * @param {Any} [thisArg] Object to use as this when executing callback.
3822
4032
  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.
3823
4033
  */
3824
4034
  observableProto.select = observableProto.map = function (selector, thisArg) {
3825
- var parent = this;
4035
+ var selectorFn = isFunction(selector) ? selector : function () { return selector; },
4036
+ source = this;
3826
4037
  return new AnonymousObservable(function (observer) {
3827
4038
  var count = 0;
3828
- return parent.subscribe(function (value) {
4039
+ return source.subscribe(function (value) {
3829
4040
  var result;
3830
4041
  try {
3831
- result = selector.call(thisArg, value, count++, parent);
4042
+ result = selectorFn.call(thisArg, value, count++, source);
3832
4043
  } catch (e) {
3833
4044
  observer.onError(e);
3834
4045
  return;
3835
4046
  }
3836
4047
  observer.onNext(result);
3837
4048
  }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3838
- });
4049
+ }, source);
3839
4050
  };
3840
4051
 
3841
4052
  /**
@@ -3851,9 +4062,9 @@ if (!Array.prototype.forEach) {
3851
4062
  return source.map(function (x, i) {
3852
4063
  var result = selector.call(thisArg, x, i, source);
3853
4064
  isPromise(result) && (result = observableFromPromise(result));
3854
- (Array.isArray(result) || isIterable(result)) && (result = observableFrom(result));
4065
+ (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));
3855
4066
  return result;
3856
- }).mergeObservable();
4067
+ }).mergeAll();
3857
4068
  }
3858
4069
 
3859
4070
  /**
@@ -3876,18 +4087,18 @@ if (!Array.prototype.forEach) {
3876
4087
  * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.
3877
4088
  */
3878
4089
  observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector, thisArg) {
3879
- if (typeof selector === 'function' && typeof resultSelector === 'function') {
4090
+ if (isFunction(selector) && isFunction(resultSelector)) {
3880
4091
  return this.flatMap(function (x, i) {
3881
4092
  var selectorResult = selector(x, i);
3882
4093
  isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));
3883
- (Array.isArray(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));
4094
+ (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));
3884
4095
 
3885
4096
  return selectorResult.map(function (y, i2) {
3886
4097
  return resultSelector(x, y, i, i2);
3887
4098
  });
3888
4099
  }, thisArg);
3889
4100
  }
3890
- return typeof selector === 'function' ?
4101
+ return isFunction(selector) ?
3891
4102
  flatMap(this, selector, thisArg) :
3892
4103
  flatMap(this, function () { return selector; });
3893
4104
  };
@@ -3941,7 +4152,7 @@ if (!Array.prototype.forEach) {
3941
4152
  observer.onNext(result);
3942
4153
  observer.onCompleted();
3943
4154
  });
3944
- }).mergeAll();
4155
+ }, source).mergeAll();
3945
4156
  };
3946
4157
 
3947
4158
  /**
@@ -3962,18 +4173,18 @@ if (!Array.prototype.forEach) {
3962
4173
  * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.
3963
4174
  */
3964
4175
  observableProto.skip = function (count) {
3965
- if (count < 0) { throw new Error(argumentOutOfRange); }
3966
- var source = this;
3967
- return new AnonymousObservable(function (observer) {
3968
- var remaining = count;
3969
- return source.subscribe(function (x) {
3970
- if (remaining <= 0) {
3971
- observer.onNext(x);
3972
- } else {
3973
- remaining--;
3974
- }
3975
- }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
3976
- });
4176
+ if (count < 0) { throw new Error(argumentOutOfRange); }
4177
+ var source = this;
4178
+ return new AnonymousObservable(function (observer) {
4179
+ var remaining = count;
4180
+ return source.subscribe(function (x) {
4181
+ if (remaining <= 0) {
4182
+ observer.onNext(x);
4183
+ } else {
4184
+ remaining--;
4185
+ }
4186
+ }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
4187
+ }, source);
3977
4188
  };
3978
4189
 
3979
4190
  /**
@@ -4001,7 +4212,7 @@ if (!Array.prototype.forEach) {
4001
4212
  }
4002
4213
  running && observer.onNext(x);
4003
4214
  }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
4004
- });
4215
+ }, source);
4005
4216
  };
4006
4217
 
4007
4218
  /**
@@ -4014,18 +4225,18 @@ if (!Array.prototype.forEach) {
4014
4225
  * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.
4015
4226
  */
4016
4227
  observableProto.take = function (count, scheduler) {
4017
- if (count < 0) { throw new RangeError(argumentOutOfRange); }
4018
- if (count === 0) { return observableEmpty(scheduler); }
4019
- var observable = this;
4020
- return new AnonymousObservable(function (observer) {
4021
- var remaining = count;
4022
- return observable.subscribe(function (x) {
4023
- if (remaining-- > 0) {
4024
- observer.onNext(x);
4025
- remaining === 0 && observer.onCompleted();
4026
- }
4027
- }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
4028
- });
4228
+ if (count < 0) { throw new RangeError(argumentOutOfRange); }
4229
+ if (count === 0) { return observableEmpty(scheduler); }
4230
+ var source = this;
4231
+ return new AnonymousObservable(function (observer) {
4232
+ var remaining = count;
4233
+ return source.subscribe(function (x) {
4234
+ if (remaining-- > 0) {
4235
+ observer.onNext(x);
4236
+ remaining === 0 && observer.onCompleted();
4237
+ }
4238
+ }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
4239
+ }, source);
4029
4240
  };
4030
4241
 
4031
4242
  /**
@@ -4036,13 +4247,13 @@ if (!Array.prototype.forEach) {
4036
4247
  * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.
4037
4248
  */
4038
4249
  observableProto.takeWhile = function (predicate, thisArg) {
4039
- var observable = this;
4250
+ var source = this;
4040
4251
  return new AnonymousObservable(function (observer) {
4041
4252
  var i = 0, running = true;
4042
- return observable.subscribe(function (x) {
4253
+ return source.subscribe(function (x) {
4043
4254
  if (running) {
4044
4255
  try {
4045
- running = predicate.call(thisArg, x, i++, observable);
4256
+ running = predicate.call(thisArg, x, i++, source);
4046
4257
  } catch (e) {
4047
4258
  observer.onError(e);
4048
4259
  return;
@@ -4054,7 +4265,7 @@ if (!Array.prototype.forEach) {
4054
4265
  }
4055
4266
  }
4056
4267
  }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
4057
- });
4268
+ }, source);
4058
4269
  };
4059
4270
 
4060
4271
  /**
@@ -4068,24 +4279,24 @@ if (!Array.prototype.forEach) {
4068
4279
  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.
4069
4280
  */
4070
4281
  observableProto.where = observableProto.filter = function (predicate, thisArg) {
4071
- var parent = this;
4072
- return new AnonymousObservable(function (observer) {
4073
- var count = 0;
4074
- return parent.subscribe(function (value) {
4075
- var shouldRun;
4076
- try {
4077
- shouldRun = predicate.call(thisArg, value, count++, parent);
4078
- } catch (e) {
4079
- observer.onError(e);
4080
- return;
4081
- }
4082
- shouldRun && observer.onNext(value);
4083
- }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
4084
- });
4282
+ var source = this;
4283
+ return new AnonymousObservable(function (observer) {
4284
+ var count = 0;
4285
+ return source.subscribe(function (value) {
4286
+ var shouldRun;
4287
+ try {
4288
+ shouldRun = predicate.call(thisArg, value, count++, parent);
4289
+ } catch (e) {
4290
+ observer.onError(e);
4291
+ return;
4292
+ }
4293
+ shouldRun && observer.onNext(value);
4294
+ }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
4295
+ }, source);
4085
4296
  };
4086
4297
 
4087
4298
  /**
4088
- * Executes a transducer to transform the observable sequence
4299
+ * Executes a transducer to transform the observable sequence
4089
4300
  * @param {Transducer} transducer A transducer to execute
4090
4301
  * @returns {Observable} An Observable sequence containing the results from the transducer.
4091
4302
  */
@@ -4109,17 +4320,17 @@ if (!Array.prototype.forEach) {
4109
4320
  return new AnonymousObservable(function(observer) {
4110
4321
  var xform = transducer(transformForObserver(observer));
4111
4322
  return source.subscribe(
4112
- function(v) {
4323
+ function(v) {
4113
4324
  try {
4114
4325
  xform.step(observer, v);
4115
4326
  } catch (e) {
4116
4327
  observer.onError(e);
4117
4328
  }
4118
- },
4119
- observer.onError.bind(observer),
4329
+ },
4330
+ observer.onError.bind(observer),
4120
4331
  function() { xform.result(observer); }
4121
4332
  );
4122
- });
4333
+ }, source);
4123
4334
  };
4124
4335
 
4125
4336
  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {
@@ -4134,7 +4345,8 @@ if (!Array.prototype.forEach) {
4134
4345
  disposableEmpty;
4135
4346
  }
4136
4347
 
4137
- function AnonymousObservable(subscribe) {
4348
+ function AnonymousObservable(subscribe, parent) {
4349
+ this.source = parent;
4138
4350
  if (!(this instanceof AnonymousObservable)) {
4139
4351
  return new AnonymousObservable(subscribe);
4140
4352
  }
@@ -4167,66 +4379,59 @@ if (!Array.prototype.forEach) {
4167
4379
 
4168
4380
  }(Observable));
4169
4381
 
4170
- /** @private */
4171
- var AutoDetachObserver = (function (_super) {
4172
- inherits(AutoDetachObserver, _super);
4382
+ var AutoDetachObserver = (function (__super__) {
4383
+ inherits(AutoDetachObserver, __super__);
4173
4384
 
4174
- function AutoDetachObserver(observer) {
4175
- _super.call(this);
4176
- this.observer = observer;
4177
- this.m = new SingleAssignmentDisposable();
4178
- }
4385
+ function AutoDetachObserver(observer) {
4386
+ __super__.call(this);
4387
+ this.observer = observer;
4388
+ this.m = new SingleAssignmentDisposable();
4389
+ }
4179
4390
 
4180
- var AutoDetachObserverPrototype = AutoDetachObserver.prototype;
4391
+ var AutoDetachObserverPrototype = AutoDetachObserver.prototype;
4181
4392
 
4182
- AutoDetachObserverPrototype.next = function (value) {
4183
- var noError = false;
4184
- try {
4185
- this.observer.onNext(value);
4186
- noError = true;
4187
- } catch (e) {
4188
- throw e;
4189
- } finally {
4190
- if (!noError) {
4191
- this.dispose();
4192
- }
4193
- }
4194
- };
4393
+ AutoDetachObserverPrototype.next = function (value) {
4394
+ var noError = false;
4395
+ try {
4396
+ this.observer.onNext(value);
4397
+ noError = true;
4398
+ } catch (e) {
4399
+ throw e;
4400
+ } finally {
4401
+ !noError && this.dispose();
4402
+ }
4403
+ };
4195
4404
 
4196
- AutoDetachObserverPrototype.error = function (exn) {
4197
- try {
4198
- this.observer.onError(exn);
4199
- } catch (e) {
4200
- throw e;
4201
- } finally {
4202
- this.dispose();
4203
- }
4204
- };
4405
+ AutoDetachObserverPrototype.error = function (err) {
4406
+ try {
4407
+ this.observer.onError(err);
4408
+ } catch (e) {
4409
+ throw e;
4410
+ } finally {
4411
+ this.dispose();
4412
+ }
4413
+ };
4205
4414
 
4206
- AutoDetachObserverPrototype.completed = function () {
4207
- try {
4208
- this.observer.onCompleted();
4209
- } catch (e) {
4210
- throw e;
4211
- } finally {
4212
- this.dispose();
4213
- }
4214
- };
4415
+ AutoDetachObserverPrototype.completed = function () {
4416
+ try {
4417
+ this.observer.onCompleted();
4418
+ } catch (e) {
4419
+ throw e;
4420
+ } finally {
4421
+ this.dispose();
4422
+ }
4423
+ };
4215
4424
 
4216
- AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };
4217
- AutoDetachObserverPrototype.getDisposable = function (value) { return this.m.getDisposable(); };
4218
- /* @private */
4219
- AutoDetachObserverPrototype.disposable = function (value) {
4220
- return arguments.length ? this.getDisposable() : setDisposable(value);
4221
- };
4425
+ AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };
4426
+ AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };
4222
4427
 
4223
- AutoDetachObserverPrototype.dispose = function () {
4224
- _super.prototype.dispose.call(this);
4225
- this.m.dispose();
4226
- };
4428
+ AutoDetachObserverPrototype.dispose = function () {
4429
+ __super__.prototype.dispose.call(this);
4430
+ this.m.dispose();
4431
+ };
4227
4432
 
4228
- return AutoDetachObserver;
4229
- }(AbstractObserver));
4433
+ return AutoDetachObserver;
4434
+ }(AbstractObserver));
4230
4435
 
4231
4436
  /** @private */
4232
4437
  var InnerSubscription = function (subject, observer) {
@@ -4520,4 +4725,7 @@ if (!Array.prototype.forEach) {
4520
4725
  root.Rx = Rx;
4521
4726
  }
4522
4727
 
4728
+ // All code before this point will be filtered from stack traces.
4729
+ var rEndingLine = captureLine();
4730
+
4523
4731
  }.call(this));