Advertisement
Guest User

Untitled

a guest
May 22nd, 2015
495
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 329.16 KB | None | 0 0
  1. "format register";
  2. System.register("rx/dist/rx.all", [], true, function(require, exports, module) {
  3. var global = System.global,
  4. __define = global.define;
  5. global.define = undefined;
  6. ;
  7. (function(undefined) {
  8. var objectTypes = {
  9. 'boolean': false,
  10. 'function': true,
  11. 'object': true,
  12. 'number': false,
  13. 'string': false,
  14. 'undefined': false
  15. };
  16. var root = (objectTypes[typeof window] && window) || this,
  17. freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,
  18. freeModule = objectTypes[typeof module] && module && !module.nodeType && module,
  19. moduleExports = freeModule && freeModule.exports === freeExports && freeExports,
  20. freeGlobal = objectTypes[typeof global] && global;
  21. if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
  22. root = freeGlobal;
  23. }
  24. var Rx = {
  25. internals: {},
  26. config: {Promise: root.Promise},
  27. helpers: {}
  28. };
  29. var noop = Rx.helpers.noop = function() {},
  30. notDefined = Rx.helpers.notDefined = function(x) {
  31. return typeof x === 'undefined';
  32. },
  33. isScheduler = Rx.helpers.isScheduler = function(x) {
  34. return x instanceof Rx.Scheduler;
  35. },
  36. identity = Rx.helpers.identity = function(x) {
  37. return x;
  38. },
  39. pluck = Rx.helpers.pluck = function(property) {
  40. return function(x) {
  41. return x[property];
  42. };
  43. },
  44. just = Rx.helpers.just = function(value) {
  45. return function() {
  46. return value;
  47. };
  48. },
  49. defaultNow = Rx.helpers.defaultNow = Date.now,
  50. defaultComparer = Rx.helpers.defaultComparer = function(x, y) {
  51. return isEqual(x, y);
  52. },
  53. defaultSubComparer = Rx.helpers.defaultSubComparer = function(x, y) {
  54. return x > y ? 1 : (x < y ? -1 : 0);
  55. },
  56. defaultKeySerializer = Rx.helpers.defaultKeySerializer = function(x) {
  57. return x.toString();
  58. },
  59. defaultError = Rx.helpers.defaultError = function(err) {
  60. throw err;
  61. },
  62. isPromise = Rx.helpers.isPromise = function(p) {
  63. return !!p && typeof p.then === 'function';
  64. },
  65. asArray = Rx.helpers.asArray = function() {
  66. return Array.prototype.slice.call(arguments);
  67. },
  68. not = Rx.helpers.not = function(a) {
  69. return !a;
  70. },
  71. isFunction = Rx.helpers.isFunction = (function() {
  72. var isFn = function(value) {
  73. return typeof value == 'function' || false;
  74. };
  75. if (isFn(/x/)) {
  76. isFn = function(value) {
  77. return typeof value == 'function' && toString.call(value) == '[object Function]';
  78. };
  79. }
  80. return isFn;
  81. }());
  82. function cloneArray(arr) {
  83. for (var a = [],
  84. i = 0,
  85. len = arr.length; i < len; i++) {
  86. a.push(arr[i]);
  87. }
  88. return a;
  89. }
  90. Rx.config.longStackSupport = false;
  91. var hasStacks = false;
  92. try {
  93. throw new Error();
  94. } catch (e) {
  95. hasStacks = !!e.stack;
  96. }
  97. var rStartingLine = captureLine(),
  98. rFileName;
  99. var STACK_JUMP_SEPARATOR = "From previous event:";
  100. function makeStackTraceLong(error, observable) {
  101. if (hasStacks && observable.stack && typeof error === "object" && error !== null && error.stack && error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1) {
  102. var stacks = [];
  103. for (var o = observable; !!o; o = o.source) {
  104. if (o.stack) {
  105. stacks.unshift(o.stack);
  106. }
  107. }
  108. stacks.unshift(error.stack);
  109. var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
  110. error.stack = filterStackString(concatedStacks);
  111. }
  112. }
  113. function filterStackString(stackString) {
  114. var lines = stackString.split("\n"),
  115. desiredLines = [];
  116. for (var i = 0,
  117. len = lines.length; i < len; i++) {
  118. var line = lines[i];
  119. if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
  120. desiredLines.push(line);
  121. }
  122. }
  123. return desiredLines.join("\n");
  124. }
  125. function isInternalFrame(stackLine) {
  126. var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
  127. if (!fileNameAndLineNumber) {
  128. return false;
  129. }
  130. var fileName = fileNameAndLineNumber[0],
  131. lineNumber = fileNameAndLineNumber[1];
  132. return fileName === rFileName && lineNumber >= rStartingLine && lineNumber <= rEndingLine;
  133. }
  134. function isNodeFrame(stackLine) {
  135. return stackLine.indexOf("(module.js:") !== -1 || stackLine.indexOf("(node.js:") !== -1;
  136. }
  137. function captureLine() {
  138. if (!hasStacks) {
  139. return ;
  140. }
  141. try {
  142. throw new Error();
  143. } catch (e) {
  144. var lines = e.stack.split("\n");
  145. var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
  146. var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
  147. if (!fileNameAndLineNumber) {
  148. return ;
  149. }
  150. rFileName = fileNameAndLineNumber[0];
  151. return fileNameAndLineNumber[1];
  152. }
  153. }
  154. function getFileNameAndLineNumber(stackLine) {
  155. var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
  156. if (attempt1) {
  157. return [attempt1[1], Number(attempt1[2])];
  158. }
  159. var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
  160. if (attempt2) {
  161. return [attempt2[1], Number(attempt2[2])];
  162. }
  163. var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
  164. if (attempt3) {
  165. return [attempt3[1], Number(attempt3[2])];
  166. }
  167. }
  168. var EmptyError = Rx.EmptyError = function() {
  169. this.message = 'Sequence contains no elements.';
  170. Error.call(this);
  171. };
  172. EmptyError.prototype = Error.prototype;
  173. var ObjectDisposedError = Rx.ObjectDisposedError = function() {
  174. this.message = 'Object has been disposed';
  175. Error.call(this);
  176. };
  177. ObjectDisposedError.prototype = Error.prototype;
  178. var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function() {
  179. this.message = 'Argument out of range';
  180. Error.call(this);
  181. };
  182. ArgumentOutOfRangeError.prototype = Error.prototype;
  183. var NotSupportedError = Rx.NotSupportedError = function(message) {
  184. this.message = message || 'This operation is not supported';
  185. Error.call(this);
  186. };
  187. NotSupportedError.prototype = Error.prototype;
  188. var NotImplementedError = Rx.NotImplementedError = function(message) {
  189. this.message = message || 'This operation is not implemented';
  190. Error.call(this);
  191. };
  192. NotImplementedError.prototype = Error.prototype;
  193. var notImplemented = Rx.helpers.notImplemented = function() {
  194. throw new NotImplementedError();
  195. };
  196. var notSupported = Rx.helpers.notSupported = function() {
  197. throw new NotSupportedError();
  198. };
  199. var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) || '_es6shim_iterator_';
  200. if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {
  201. $iterator$ = '@@iterator';
  202. }
  203. var doneEnumerator = Rx.doneEnumerator = {
  204. done: true,
  205. value: undefined
  206. };
  207. var isIterable = Rx.helpers.isIterable = function(o) {
  208. return o[$iterator$] !== undefined;
  209. };
  210. var isArrayLike = Rx.helpers.isArrayLike = function(o) {
  211. return o && o.length !== undefined;
  212. };
  213. Rx.helpers.iterator = $iterator$;
  214. var bindCallback = Rx.internals.bindCallback = function(func, thisArg, argCount) {
  215. if (typeof thisArg === 'undefined') {
  216. return func;
  217. }
  218. switch (argCount) {
  219. case 0:
  220. return function() {
  221. return func.call(thisArg);
  222. };
  223. case 1:
  224. return function(arg) {
  225. return func.call(thisArg, arg);
  226. };
  227. case 2:
  228. return function(value, index) {
  229. return func.call(thisArg, value, index);
  230. };
  231. case 3:
  232. return function(value, index, collection) {
  233. return func.call(thisArg, value, index, collection);
  234. };
  235. }
  236. return function() {
  237. return func.apply(thisArg, arguments);
  238. };
  239. };
  240. var dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],
  241. dontEnumsLength = dontEnums.length;
  242. var argsClass = '[object Arguments]',
  243. arrayClass = '[object Array]',
  244. boolClass = '[object Boolean]',
  245. dateClass = '[object Date]',
  246. errorClass = '[object Error]',
  247. funcClass = '[object Function]',
  248. numberClass = '[object Number]',
  249. objectClass = '[object Object]',
  250. regexpClass = '[object RegExp]',
  251. stringClass = '[object String]';
  252. var toString = Object.prototype.toString,
  253. hasOwnProperty = Object.prototype.hasOwnProperty,
  254. supportsArgsClass = toString.call(arguments) == argsClass,
  255. supportNodeClass,
  256. errorProto = Error.prototype,
  257. objectProto = Object.prototype,
  258. stringProto = String.prototype,
  259. propertyIsEnumerable = objectProto.propertyIsEnumerable;
  260. try {
  261. supportNodeClass = !(toString.call(document) == objectClass && !({'toString': 0} + ''));
  262. } catch (e) {
  263. supportNodeClass = true;
  264. }
  265. var nonEnumProps = {};
  266. nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = {
  267. 'constructor': true,
  268. 'toLocaleString': true,
  269. 'toString': true,
  270. 'valueOf': true
  271. };
  272. nonEnumProps[boolClass] = nonEnumProps[stringClass] = {
  273. 'constructor': true,
  274. 'toString': true,
  275. 'valueOf': true
  276. };
  277. nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = {
  278. 'constructor': true,
  279. 'toString': true
  280. };
  281. nonEnumProps[objectClass] = {'constructor': true};
  282. var support = {};
  283. (function() {
  284. var ctor = function() {
  285. this.x = 1;
  286. },
  287. props = [];
  288. ctor.prototype = {
  289. 'valueOf': 1,
  290. 'y': 1
  291. };
  292. for (var key in new ctor) {
  293. props.push(key);
  294. }
  295. for (key in arguments) {}
  296. support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');
  297. support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');
  298. support.nonEnumArgs = key != 0;
  299. support.nonEnumShadows = !/valueOf/.test(props);
  300. }(1));
  301. var isObject = Rx.internals.isObject = function(value) {
  302. var type = typeof value;
  303. return value && (type == 'function' || type == 'object') || false;
  304. };
  305. function keysIn(object) {
  306. var result = [];
  307. if (!isObject(object)) {
  308. return result;
  309. }
  310. if (support.nonEnumArgs && object.length && isArguments(object)) {
  311. object = slice.call(object);
  312. }
  313. var skipProto = support.enumPrototypes && typeof object == 'function',
  314. skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error);
  315. for (var key in object) {
  316. if (!(skipProto && key == 'prototype') && !(skipErrorProps && (key == 'message' || key == 'name'))) {
  317. result.push(key);
  318. }
  319. }
  320. if (support.nonEnumShadows && object !== objectProto) {
  321. var ctor = object.constructor,
  322. index = -1,
  323. length = dontEnumsLength;
  324. if (object === (ctor && ctor.prototype)) {
  325. var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),
  326. nonEnum = nonEnumProps[className];
  327. }
  328. while (++index < length) {
  329. key = dontEnums[index];
  330. if (!(nonEnum && nonEnum[key]) && hasOwnProperty.call(object, key)) {
  331. result.push(key);
  332. }
  333. }
  334. }
  335. return result;
  336. }
  337. function internalFor(object, callback, keysFunc) {
  338. var index = -1,
  339. props = keysFunc(object),
  340. length = props.length;
  341. while (++index < length) {
  342. var key = props[index];
  343. if (callback(object[key], key, object) === false) {
  344. break;
  345. }
  346. }
  347. return object;
  348. }
  349. function internalForIn(object, callback) {
  350. return internalFor(object, callback, keysIn);
  351. }
  352. function isNode(value) {
  353. return typeof value.toString != 'function' && typeof(value + '') == 'string';
  354. }
  355. var isArguments = function(value) {
  356. return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;
  357. };
  358. if (!supportsArgsClass) {
  359. isArguments = function(value) {
  360. return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;
  361. };
  362. }
  363. var isEqual = Rx.internals.isEqual = function(x, y) {
  364. return deepEquals(x, y, [], []);
  365. };
  366. function deepEquals(a, b, stackA, stackB) {
  367. if (a === b) {
  368. return a !== 0 || (1 / a == 1 / b);
  369. }
  370. var type = typeof a,
  371. otherType = typeof b;
  372. if (a === a && (a == null || b == null || (type != 'function' && type != 'object' && otherType != 'function' && otherType != 'object'))) {
  373. return false;
  374. }
  375. var className = toString.call(a),
  376. otherClass = toString.call(b);
  377. if (className == argsClass) {
  378. className = objectClass;
  379. }
  380. if (otherClass == argsClass) {
  381. otherClass = objectClass;
  382. }
  383. if (className != otherClass) {
  384. return false;
  385. }
  386. switch (className) {
  387. case boolClass:
  388. case dateClass:
  389. return +a == +b;
  390. case numberClass:
  391. return (a != +a) ? b != +b : (a == 0 ? (1 / a == 1 / b) : a == +b);
  392. case regexpClass:
  393. case stringClass:
  394. return a == String(b);
  395. }
  396. var isArr = className == arrayClass;
  397. if (!isArr) {
  398. if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {
  399. return false;
  400. }
  401. var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,
  402. ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;
  403. if (ctorA != ctorB && !(hasOwnProperty.call(a, 'constructor') && hasOwnProperty.call(b, 'constructor')) && !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) && ('constructor' in a && 'constructor' in b)) {
  404. return false;
  405. }
  406. }
  407. var initedStack = !stackA;
  408. stackA || (stackA = []);
  409. stackB || (stackB = []);
  410. var length = stackA.length;
  411. while (length--) {
  412. if (stackA[length] == a) {
  413. return stackB[length] == b;
  414. }
  415. }
  416. var size = 0;
  417. var result = true;
  418. stackA.push(a);
  419. stackB.push(b);
  420. if (isArr) {
  421. length = a.length;
  422. size = b.length;
  423. result = size == length;
  424. if (result) {
  425. while (size--) {
  426. var index = length,
  427. value = b[size];
  428. if (!(result = deepEquals(a[size], value, stackA, stackB))) {
  429. break;
  430. }
  431. }
  432. }
  433. } else {
  434. internalForIn(b, function(value, key, b) {
  435. if (hasOwnProperty.call(b, key)) {
  436. size++;
  437. return (result = hasOwnProperty.call(a, key) && deepEquals(a[key], value, stackA, stackB));
  438. }
  439. });
  440. if (result) {
  441. internalForIn(a, function(value, key, a) {
  442. if (hasOwnProperty.call(a, key)) {
  443. return (result = --size > -1);
  444. }
  445. });
  446. }
  447. }
  448. stackA.pop();
  449. stackB.pop();
  450. return result;
  451. }
  452. var hasProp = {}.hasOwnProperty,
  453. slice = Array.prototype.slice;
  454. var inherits = this.inherits = Rx.internals.inherits = function(child, parent) {
  455. function __() {
  456. this.constructor = child;
  457. }
  458. __.prototype = parent.prototype;
  459. child.prototype = new __();
  460. };
  461. var addProperties = Rx.internals.addProperties = function(obj) {
  462. for (var sources = [],
  463. i = 1,
  464. len = arguments.length; i < len; i++) {
  465. sources.push(arguments[i]);
  466. }
  467. for (var idx = 0,
  468. ln = sources.length; idx < ln; idx++) {
  469. var source = sources[idx];
  470. for (var prop in source) {
  471. obj[prop] = source[prop];
  472. }
  473. }
  474. };
  475. var addRef = Rx.internals.addRef = function(xs, r) {
  476. return new AnonymousObservable(function(observer) {
  477. return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer));
  478. });
  479. };
  480. function arrayInitialize(count, factory) {
  481. var a = new Array(count);
  482. for (var i = 0; i < count; i++) {
  483. a[i] = factory();
  484. }
  485. return a;
  486. }
  487. var errorObj = {e: {}};
  488. var tryCatchTarget;
  489. function tryCatcher() {
  490. try {
  491. return tryCatchTarget.apply(this, arguments);
  492. } catch (e) {
  493. errorObj.e = e;
  494. return errorObj;
  495. }
  496. }
  497. function tryCatch(fn) {
  498. if (!isFunction(fn)) {
  499. throw new TypeError('fn must be a function');
  500. }
  501. tryCatchTarget = fn;
  502. return tryCatcher;
  503. }
  504. function thrower(e) {
  505. throw e;
  506. }
  507. function IndexedItem(id, value) {
  508. this.id = id;
  509. this.value = value;
  510. }
  511. IndexedItem.prototype.compareTo = function(other) {
  512. var c = this.value.compareTo(other.value);
  513. c === 0 && (c = this.id - other.id);
  514. return c;
  515. };
  516. var PriorityQueue = Rx.internals.PriorityQueue = function(capacity) {
  517. this.items = new Array(capacity);
  518. this.length = 0;
  519. };
  520. var priorityProto = PriorityQueue.prototype;
  521. priorityProto.isHigherPriority = function(left, right) {
  522. return this.items[left].compareTo(this.items[right]) < 0;
  523. };
  524. priorityProto.percolate = function(index) {
  525. if (index >= this.length || index < 0) {
  526. return ;
  527. }
  528. var parent = index - 1 >> 1;
  529. if (parent < 0 || parent === index) {
  530. return ;
  531. }
  532. if (this.isHigherPriority(index, parent)) {
  533. var temp = this.items[index];
  534. this.items[index] = this.items[parent];
  535. this.items[parent] = temp;
  536. this.percolate(parent);
  537. }
  538. };
  539. priorityProto.heapify = function(index) {
  540. +index || (index = 0);
  541. if (index >= this.length || index < 0) {
  542. return ;
  543. }
  544. var left = 2 * index + 1,
  545. right = 2 * index + 2,
  546. first = index;
  547. if (left < this.length && this.isHigherPriority(left, first)) {
  548. first = left;
  549. }
  550. if (right < this.length && this.isHigherPriority(right, first)) {
  551. first = right;
  552. }
  553. if (first !== index) {
  554. var temp = this.items[index];
  555. this.items[index] = this.items[first];
  556. this.items[first] = temp;
  557. this.heapify(first);
  558. }
  559. };
  560. priorityProto.peek = function() {
  561. return this.items[0].value;
  562. };
  563. priorityProto.removeAt = function(index) {
  564. this.items[index] = this.items[--this.length];
  565. this.items[this.length] = undefined;
  566. this.heapify();
  567. };
  568. priorityProto.dequeue = function() {
  569. var result = this.peek();
  570. this.removeAt(0);
  571. return result;
  572. };
  573. priorityProto.enqueue = function(item) {
  574. var index = this.length++;
  575. this.items[index] = new IndexedItem(PriorityQueue.count++, item);
  576. this.percolate(index);
  577. };
  578. priorityProto.remove = function(item) {
  579. for (var i = 0; i < this.length; i++) {
  580. if (this.items[i].value === item) {
  581. this.removeAt(i);
  582. return true;
  583. }
  584. }
  585. return false;
  586. };
  587. PriorityQueue.count = 0;
  588. var CompositeDisposable = Rx.CompositeDisposable = function() {
  589. var args = [],
  590. i,
  591. len;
  592. if (Array.isArray(arguments[0])) {
  593. args = arguments[0];
  594. len = args.length;
  595. } else {
  596. len = arguments.length;
  597. args = new Array(len);
  598. for (i = 0; i < len; i++) {
  599. args[i] = arguments[i];
  600. }
  601. }
  602. for (i = 0; i < len; i++) {
  603. if (!isDisposable(args[i])) {
  604. throw new TypeError('Not a disposable');
  605. }
  606. }
  607. this.disposables = args;
  608. this.isDisposed = false;
  609. this.length = args.length;
  610. };
  611. var CompositeDisposablePrototype = CompositeDisposable.prototype;
  612. CompositeDisposablePrototype.add = function(item) {
  613. if (this.isDisposed) {
  614. item.dispose();
  615. } else {
  616. this.disposables.push(item);
  617. this.length++;
  618. }
  619. };
  620. CompositeDisposablePrototype.remove = function(item) {
  621. var shouldDispose = false;
  622. if (!this.isDisposed) {
  623. var idx = this.disposables.indexOf(item);
  624. if (idx !== -1) {
  625. shouldDispose = true;
  626. this.disposables.splice(idx, 1);
  627. this.length--;
  628. item.dispose();
  629. }
  630. }
  631. return shouldDispose;
  632. };
  633. CompositeDisposablePrototype.dispose = function() {
  634. if (!this.isDisposed) {
  635. this.isDisposed = true;
  636. var len = this.disposables.length,
  637. currentDisposables = new Array(len);
  638. for (var i = 0; i < len; i++) {
  639. currentDisposables[i] = this.disposables[i];
  640. }
  641. this.disposables = [];
  642. this.length = 0;
  643. for (i = 0; i < len; i++) {
  644. currentDisposables[i].dispose();
  645. }
  646. }
  647. };
  648. var Disposable = Rx.Disposable = function(action) {
  649. this.isDisposed = false;
  650. this.action = action || noop;
  651. };
  652. Disposable.prototype.dispose = function() {
  653. if (!this.isDisposed) {
  654. this.action();
  655. this.isDisposed = true;
  656. }
  657. };
  658. var disposableCreate = Disposable.create = function(action) {
  659. return new Disposable(action);
  660. };
  661. var disposableEmpty = Disposable.empty = {dispose: noop};
  662. var isDisposable = Disposable.isDisposable = function(d) {
  663. return d && isFunction(d.dispose);
  664. };
  665. var checkDisposed = Disposable.checkDisposed = function(disposable) {
  666. if (disposable.isDisposed) {
  667. throw new ObjectDisposedError();
  668. }
  669. };
  670. var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function() {
  671. function BooleanDisposable() {
  672. this.isDisposed = false;
  673. this.current = null;
  674. }
  675. var booleanDisposablePrototype = BooleanDisposable.prototype;
  676. booleanDisposablePrototype.getDisposable = function() {
  677. return this.current;
  678. };
  679. booleanDisposablePrototype.setDisposable = function(value) {
  680. var shouldDispose = this.isDisposed;
  681. if (!shouldDispose) {
  682. var old = this.current;
  683. this.current = value;
  684. }
  685. old && old.dispose();
  686. shouldDispose && value && value.dispose();
  687. };
  688. booleanDisposablePrototype.dispose = function() {
  689. if (!this.isDisposed) {
  690. this.isDisposed = true;
  691. var old = this.current;
  692. this.current = null;
  693. }
  694. old && old.dispose();
  695. };
  696. return BooleanDisposable;
  697. }());
  698. var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;
  699. var RefCountDisposable = Rx.RefCountDisposable = (function() {
  700. function InnerDisposable(disposable) {
  701. this.disposable = disposable;
  702. this.disposable.count++;
  703. this.isInnerDisposed = false;
  704. }
  705. InnerDisposable.prototype.dispose = function() {
  706. if (!this.disposable.isDisposed && !this.isInnerDisposed) {
  707. this.isInnerDisposed = true;
  708. this.disposable.count--;
  709. if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {
  710. this.disposable.isDisposed = true;
  711. this.disposable.underlyingDisposable.dispose();
  712. }
  713. }
  714. };
  715. function RefCountDisposable(disposable) {
  716. this.underlyingDisposable = disposable;
  717. this.isDisposed = false;
  718. this.isPrimaryDisposed = false;
  719. this.count = 0;
  720. }
  721. RefCountDisposable.prototype.dispose = function() {
  722. if (!this.isDisposed && !this.isPrimaryDisposed) {
  723. this.isPrimaryDisposed = true;
  724. if (this.count === 0) {
  725. this.isDisposed = true;
  726. this.underlyingDisposable.dispose();
  727. }
  728. }
  729. };
  730. RefCountDisposable.prototype.getDisposable = function() {
  731. return this.isDisposed ? disposableEmpty : new InnerDisposable(this);
  732. };
  733. return RefCountDisposable;
  734. })();
  735. function ScheduledDisposable(scheduler, disposable) {
  736. this.scheduler = scheduler;
  737. this.disposable = disposable;
  738. this.isDisposed = false;
  739. }
  740. function scheduleItem(s, self) {
  741. if (!self.isDisposed) {
  742. self.isDisposed = true;
  743. self.disposable.dispose();
  744. }
  745. }
  746. ScheduledDisposable.prototype.dispose = function() {
  747. this.scheduler.scheduleWithState(this, scheduleItem);
  748. };
  749. var ScheduledItem = Rx.internals.ScheduledItem = function(scheduler, state, action, dueTime, comparer) {
  750. this.scheduler = scheduler;
  751. this.state = state;
  752. this.action = action;
  753. this.dueTime = dueTime;
  754. this.comparer = comparer || defaultSubComparer;
  755. this.disposable = new SingleAssignmentDisposable();
  756. };
  757. ScheduledItem.prototype.invoke = function() {
  758. this.disposable.setDisposable(this.invokeCore());
  759. };
  760. ScheduledItem.prototype.compareTo = function(other) {
  761. return this.comparer(this.dueTime, other.dueTime);
  762. };
  763. ScheduledItem.prototype.isCancelled = function() {
  764. return this.disposable.isDisposed;
  765. };
  766. ScheduledItem.prototype.invokeCore = function() {
  767. return this.action(this.scheduler, this.state);
  768. };
  769. var Scheduler = Rx.Scheduler = (function() {
  770. function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) {
  771. this.now = now;
  772. this._schedule = schedule;
  773. this._scheduleRelative = scheduleRelative;
  774. this._scheduleAbsolute = scheduleAbsolute;
  775. }
  776. function invokeAction(scheduler, action) {
  777. action();
  778. return disposableEmpty;
  779. }
  780. var schedulerProto = Scheduler.prototype;
  781. schedulerProto.schedule = function(action) {
  782. return this._schedule(action, invokeAction);
  783. };
  784. schedulerProto.scheduleWithState = function(state, action) {
  785. return this._schedule(state, action);
  786. };
  787. schedulerProto.scheduleWithRelative = function(dueTime, action) {
  788. return this._scheduleRelative(action, dueTime, invokeAction);
  789. };
  790. schedulerProto.scheduleWithRelativeAndState = function(state, dueTime, action) {
  791. return this._scheduleRelative(state, dueTime, action);
  792. };
  793. schedulerProto.scheduleWithAbsolute = function(dueTime, action) {
  794. return this._scheduleAbsolute(action, dueTime, invokeAction);
  795. };
  796. schedulerProto.scheduleWithAbsoluteAndState = function(state, dueTime, action) {
  797. return this._scheduleAbsolute(state, dueTime, action);
  798. };
  799. Scheduler.now = defaultNow;
  800. Scheduler.normalize = function(timeSpan) {
  801. timeSpan < 0 && (timeSpan = 0);
  802. return timeSpan;
  803. };
  804. return Scheduler;
  805. }());
  806. var normalizeTime = Scheduler.normalize;
  807. (function(schedulerProto) {
  808. function invokeRecImmediate(scheduler, pair) {
  809. var state = pair[0],
  810. action = pair[1],
  811. group = new CompositeDisposable();
  812. function recursiveAction(state1) {
  813. action(state1, function(state2) {
  814. var isAdded = false,
  815. isDone = false,
  816. d = scheduler.scheduleWithState(state2, function(scheduler1, state3) {
  817. if (isAdded) {
  818. group.remove(d);
  819. } else {
  820. isDone = true;
  821. }
  822. recursiveAction(state3);
  823. return disposableEmpty;
  824. });
  825. if (!isDone) {
  826. group.add(d);
  827. isAdded = true;
  828. }
  829. });
  830. }
  831. recursiveAction(state);
  832. return group;
  833. }
  834. function invokeRecDate(scheduler, pair, method) {
  835. var state = pair[0],
  836. action = pair[1],
  837. group = new CompositeDisposable();
  838. function recursiveAction(state1) {
  839. action(state1, function(state2, dueTime1) {
  840. var isAdded = false,
  841. isDone = false,
  842. d = scheduler[method](state2, dueTime1, function(scheduler1, state3) {
  843. if (isAdded) {
  844. group.remove(d);
  845. } else {
  846. isDone = true;
  847. }
  848. recursiveAction(state3);
  849. return disposableEmpty;
  850. });
  851. if (!isDone) {
  852. group.add(d);
  853. isAdded = true;
  854. }
  855. });
  856. }
  857. ;
  858. recursiveAction(state);
  859. return group;
  860. }
  861. function scheduleInnerRecursive(action, self) {
  862. action(function(dt) {
  863. self(action, dt);
  864. });
  865. }
  866. schedulerProto.scheduleRecursive = function(action) {
  867. return this.scheduleRecursiveWithState(action, function(_action, self) {
  868. _action(function() {
  869. self(_action);
  870. });
  871. });
  872. };
  873. schedulerProto.scheduleRecursiveWithState = function(state, action) {
  874. return this.scheduleWithState([state, action], invokeRecImmediate);
  875. };
  876. schedulerProto.scheduleRecursiveWithRelative = function(dueTime, action) {
  877. return this.scheduleRecursiveWithRelativeAndState(action, dueTime, scheduleInnerRecursive);
  878. };
  879. schedulerProto.scheduleRecursiveWithRelativeAndState = function(state, dueTime, action) {
  880. return this._scheduleRelative([state, action], dueTime, function(s, p) {
  881. return invokeRecDate(s, p, 'scheduleWithRelativeAndState');
  882. });
  883. };
  884. schedulerProto.scheduleRecursiveWithAbsolute = function(dueTime, action) {
  885. return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, scheduleInnerRecursive);
  886. };
  887. schedulerProto.scheduleRecursiveWithAbsoluteAndState = function(state, dueTime, action) {
  888. return this._scheduleAbsolute([state, action], dueTime, function(s, p) {
  889. return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState');
  890. });
  891. };
  892. }(Scheduler.prototype));
  893. (function(schedulerProto) {
  894. Scheduler.prototype.schedulePeriodic = function(period, action) {
  895. return this.schedulePeriodicWithState(null, period, action);
  896. };
  897. Scheduler.prototype.schedulePeriodicWithState = function(state, period, action) {
  898. if (typeof root.setInterval === 'undefined') {
  899. throw new NotSupportedError();
  900. }
  901. period = normalizeTime(period);
  902. var s = state,
  903. id = root.setInterval(function() {
  904. s = action(s);
  905. }, period);
  906. return disposableCreate(function() {
  907. root.clearInterval(id);
  908. });
  909. };
  910. }(Scheduler.prototype));
  911. (function(schedulerProto) {
  912. schedulerProto.catchError = schedulerProto['catch'] = function(handler) {
  913. return new CatchScheduler(this, handler);
  914. };
  915. }(Scheduler.prototype));
  916. var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function() {
  917. function tick(command, recurse) {
  918. recurse(0, this._period);
  919. try {
  920. this._state = this._action(this._state);
  921. } catch (e) {
  922. this._cancel.dispose();
  923. throw e;
  924. }
  925. }
  926. function SchedulePeriodicRecursive(scheduler, state, period, action) {
  927. this._scheduler = scheduler;
  928. this._state = state;
  929. this._period = period;
  930. this._action = action;
  931. }
  932. SchedulePeriodicRecursive.prototype.start = function() {
  933. var d = new SingleAssignmentDisposable();
  934. this._cancel = d;
  935. d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this)));
  936. return d;
  937. };
  938. return SchedulePeriodicRecursive;
  939. }());
  940. var immediateScheduler = Scheduler.immediate = (function() {
  941. function scheduleNow(state, action) {
  942. return action(this, state);
  943. }
  944. return new Scheduler(defaultNow, scheduleNow, notSupported, notSupported);
  945. }());
  946. var currentThreadScheduler = Scheduler.currentThread = (function() {
  947. var queue;
  948. function runTrampoline() {
  949. while (queue.length > 0) {
  950. var item = queue.dequeue();
  951. !item.isCancelled() && item.invoke();
  952. }
  953. }
  954. function scheduleNow(state, action) {
  955. var si = new ScheduledItem(this, state, action, this.now());
  956. if (!queue) {
  957. queue = new PriorityQueue(4);
  958. queue.enqueue(si);
  959. var result = tryCatch(runTrampoline)();
  960. queue = null;
  961. if (result === errorObj) {
  962. return thrower(result.e);
  963. }
  964. } else {
  965. queue.enqueue(si);
  966. }
  967. return si.disposable;
  968. }
  969. var currentScheduler = new Scheduler(defaultNow, scheduleNow, notSupported, notSupported);
  970. currentScheduler.scheduleRequired = function() {
  971. return !queue;
  972. };
  973. return currentScheduler;
  974. }());
  975. var scheduleMethod,
  976. clearMethod;
  977. var localTimer = (function() {
  978. var localSetTimeout,
  979. localClearTimeout = noop;
  980. if (!!root.WScript) {
  981. localSetTimeout = function(fn, time) {
  982. root.WScript.Sleep(time);
  983. fn();
  984. };
  985. } else if (!!root.setTimeout) {
  986. localSetTimeout = root.setTimeout;
  987. localClearTimeout = root.clearTimeout;
  988. } else {
  989. throw new NotSupportedError();
  990. }
  991. return {
  992. setTimeout: localSetTimeout,
  993. clearTimeout: localClearTimeout
  994. };
  995. }());
  996. var localSetTimeout = localTimer.setTimeout,
  997. localClearTimeout = localTimer.clearTimeout;
  998. (function() {
  999. var nextHandle = 1,
  1000. tasksByHandle = {},
  1001. currentlyRunning = false;
  1002. clearMethod = function(handle) {
  1003. delete tasksByHandle[handle];
  1004. };
  1005. function runTask(handle) {
  1006. if (currentlyRunning) {
  1007. localSetTimeout(function() {
  1008. runTask(handle);
  1009. }, 0);
  1010. } else {
  1011. var task = tasksByHandle[handle];
  1012. if (task) {
  1013. currentlyRunning = true;
  1014. var result = tryCatch(task)();
  1015. clearMethod(handle);
  1016. currentlyRunning = false;
  1017. if (result === errorObj) {
  1018. return thrower(result.e);
  1019. }
  1020. }
  1021. }
  1022. }
  1023. var reNative = RegExp('^' + String(toString).replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/toString| for [^\]]+/g, '.*?') + '$');
  1024. var setImmediate = typeof(setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && !reNative.test(setImmediate) && setImmediate;
  1025. function postMessageSupported() {
  1026. if (!root.postMessage || root.importScripts) {
  1027. return false;
  1028. }
  1029. var isAsync = false,
  1030. oldHandler = root.onmessage;
  1031. root.onmessage = function() {
  1032. isAsync = true;
  1033. };
  1034. root.postMessage('', '*');
  1035. root.onmessage = oldHandler;
  1036. return isAsync;
  1037. }
  1038. if (isFunction(setImmediate)) {
  1039. scheduleMethod = function(action) {
  1040. var id = nextHandle++;
  1041. tasksByHandle[id] = action;
  1042. setImmediate(function() {
  1043. runTask(id);
  1044. });
  1045. return id;
  1046. };
  1047. } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
  1048. scheduleMethod = function(action) {
  1049. var id = nextHandle++;
  1050. tasksByHandle[id] = action;
  1051. process.nextTick(function() {
  1052. runTask(id);
  1053. });
  1054. return id;
  1055. };
  1056. } else if (postMessageSupported()) {
  1057. var MSG_PREFIX = 'ms.rx.schedule' + Math.random();
  1058. function onGlobalPostMessage(event) {
  1059. if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {
  1060. runTask(event.data.substring(MSG_PREFIX.length));
  1061. }
  1062. }
  1063. if (root.addEventListener) {
  1064. root.addEventListener('message', onGlobalPostMessage, false);
  1065. } else {
  1066. root.attachEvent('onmessage', onGlobalPostMessage, false);
  1067. }
  1068. scheduleMethod = function(action) {
  1069. var id = nextHandle++;
  1070. tasksByHandle[id] = action;
  1071. root.postMessage(MSG_PREFIX + currentId, '*');
  1072. return id;
  1073. };
  1074. } else if (!!root.MessageChannel) {
  1075. var channel = new root.MessageChannel();
  1076. channel.port1.onmessage = function(e) {
  1077. runTask(e.data);
  1078. };
  1079. scheduleMethod = function(action) {
  1080. var id = nextHandle++;
  1081. tasksByHandle[id] = action;
  1082. channel.port2.postMessage(id);
  1083. return id;
  1084. };
  1085. } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {
  1086. scheduleMethod = function(action) {
  1087. var scriptElement = root.document.createElement('script');
  1088. var id = nextHandle++;
  1089. tasksByHandle[id] = action;
  1090. scriptElement.onreadystatechange = function() {
  1091. runTask(id);
  1092. scriptElement.onreadystatechange = null;
  1093. scriptElement.parentNode.removeChild(scriptElement);
  1094. scriptElement = null;
  1095. };
  1096. root.document.documentElement.appendChild(scriptElement);
  1097. return id;
  1098. };
  1099. } else {
  1100. scheduleMethod = function(action) {
  1101. var id = nextHandle++;
  1102. tasksByHandle[id] = action;
  1103. localSetTimeout(function() {
  1104. runTask(id);
  1105. }, 0);
  1106. return id;
  1107. };
  1108. }
  1109. }());
  1110. var timeoutScheduler = Scheduler.timeout = Scheduler.default = (function() {
  1111. function scheduleNow(state, action) {
  1112. var scheduler = this,
  1113. disposable = new SingleAssignmentDisposable();
  1114. var id = scheduleMethod(function() {
  1115. if (!disposable.isDisposed) {
  1116. disposable.setDisposable(action(scheduler, state));
  1117. }
  1118. });
  1119. return new CompositeDisposable(disposable, disposableCreate(function() {
  1120. clearMethod(id);
  1121. }));
  1122. }
  1123. function scheduleRelative(state, dueTime, action) {
  1124. var scheduler = this,
  1125. dt = Scheduler.normalize(dueTime);
  1126. if (dt === 0) {
  1127. return scheduler.scheduleWithState(state, action);
  1128. }
  1129. var disposable = new SingleAssignmentDisposable();
  1130. var id = localSetTimeout(function() {
  1131. if (!disposable.isDisposed) {
  1132. disposable.setDisposable(action(scheduler, state));
  1133. }
  1134. }, dt);
  1135. return new CompositeDisposable(disposable, disposableCreate(function() {
  1136. localClearTimeout(id);
  1137. }));
  1138. }
  1139. function scheduleAbsolute(state, dueTime, action) {
  1140. return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);
  1141. }
  1142. return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);
  1143. })();
  1144. var CatchScheduler = (function(__super__) {
  1145. function scheduleNow(state, action) {
  1146. return this._scheduler.scheduleWithState(state, this._wrap(action));
  1147. }
  1148. function scheduleRelative(state, dueTime, action) {
  1149. return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action));
  1150. }
  1151. function scheduleAbsolute(state, dueTime, action) {
  1152. return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action));
  1153. }
  1154. inherits(CatchScheduler, __super__);
  1155. function CatchScheduler(scheduler, handler) {
  1156. this._scheduler = scheduler;
  1157. this._handler = handler;
  1158. this._recursiveOriginal = null;
  1159. this._recursiveWrapper = null;
  1160. __super__.call(this, this._scheduler.now.bind(this._scheduler), scheduleNow, scheduleRelative, scheduleAbsolute);
  1161. }
  1162. CatchScheduler.prototype._clone = function(scheduler) {
  1163. return new CatchScheduler(scheduler, this._handler);
  1164. };
  1165. CatchScheduler.prototype._wrap = function(action) {
  1166. var parent = this;
  1167. return function(self, state) {
  1168. try {
  1169. return action(parent._getRecursiveWrapper(self), state);
  1170. } catch (e) {
  1171. if (!parent._handler(e)) {
  1172. throw e;
  1173. }
  1174. return disposableEmpty;
  1175. }
  1176. };
  1177. };
  1178. CatchScheduler.prototype._getRecursiveWrapper = function(scheduler) {
  1179. if (this._recursiveOriginal !== scheduler) {
  1180. this._recursiveOriginal = scheduler;
  1181. var wrapper = this._clone(scheduler);
  1182. wrapper._recursiveOriginal = scheduler;
  1183. wrapper._recursiveWrapper = wrapper;
  1184. this._recursiveWrapper = wrapper;
  1185. }
  1186. return this._recursiveWrapper;
  1187. };
  1188. CatchScheduler.prototype.schedulePeriodicWithState = function(state, period, action) {
  1189. var self = this,
  1190. failed = false,
  1191. d = new SingleAssignmentDisposable();
  1192. d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function(state1) {
  1193. if (failed) {
  1194. return null;
  1195. }
  1196. try {
  1197. return action(state1);
  1198. } catch (e) {
  1199. failed = true;
  1200. if (!self._handler(e)) {
  1201. throw e;
  1202. }
  1203. d.dispose();
  1204. return null;
  1205. }
  1206. }));
  1207. return d;
  1208. };
  1209. return CatchScheduler;
  1210. }(Scheduler));
  1211. var Notification = Rx.Notification = (function() {
  1212. function Notification(kind, value, exception, accept, acceptObservable, toString) {
  1213. this.kind = kind;
  1214. this.value = value;
  1215. this.exception = exception;
  1216. this._accept = accept;
  1217. this._acceptObservable = acceptObservable;
  1218. this.toString = toString;
  1219. }
  1220. Notification.prototype.accept = function(observerOrOnNext, onError, onCompleted) {
  1221. return observerOrOnNext && typeof observerOrOnNext === 'object' ? this._acceptObservable(observerOrOnNext) : this._accept(observerOrOnNext, onError, onCompleted);
  1222. };
  1223. Notification.prototype.toObservable = function(scheduler) {
  1224. var self = this;
  1225. isScheduler(scheduler) || (scheduler = immediateScheduler);
  1226. return new AnonymousObservable(function(observer) {
  1227. return scheduler.scheduleWithState(self, function(_, notification) {
  1228. notification._acceptObservable(observer);
  1229. notification.kind === 'N' && observer.onCompleted();
  1230. });
  1231. });
  1232. };
  1233. return Notification;
  1234. })();
  1235. var notificationCreateOnNext = Notification.createOnNext = (function() {
  1236. function _accept(onNext) {
  1237. return onNext(this.value);
  1238. }
  1239. function _acceptObservable(observer) {
  1240. return observer.onNext(this.value);
  1241. }
  1242. function toString() {
  1243. return 'OnNext(' + this.value + ')';
  1244. }
  1245. return function(value) {
  1246. return new Notification('N', value, null, _accept, _acceptObservable, toString);
  1247. };
  1248. }());
  1249. var notificationCreateOnError = Notification.createOnError = (function() {
  1250. function _accept(onNext, onError) {
  1251. return onError(this.exception);
  1252. }
  1253. function _acceptObservable(observer) {
  1254. return observer.onError(this.exception);
  1255. }
  1256. function toString() {
  1257. return 'OnError(' + this.exception + ')';
  1258. }
  1259. return function(e) {
  1260. return new Notification('E', null, e, _accept, _acceptObservable, toString);
  1261. };
  1262. }());
  1263. var notificationCreateOnCompleted = Notification.createOnCompleted = (function() {
  1264. function _accept(onNext, onError, onCompleted) {
  1265. return onCompleted();
  1266. }
  1267. function _acceptObservable(observer) {
  1268. return observer.onCompleted();
  1269. }
  1270. function toString() {
  1271. return 'OnCompleted()';
  1272. }
  1273. return function() {
  1274. return new Notification('C', null, null, _accept, _acceptObservable, toString);
  1275. };
  1276. }());
  1277. var Enumerator = Rx.internals.Enumerator = function(next) {
  1278. this._next = next;
  1279. };
  1280. Enumerator.prototype.next = function() {
  1281. return this._next();
  1282. };
  1283. Enumerator.prototype[$iterator$] = function() {
  1284. return this;
  1285. };
  1286. var Enumerable = Rx.internals.Enumerable = function(iterator) {
  1287. this._iterator = iterator;
  1288. };
  1289. Enumerable.prototype[$iterator$] = function() {
  1290. return this._iterator();
  1291. };
  1292. Enumerable.prototype.concat = function() {
  1293. var sources = this;
  1294. return new AnonymousObservable(function(o) {
  1295. var e = sources[$iterator$]();
  1296. var isDisposed,
  1297. subscription = new SerialDisposable();
  1298. var cancelable = immediateScheduler.scheduleRecursive(function(self) {
  1299. if (isDisposed) {
  1300. return ;
  1301. }
  1302. try {
  1303. var currentItem = e.next();
  1304. } catch (ex) {
  1305. return o.onError(ex);
  1306. }
  1307. if (currentItem.done) {
  1308. return o.onCompleted();
  1309. }
  1310. var currentValue = currentItem.value;
  1311. isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));
  1312. var d = new SingleAssignmentDisposable();
  1313. subscription.setDisposable(d);
  1314. d.setDisposable(currentValue.subscribe(function(x) {
  1315. o.onNext(x);
  1316. }, function(err) {
  1317. o.onError(err);
  1318. }, self));
  1319. });
  1320. return new CompositeDisposable(subscription, cancelable, disposableCreate(function() {
  1321. isDisposed = true;
  1322. }));
  1323. });
  1324. };
  1325. Enumerable.prototype.catchError = function() {
  1326. var sources = this;
  1327. return new AnonymousObservable(function(o) {
  1328. var e = sources[$iterator$]();
  1329. var isDisposed,
  1330. subscription = new SerialDisposable();
  1331. var cancelable = immediateScheduler.scheduleRecursiveWithState(null, function(lastException, self) {
  1332. if (isDisposed) {
  1333. return ;
  1334. }
  1335. try {
  1336. var currentItem = e.next();
  1337. } catch (ex) {
  1338. return observer.onError(ex);
  1339. }
  1340. if (currentItem.done) {
  1341. if (lastException !== null) {
  1342. o.onError(lastException);
  1343. } else {
  1344. o.onCompleted();
  1345. }
  1346. return ;
  1347. }
  1348. var currentValue = currentItem.value;
  1349. isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));
  1350. var d = new SingleAssignmentDisposable();
  1351. subscription.setDisposable(d);
  1352. d.setDisposable(currentValue.subscribe(function(x) {
  1353. o.onNext(x);
  1354. }, self, function() {
  1355. o.onCompleted();
  1356. }));
  1357. });
  1358. return new CompositeDisposable(subscription, cancelable, disposableCreate(function() {
  1359. isDisposed = true;
  1360. }));
  1361. });
  1362. };
  1363. Enumerable.prototype.catchErrorWhen = function(notificationHandler) {
  1364. var sources = this;
  1365. return new AnonymousObservable(function(o) {
  1366. var exceptions = new Subject(),
  1367. notifier = new Subject(),
  1368. handled = notificationHandler(exceptions),
  1369. notificationDisposable = handled.subscribe(notifier);
  1370. var e = sources[$iterator$]();
  1371. var isDisposed,
  1372. lastException,
  1373. subscription = new SerialDisposable();
  1374. var cancelable = immediateScheduler.scheduleRecursive(function(self) {
  1375. if (isDisposed) {
  1376. return ;
  1377. }
  1378. try {
  1379. var currentItem = e.next();
  1380. } catch (ex) {
  1381. return o.onError(ex);
  1382. }
  1383. if (currentItem.done) {
  1384. if (lastException) {
  1385. o.onError(lastException);
  1386. } else {
  1387. o.onCompleted();
  1388. }
  1389. return ;
  1390. }
  1391. var currentValue = currentItem.value;
  1392. isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));
  1393. var outer = new SingleAssignmentDisposable();
  1394. var inner = new SingleAssignmentDisposable();
  1395. subscription.setDisposable(new CompositeDisposable(inner, outer));
  1396. outer.setDisposable(currentValue.subscribe(function(x) {
  1397. o.onNext(x);
  1398. }, function(exn) {
  1399. inner.setDisposable(notifier.subscribe(self, function(ex) {
  1400. o.onError(ex);
  1401. }, function() {
  1402. o.onCompleted();
  1403. }));
  1404. exceptions.onNext(exn);
  1405. }, function() {
  1406. o.onCompleted();
  1407. }));
  1408. });
  1409. return new CompositeDisposable(notificationDisposable, subscription, cancelable, disposableCreate(function() {
  1410. isDisposed = true;
  1411. }));
  1412. });
  1413. };
  1414. var enumerableRepeat = Enumerable.repeat = function(value, repeatCount) {
  1415. if (repeatCount == null) {
  1416. repeatCount = -1;
  1417. }
  1418. return new Enumerable(function() {
  1419. var left = repeatCount;
  1420. return new Enumerator(function() {
  1421. if (left === 0) {
  1422. return doneEnumerator;
  1423. }
  1424. if (left > 0) {
  1425. left--;
  1426. }
  1427. return {
  1428. done: false,
  1429. value: value
  1430. };
  1431. });
  1432. });
  1433. };
  1434. var enumerableOf = Enumerable.of = function(source, selector, thisArg) {
  1435. if (selector) {
  1436. var selectorFn = bindCallback(selector, thisArg, 3);
  1437. }
  1438. return new Enumerable(function() {
  1439. var index = -1;
  1440. return new Enumerator(function() {
  1441. return ++index < source.length ? {
  1442. done: false,
  1443. value: !selector ? source[index] : selectorFn(source[index], index, source)
  1444. } : doneEnumerator;
  1445. });
  1446. });
  1447. };
  1448. var Observer = Rx.Observer = function() {};
  1449. Observer.prototype.toNotifier = function() {
  1450. var observer = this;
  1451. return function(n) {
  1452. return n.accept(observer);
  1453. };
  1454. };
  1455. Observer.prototype.asObserver = function() {
  1456. return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this));
  1457. };
  1458. Observer.prototype.checked = function() {
  1459. return new CheckedObserver(this);
  1460. };
  1461. var observerCreate = Observer.create = function(onNext, onError, onCompleted) {
  1462. onNext || (onNext = noop);
  1463. onError || (onError = defaultError);
  1464. onCompleted || (onCompleted = noop);
  1465. return new AnonymousObserver(onNext, onError, onCompleted);
  1466. };
  1467. Observer.fromNotifier = function(handler, thisArg) {
  1468. return new AnonymousObserver(function(x) {
  1469. return handler.call(thisArg, notificationCreateOnNext(x));
  1470. }, function(e) {
  1471. return handler.call(thisArg, notificationCreateOnError(e));
  1472. }, function() {
  1473. return handler.call(thisArg, notificationCreateOnCompleted());
  1474. });
  1475. };
  1476. Observer.prototype.notifyOn = function(scheduler) {
  1477. return new ObserveOnObserver(scheduler, this);
  1478. };
  1479. Observer.prototype.makeSafe = function(disposable) {
  1480. return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);
  1481. };
  1482. var AbstractObserver = Rx.internals.AbstractObserver = (function(__super__) {
  1483. inherits(AbstractObserver, __super__);
  1484. function AbstractObserver() {
  1485. this.isStopped = false;
  1486. __super__.call(this);
  1487. }
  1488. AbstractObserver.prototype.next = notImplemented;
  1489. AbstractObserver.prototype.error = notImplemented;
  1490. AbstractObserver.prototype.completed = notImplemented;
  1491. AbstractObserver.prototype.onNext = function(value) {
  1492. if (!this.isStopped) {
  1493. this.next(value);
  1494. }
  1495. };
  1496. AbstractObserver.prototype.onError = function(error) {
  1497. if (!this.isStopped) {
  1498. this.isStopped = true;
  1499. this.error(error);
  1500. }
  1501. };
  1502. AbstractObserver.prototype.onCompleted = function() {
  1503. if (!this.isStopped) {
  1504. this.isStopped = true;
  1505. this.completed();
  1506. }
  1507. };
  1508. AbstractObserver.prototype.dispose = function() {
  1509. this.isStopped = true;
  1510. };
  1511. AbstractObserver.prototype.fail = function(e) {
  1512. if (!this.isStopped) {
  1513. this.isStopped = true;
  1514. this.error(e);
  1515. return true;
  1516. }
  1517. return false;
  1518. };
  1519. return AbstractObserver;
  1520. }(Observer));
  1521. var AnonymousObserver = Rx.AnonymousObserver = (function(__super__) {
  1522. inherits(AnonymousObserver, __super__);
  1523. function AnonymousObserver(onNext, onError, onCompleted) {
  1524. __super__.call(this);
  1525. this._onNext = onNext;
  1526. this._onError = onError;
  1527. this._onCompleted = onCompleted;
  1528. }
  1529. AnonymousObserver.prototype.next = function(value) {
  1530. this._onNext(value);
  1531. };
  1532. AnonymousObserver.prototype.error = function(error) {
  1533. this._onError(error);
  1534. };
  1535. AnonymousObserver.prototype.completed = function() {
  1536. this._onCompleted();
  1537. };
  1538. return AnonymousObserver;
  1539. }(AbstractObserver));
  1540. var CheckedObserver = (function(__super__) {
  1541. inherits(CheckedObserver, __super__);
  1542. function CheckedObserver(observer) {
  1543. __super__.call(this);
  1544. this._observer = observer;
  1545. this._state = 0;
  1546. }
  1547. var CheckedObserverPrototype = CheckedObserver.prototype;
  1548. CheckedObserverPrototype.onNext = function(value) {
  1549. this.checkAccess();
  1550. var res = tryCatch(this._observer.onNext).call(this._observer, value);
  1551. this._state = 0;
  1552. res === errorObj && thrower(res.e);
  1553. };
  1554. CheckedObserverPrototype.onError = function(err) {
  1555. this.checkAccess();
  1556. var res = tryCatch(this._observer.onError).call(this._observer, err);
  1557. this._state = 2;
  1558. res === errorObj && thrower(res.e);
  1559. };
  1560. CheckedObserverPrototype.onCompleted = function() {
  1561. this.checkAccess();
  1562. var res = tryCatch(this._observer.onCompleted).call(this._observer);
  1563. this._state = 2;
  1564. res === errorObj && thrower(res.e);
  1565. };
  1566. CheckedObserverPrototype.checkAccess = function() {
  1567. if (this._state === 1) {
  1568. throw new Error('Re-entrancy detected');
  1569. }
  1570. if (this._state === 2) {
  1571. throw new Error('Observer completed');
  1572. }
  1573. if (this._state === 0) {
  1574. this._state = 1;
  1575. }
  1576. };
  1577. return CheckedObserver;
  1578. }(Observer));
  1579. var ScheduledObserver = Rx.internals.ScheduledObserver = (function(__super__) {
  1580. inherits(ScheduledObserver, __super__);
  1581. function ScheduledObserver(scheduler, observer) {
  1582. __super__.call(this);
  1583. this.scheduler = scheduler;
  1584. this.observer = observer;
  1585. this.isAcquired = false;
  1586. this.hasFaulted = false;
  1587. this.queue = [];
  1588. this.disposable = new SerialDisposable();
  1589. }
  1590. ScheduledObserver.prototype.next = function(value) {
  1591. var self = this;
  1592. this.queue.push(function() {
  1593. self.observer.onNext(value);
  1594. });
  1595. };
  1596. ScheduledObserver.prototype.error = function(e) {
  1597. var self = this;
  1598. this.queue.push(function() {
  1599. self.observer.onError(e);
  1600. });
  1601. };
  1602. ScheduledObserver.prototype.completed = function() {
  1603. var self = this;
  1604. this.queue.push(function() {
  1605. self.observer.onCompleted();
  1606. });
  1607. };
  1608. ScheduledObserver.prototype.ensureActive = function() {
  1609. var isOwner = false,
  1610. parent = this;
  1611. if (!this.hasFaulted && this.queue.length > 0) {
  1612. isOwner = !this.isAcquired;
  1613. this.isAcquired = true;
  1614. }
  1615. if (isOwner) {
  1616. this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(self) {
  1617. var work;
  1618. if (parent.queue.length > 0) {
  1619. work = parent.queue.shift();
  1620. } else {
  1621. parent.isAcquired = false;
  1622. return ;
  1623. }
  1624. try {
  1625. work();
  1626. } catch (ex) {
  1627. parent.queue = [];
  1628. parent.hasFaulted = true;
  1629. throw ex;
  1630. }
  1631. self();
  1632. }));
  1633. }
  1634. };
  1635. ScheduledObserver.prototype.dispose = function() {
  1636. __super__.prototype.dispose.call(this);
  1637. this.disposable.dispose();
  1638. };
  1639. return ScheduledObserver;
  1640. }(AbstractObserver));
  1641. var ObserveOnObserver = (function(__super__) {
  1642. inherits(ObserveOnObserver, __super__);
  1643. function ObserveOnObserver(scheduler, observer, cancel) {
  1644. __super__.call(this, scheduler, observer);
  1645. this._cancel = cancel;
  1646. }
  1647. ObserveOnObserver.prototype.next = function(value) {
  1648. __super__.prototype.next.call(this, value);
  1649. this.ensureActive();
  1650. };
  1651. ObserveOnObserver.prototype.error = function(e) {
  1652. __super__.prototype.error.call(this, e);
  1653. this.ensureActive();
  1654. };
  1655. ObserveOnObserver.prototype.completed = function() {
  1656. __super__.prototype.completed.call(this);
  1657. this.ensureActive();
  1658. };
  1659. ObserveOnObserver.prototype.dispose = function() {
  1660. __super__.prototype.dispose.call(this);
  1661. this._cancel && this._cancel.dispose();
  1662. this._cancel = null;
  1663. };
  1664. return ObserveOnObserver;
  1665. })(ScheduledObserver);
  1666. var observableProto;
  1667. var Observable = Rx.Observable = (function() {
  1668. function Observable(subscribe) {
  1669. if (Rx.config.longStackSupport && hasStacks) {
  1670. try {
  1671. throw new Error();
  1672. } catch (e) {
  1673. this.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
  1674. }
  1675. var self = this;
  1676. this._subscribe = function(observer) {
  1677. var oldOnError = observer.onError.bind(observer);
  1678. observer.onError = function(err) {
  1679. makeStackTraceLong(err, self);
  1680. oldOnError(err);
  1681. };
  1682. return subscribe.call(self, observer);
  1683. };
  1684. } else {
  1685. this._subscribe = subscribe;
  1686. }
  1687. }
  1688. observableProto = Observable.prototype;
  1689. observableProto.subscribe = observableProto.forEach = function(observerOrOnNext, onError, onCompleted) {
  1690. return this._subscribe(typeof observerOrOnNext === 'object' ? observerOrOnNext : observerCreate(observerOrOnNext, onError, onCompleted));
  1691. };
  1692. observableProto.subscribeOnNext = function(onNext, thisArg) {
  1693. return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) {
  1694. onNext.call(thisArg, x);
  1695. } : onNext));
  1696. };
  1697. observableProto.subscribeOnError = function(onError, thisArg) {
  1698. return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) {
  1699. onError.call(thisArg, e);
  1700. } : onError));
  1701. };
  1702. observableProto.subscribeOnCompleted = function(onCompleted, thisArg) {
  1703. return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() {
  1704. onCompleted.call(thisArg);
  1705. } : onCompleted));
  1706. };
  1707. return Observable;
  1708. })();
  1709. var ObservableBase = Rx.ObservableBase = (function(__super__) {
  1710. inherits(ObservableBase, __super__);
  1711. function fixSubscriber(subscriber) {
  1712. return subscriber && isFunction(subscriber.dispose) ? subscriber : isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;
  1713. }
  1714. function setDisposable(s, state) {
  1715. var ado = state[0],
  1716. self = state[1];
  1717. var sub = tryCatch(self.subscribeCore).call(self, ado);
  1718. if (sub === errorObj) {
  1719. if (!ado.fail(errorObj.e)) {
  1720. return thrower(errorObj.e);
  1721. }
  1722. }
  1723. ado.setDisposable(fixSubscriber(sub));
  1724. }
  1725. function subscribe(observer) {
  1726. var ado = new AutoDetachObserver(observer),
  1727. state = [ado, this];
  1728. if (currentThreadScheduler.scheduleRequired()) {
  1729. currentThreadScheduler.scheduleWithState(state, setDisposable);
  1730. } else {
  1731. setDisposable(null, state);
  1732. }
  1733. return ado;
  1734. }
  1735. function ObservableBase() {
  1736. __super__.call(this, subscribe);
  1737. }
  1738. ObservableBase.prototype.subscribeCore = notImplemented;
  1739. return ObservableBase;
  1740. }(Observable));
  1741. observableProto.observeOn = function(scheduler) {
  1742. var source = this;
  1743. return new AnonymousObservable(function(observer) {
  1744. return source.subscribe(new ObserveOnObserver(scheduler, observer));
  1745. }, source);
  1746. };
  1747. observableProto.subscribeOn = function(scheduler) {
  1748. var source = this;
  1749. return new AnonymousObservable(function(observer) {
  1750. var m = new SingleAssignmentDisposable(),
  1751. d = new SerialDisposable();
  1752. d.setDisposable(m);
  1753. m.setDisposable(scheduler.schedule(function() {
  1754. d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer)));
  1755. }));
  1756. return d;
  1757. }, source);
  1758. };
  1759. var observableFromPromise = Observable.fromPromise = function(promise) {
  1760. return observableDefer(function() {
  1761. var subject = new Rx.AsyncSubject();
  1762. promise.then(function(value) {
  1763. subject.onNext(value);
  1764. subject.onCompleted();
  1765. }, subject.onError.bind(subject));
  1766. return subject;
  1767. });
  1768. };
  1769. observableProto.toPromise = function(promiseCtor) {
  1770. promiseCtor || (promiseCtor = Rx.config.Promise);
  1771. if (!promiseCtor) {
  1772. throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise');
  1773. }
  1774. var source = this;
  1775. return new promiseCtor(function(resolve, reject) {
  1776. var value,
  1777. hasValue = false;
  1778. source.subscribe(function(v) {
  1779. value = v;
  1780. hasValue = true;
  1781. }, reject, function() {
  1782. hasValue && resolve(value);
  1783. });
  1784. });
  1785. };
  1786. var ToArrayObservable = (function(__super__) {
  1787. inherits(ToArrayObservable, __super__);
  1788. function ToArrayObservable(source) {
  1789. this.source = source;
  1790. __super__.call(this);
  1791. }
  1792. ToArrayObservable.prototype.subscribeCore = function(observer) {
  1793. return this.source.subscribe(new ToArrayObserver(observer));
  1794. };
  1795. return ToArrayObservable;
  1796. }(ObservableBase));
  1797. function ToArrayObserver(observer) {
  1798. this.observer = observer;
  1799. this.a = [];
  1800. this.isStopped = false;
  1801. }
  1802. ToArrayObserver.prototype.onNext = function(x) {
  1803. if (!this.isStopped) {
  1804. this.a.push(x);
  1805. }
  1806. };
  1807. ToArrayObserver.prototype.onError = function(e) {
  1808. if (!this.isStopped) {
  1809. this.isStopped = true;
  1810. this.observer.onError(e);
  1811. }
  1812. };
  1813. ToArrayObserver.prototype.onCompleted = function() {
  1814. if (!this.isStopped) {
  1815. this.isStopped = true;
  1816. this.observer.onNext(this.a);
  1817. this.observer.onCompleted();
  1818. }
  1819. };
  1820. ToArrayObserver.prototype.dispose = function() {
  1821. this.isStopped = true;
  1822. };
  1823. ToArrayObserver.prototype.fail = function(e) {
  1824. if (!this.isStopped) {
  1825. this.isStopped = true;
  1826. this.observer.onError(e);
  1827. return true;
  1828. }
  1829. return false;
  1830. };
  1831. observableProto.toArray = function() {
  1832. return new ToArrayObservable(this);
  1833. };
  1834. Observable.create = Observable.createWithDisposable = function(subscribe, parent) {
  1835. return new AnonymousObservable(subscribe, parent);
  1836. };
  1837. var observableDefer = Observable.defer = function(observableFactory) {
  1838. return new AnonymousObservable(function(observer) {
  1839. var result;
  1840. try {
  1841. result = observableFactory();
  1842. } catch (e) {
  1843. return observableThrow(e).subscribe(observer);
  1844. }
  1845. isPromise(result) && (result = observableFromPromise(result));
  1846. return result.subscribe(observer);
  1847. });
  1848. };
  1849. var observableEmpty = Observable.empty = function(scheduler) {
  1850. isScheduler(scheduler) || (scheduler = immediateScheduler);
  1851. return new AnonymousObservable(function(observer) {
  1852. return scheduler.scheduleWithState(null, function() {
  1853. observer.onCompleted();
  1854. });
  1855. });
  1856. };
  1857. var FromObservable = (function(__super__) {
  1858. inherits(FromObservable, __super__);
  1859. function FromObservable(iterable, mapper, scheduler) {
  1860. this.iterable = iterable;
  1861. this.mapper = mapper;
  1862. this.scheduler = scheduler;
  1863. __super__.call(this);
  1864. }
  1865. FromObservable.prototype.subscribeCore = function(observer) {
  1866. var sink = new FromSink(observer, this);
  1867. return sink.run();
  1868. };
  1869. return FromObservable;
  1870. }(ObservableBase));
  1871. var FromSink = (function() {
  1872. function FromSink(observer, parent) {
  1873. this.observer = observer;
  1874. this.parent = parent;
  1875. }
  1876. FromSink.prototype.run = function() {
  1877. var list = Object(this.parent.iterable),
  1878. it = getIterable(list),
  1879. observer = this.observer,
  1880. mapper = this.parent.mapper;
  1881. function loopRecursive(i, recurse) {
  1882. try {
  1883. var next = it.next();
  1884. } catch (e) {
  1885. return observer.onError(e);
  1886. }
  1887. if (next.done) {
  1888. return observer.onCompleted();
  1889. }
  1890. var result = next.value;
  1891. if (mapper) {
  1892. try {
  1893. result = mapper(result, i);
  1894. } catch (e) {
  1895. return observer.onError(e);
  1896. }
  1897. }
  1898. observer.onNext(result);
  1899. recurse(i + 1);
  1900. }
  1901. return this.parent.scheduler.scheduleRecursiveWithState(0, loopRecursive);
  1902. };
  1903. return FromSink;
  1904. }());
  1905. var maxSafeInteger = Math.pow(2, 53) - 1;
  1906. function StringIterable(str) {
  1907. this._s = s;
  1908. }
  1909. StringIterable.prototype[$iterator$] = function() {
  1910. return new StringIterator(this._s);
  1911. };
  1912. function StringIterator(str) {
  1913. this._s = s;
  1914. this._l = s.length;
  1915. this._i = 0;
  1916. }
  1917. StringIterator.prototype[$iterator$] = function() {
  1918. return this;
  1919. };
  1920. StringIterator.prototype.next = function() {
  1921. return this._i < this._l ? {
  1922. done: false,
  1923. value: this._s.charAt(this._i++)
  1924. } : doneEnumerator;
  1925. };
  1926. function ArrayIterable(a) {
  1927. this._a = a;
  1928. }
  1929. ArrayIterable.prototype[$iterator$] = function() {
  1930. return new ArrayIterator(this._a);
  1931. };
  1932. function ArrayIterator(a) {
  1933. this._a = a;
  1934. this._l = toLength(a);
  1935. this._i = 0;
  1936. }
  1937. ArrayIterator.prototype[$iterator$] = function() {
  1938. return this;
  1939. };
  1940. ArrayIterator.prototype.next = function() {
  1941. return this._i < this._l ? {
  1942. done: false,
  1943. value: this._a[this._i++]
  1944. } : doneEnumerator;
  1945. };
  1946. function numberIsFinite(value) {
  1947. return typeof value === 'number' && root.isFinite(value);
  1948. }
  1949. function isNan(n) {
  1950. return n !== n;
  1951. }
  1952. function getIterable(o) {
  1953. var i = o[$iterator$],
  1954. it;
  1955. if (!i && typeof o === 'string') {
  1956. it = new StringIterable(o);
  1957. return it[$iterator$]();
  1958. }
  1959. if (!i && o.length !== undefined) {
  1960. it = new ArrayIterable(o);
  1961. return it[$iterator$]();
  1962. }
  1963. if (!i) {
  1964. throw new TypeError('Object is not iterable');
  1965. }
  1966. return o[$iterator$]();
  1967. }
  1968. function sign(value) {
  1969. var number = +value;
  1970. if (number === 0) {
  1971. return number;
  1972. }
  1973. if (isNaN(number)) {
  1974. return number;
  1975. }
  1976. return number < 0 ? -1 : 1;
  1977. }
  1978. function toLength(o) {
  1979. var len = +o.length;
  1980. if (isNaN(len)) {
  1981. return 0;
  1982. }
  1983. if (len === 0 || !numberIsFinite(len)) {
  1984. return len;
  1985. }
  1986. len = sign(len) * Math.floor(Math.abs(len));
  1987. if (len <= 0) {
  1988. return 0;
  1989. }
  1990. if (len > maxSafeInteger) {
  1991. return maxSafeInteger;
  1992. }
  1993. return len;
  1994. }
  1995. var observableFrom = Observable.from = function(iterable, mapFn, thisArg, scheduler) {
  1996. if (iterable == null) {
  1997. throw new Error('iterable cannot be null.');
  1998. }
  1999. if (mapFn && !isFunction(mapFn)) {
  2000. throw new Error('mapFn when provided must be a function');
  2001. }
  2002. if (mapFn) {
  2003. var mapper = bindCallback(mapFn, thisArg, 2);
  2004. }
  2005. isScheduler(scheduler) || (scheduler = currentThreadScheduler);
  2006. return new FromObservable(iterable, mapper, scheduler);
  2007. };
  2008. var FromArrayObservable = (function(__super__) {
  2009. inherits(FromArrayObservable, __super__);
  2010. function FromArrayObservable(args, scheduler) {
  2011. this.args = args;
  2012. this.scheduler = scheduler;
  2013. __super__.call(this);
  2014. }
  2015. FromArrayObservable.prototype.subscribeCore = function(observer) {
  2016. var sink = new FromArraySink(observer, this);
  2017. return sink.run();
  2018. };
  2019. return FromArrayObservable;
  2020. }(ObservableBase));
  2021. function FromArraySink(observer, parent) {
  2022. this.observer = observer;
  2023. this.parent = parent;
  2024. }
  2025. FromArraySink.prototype.run = function() {
  2026. var observer = this.observer,
  2027. args = this.parent.args,
  2028. len = args.length;
  2029. function loopRecursive(i, recurse) {
  2030. if (i < len) {
  2031. observer.onNext(args[i]);
  2032. recurse(i + 1);
  2033. } else {
  2034. observer.onCompleted();
  2035. }
  2036. }
  2037. return this.parent.scheduler.scheduleRecursiveWithState(0, loopRecursive);
  2038. };
  2039. var observableFromArray = Observable.fromArray = function(array, scheduler) {
  2040. isScheduler(scheduler) || (scheduler = currentThreadScheduler);
  2041. return new FromArrayObservable(array, scheduler);
  2042. };
  2043. Observable.generate = function(initialState, condition, iterate, resultSelector, scheduler) {
  2044. isScheduler(scheduler) || (scheduler = currentThreadScheduler);
  2045. return new AnonymousObservable(function(o) {
  2046. var first = true;
  2047. return scheduler.scheduleRecursiveWithState(initialState, function(state, self) {
  2048. var hasResult,
  2049. result;
  2050. try {
  2051. if (first) {
  2052. first = false;
  2053. } else {
  2054. state = iterate(state);
  2055. }
  2056. hasResult = condition(state);
  2057. hasResult && (result = resultSelector(state));
  2058. } catch (e) {
  2059. return o.onError(e);
  2060. }
  2061. if (hasResult) {
  2062. o.onNext(result);
  2063. self(state);
  2064. } else {
  2065. o.onCompleted();
  2066. }
  2067. });
  2068. });
  2069. };
  2070. function observableOf(scheduler, array) {
  2071. isScheduler(scheduler) || (scheduler = currentThreadScheduler);
  2072. return new FromArrayObservable(array, scheduler);
  2073. }
  2074. Observable.of = function() {
  2075. var len = arguments.length,
  2076. args = new Array(len);
  2077. for (var i = 0; i < len; i++) {
  2078. args[i] = arguments[i];
  2079. }
  2080. return new FromArrayObservable(args, currentThreadScheduler);
  2081. };
  2082. Observable.ofWithScheduler = function(scheduler) {
  2083. var len = arguments.length,
  2084. args = new Array(len - 1);
  2085. for (var i = 1; i < len; i++) {
  2086. args[i - 1] = arguments[i];
  2087. }
  2088. return new FromArrayObservable(args, scheduler);
  2089. };
  2090. Observable.ofArrayChanges = function(array) {
  2091. if (!Array.isArray(array)) {
  2092. throw new TypeError('Array.observe only accepts arrays.');
  2093. }
  2094. if (typeof Array.observe !== 'function' && typeof Array.unobserve !== 'function') {
  2095. throw new TypeError('Array.observe is not supported on your platform');
  2096. }
  2097. return new AnonymousObservable(function(observer) {
  2098. function observerFn(changes) {
  2099. for (var i = 0,
  2100. len = changes.length; i < len; i++) {
  2101. observer.onNext(changes[i]);
  2102. }
  2103. }
  2104. Array.observe(array, observerFn);
  2105. return function() {
  2106. Array.unobserve(array, observerFn);
  2107. };
  2108. });
  2109. };
  2110. Observable.ofObjectChanges = function(obj) {
  2111. if (obj == null) {
  2112. throw new TypeError('object must not be null or undefined.');
  2113. }
  2114. if (typeof Object.observe !== 'function' && typeof Object.unobserve !== 'function') {
  2115. throw new TypeError('Array.observe is not supported on your platform');
  2116. }
  2117. return new AnonymousObservable(function(observer) {
  2118. function observerFn(changes) {
  2119. for (var i = 0,
  2120. len = changes.length; i < len; i++) {
  2121. observer.onNext(changes[i]);
  2122. }
  2123. }
  2124. Object.observe(obj, observerFn);
  2125. return function() {
  2126. Object.unobserve(obj, observerFn);
  2127. };
  2128. });
  2129. };
  2130. var observableNever = Observable.never = function() {
  2131. return new AnonymousObservable(function() {
  2132. return disposableEmpty;
  2133. });
  2134. };
  2135. Observable.pairs = function(obj, scheduler) {
  2136. scheduler || (scheduler = Rx.Scheduler.currentThread);
  2137. return new AnonymousObservable(function(observer) {
  2138. var keys = Object.keys(obj),
  2139. len = keys.length;
  2140. return scheduler.scheduleRecursiveWithState(0, function(idx, self) {
  2141. if (idx < len) {
  2142. var key = keys[idx];
  2143. observer.onNext([key, obj[key]]);
  2144. self(idx + 1);
  2145. } else {
  2146. observer.onCompleted();
  2147. }
  2148. });
  2149. });
  2150. };
  2151. var RangeObservable = (function(__super__) {
  2152. inherits(RangeObservable, __super__);
  2153. function RangeObservable(start, count, scheduler) {
  2154. this.start = start;
  2155. this.count = count;
  2156. this.scheduler = scheduler;
  2157. __super__.call(this);
  2158. }
  2159. RangeObservable.prototype.subscribeCore = function(observer) {
  2160. var sink = new RangeSink(observer, this);
  2161. return sink.run();
  2162. };
  2163. return RangeObservable;
  2164. }(ObservableBase));
  2165. var RangeSink = (function() {
  2166. function RangeSink(observer, parent) {
  2167. this.observer = observer;
  2168. this.parent = parent;
  2169. }
  2170. RangeSink.prototype.run = function() {
  2171. var start = this.parent.start,
  2172. count = this.parent.count,
  2173. observer = this.observer;
  2174. function loopRecursive(i, recurse) {
  2175. if (i < count) {
  2176. observer.onNext(start + i);
  2177. recurse(i + 1);
  2178. } else {
  2179. observer.onCompleted();
  2180. }
  2181. }
  2182. return this.parent.scheduler.scheduleRecursiveWithState(0, loopRecursive);
  2183. };
  2184. return RangeSink;
  2185. }());
  2186. Observable.range = function(start, count, scheduler) {
  2187. isScheduler(scheduler) || (scheduler = currentThreadScheduler);
  2188. return new RangeObservable(start, count, scheduler);
  2189. };
  2190. Observable.repeat = function(value, repeatCount, scheduler) {
  2191. isScheduler(scheduler) || (scheduler = currentThreadScheduler);
  2192. return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);
  2193. };
  2194. var observableReturn = Observable['return'] = Observable.just = Observable.returnValue = function(value, scheduler) {
  2195. isScheduler(scheduler) || (scheduler = immediateScheduler);
  2196. return new AnonymousObservable(function(o) {
  2197. return scheduler.scheduleWithState(value, function(_, v) {
  2198. o.onNext(v);
  2199. o.onCompleted();
  2200. });
  2201. });
  2202. };
  2203. var observableThrow = Observable['throw'] = Observable.throwError = function(error, scheduler) {
  2204. isScheduler(scheduler) || (scheduler = immediateScheduler);
  2205. return new AnonymousObservable(function(observer) {
  2206. return scheduler.schedule(function() {
  2207. observer.onError(error);
  2208. });
  2209. });
  2210. };
  2211. Observable.throwException = function() {
  2212. return Observable.throwError.apply(null, arguments);
  2213. };
  2214. Observable.using = function(resourceFactory, observableFactory) {
  2215. return new AnonymousObservable(function(observer) {
  2216. var disposable = disposableEmpty,
  2217. resource,
  2218. source;
  2219. try {
  2220. resource = resourceFactory();
  2221. resource && (disposable = resource);
  2222. source = observableFactory(resource);
  2223. } catch (exception) {
  2224. return new CompositeDisposable(observableThrow(exception).subscribe(observer), disposable);
  2225. }
  2226. return new CompositeDisposable(source.subscribe(observer), disposable);
  2227. });
  2228. };
  2229. observableProto.amb = function(rightSource) {
  2230. var leftSource = this;
  2231. return new AnonymousObservable(function(observer) {
  2232. var choice,
  2233. leftChoice = 'L',
  2234. rightChoice = 'R',
  2235. leftSubscription = new SingleAssignmentDisposable(),
  2236. rightSubscription = new SingleAssignmentDisposable();
  2237. isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));
  2238. function choiceL() {
  2239. if (!choice) {
  2240. choice = leftChoice;
  2241. rightSubscription.dispose();
  2242. }
  2243. }
  2244. function choiceR() {
  2245. if (!choice) {
  2246. choice = rightChoice;
  2247. leftSubscription.dispose();
  2248. }
  2249. }
  2250. leftSubscription.setDisposable(leftSource.subscribe(function(left) {
  2251. choiceL();
  2252. if (choice === leftChoice) {
  2253. observer.onNext(left);
  2254. }
  2255. }, function(err) {
  2256. choiceL();
  2257. if (choice === leftChoice) {
  2258. observer.onError(err);
  2259. }
  2260. }, function() {
  2261. choiceL();
  2262. if (choice === leftChoice) {
  2263. observer.onCompleted();
  2264. }
  2265. }));
  2266. rightSubscription.setDisposable(rightSource.subscribe(function(right) {
  2267. choiceR();
  2268. if (choice === rightChoice) {
  2269. observer.onNext(right);
  2270. }
  2271. }, function(err) {
  2272. choiceR();
  2273. if (choice === rightChoice) {
  2274. observer.onError(err);
  2275. }
  2276. }, function() {
  2277. choiceR();
  2278. if (choice === rightChoice) {
  2279. observer.onCompleted();
  2280. }
  2281. }));
  2282. return new CompositeDisposable(leftSubscription, rightSubscription);
  2283. });
  2284. };
  2285. Observable.amb = function() {
  2286. var acc = observableNever(),
  2287. items = [];
  2288. if (Array.isArray(arguments[0])) {
  2289. items = arguments[0];
  2290. } else {
  2291. for (var i = 0,
  2292. len = arguments.length; i < len; i++) {
  2293. items.push(arguments[i]);
  2294. }
  2295. }
  2296. function func(previous, current) {
  2297. return previous.amb(current);
  2298. }
  2299. for (var i = 0,
  2300. len = items.length; i < len; i++) {
  2301. acc = func(acc, items[i]);
  2302. }
  2303. return acc;
  2304. };
  2305. function observableCatchHandler(source, handler) {
  2306. return new AnonymousObservable(function(o) {
  2307. var d1 = new SingleAssignmentDisposable(),
  2308. subscription = new SerialDisposable();
  2309. subscription.setDisposable(d1);
  2310. d1.setDisposable(source.subscribe(function(x) {
  2311. o.onNext(x);
  2312. }, function(e) {
  2313. try {
  2314. var result = handler(e);
  2315. } catch (ex) {
  2316. return o.onError(ex);
  2317. }
  2318. isPromise(result) && (result = observableFromPromise(result));
  2319. var d = new SingleAssignmentDisposable();
  2320. subscription.setDisposable(d);
  2321. d.setDisposable(result.subscribe(o));
  2322. }, function(x) {
  2323. o.onCompleted(x);
  2324. }));
  2325. return subscription;
  2326. }, source);
  2327. }
  2328. observableProto['catch'] = observableProto.catchError = observableProto.catchException = function(handlerOrSecond) {
  2329. return typeof handlerOrSecond === 'function' ? observableCatchHandler(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);
  2330. };
  2331. var observableCatch = Observable.catchError = Observable['catch'] = Observable.catchException = function() {
  2332. var items = [];
  2333. if (Array.isArray(arguments[0])) {
  2334. items = arguments[0];
  2335. } else {
  2336. for (var i = 0,
  2337. len = arguments.length; i < len; i++) {
  2338. items.push(arguments[i]);
  2339. }
  2340. }
  2341. return enumerableOf(items).catchError();
  2342. };
  2343. observableProto.combineLatest = function() {
  2344. var len = arguments.length,
  2345. args = new Array(len);
  2346. for (var i = 0; i < len; i++) {
  2347. args[i] = arguments[i];
  2348. }
  2349. if (Array.isArray(args[0])) {
  2350. args[0].unshift(this);
  2351. } else {
  2352. args.unshift(this);
  2353. }
  2354. return combineLatest.apply(this, args);
  2355. };
  2356. var combineLatest = Observable.combineLatest = function() {
  2357. var len = arguments.length,
  2358. args = new Array(len);
  2359. for (var i = 0; i < len; i++) {
  2360. args[i] = arguments[i];
  2361. }
  2362. var resultSelector = args.pop();
  2363. Array.isArray(args[0]) && (args = args[0]);
  2364. return new AnonymousObservable(function(o) {
  2365. var n = args.length,
  2366. falseFactory = function() {
  2367. return false;
  2368. },
  2369. hasValue = arrayInitialize(n, falseFactory),
  2370. hasValueAll = false,
  2371. isDone = arrayInitialize(n, falseFactory),
  2372. values = new Array(n);
  2373. function next(i) {
  2374. hasValue[i] = true;
  2375. if (hasValueAll || (hasValueAll = hasValue.every(identity))) {
  2376. try {
  2377. var res = resultSelector.apply(null, values);
  2378. } catch (e) {
  2379. return o.onError(e);
  2380. }
  2381. o.onNext(res);
  2382. } else if (isDone.filter(function(x, j) {
  2383. return j !== i;
  2384. }).every(identity)) {
  2385. o.onCompleted();
  2386. }
  2387. }
  2388. function done(i) {
  2389. isDone[i] = true;
  2390. isDone.every(identity) && o.onCompleted();
  2391. }
  2392. var subscriptions = new Array(n);
  2393. for (var idx = 0; idx < n; idx++) {
  2394. (function(i) {
  2395. var source = args[i],
  2396. sad = new SingleAssignmentDisposable();
  2397. isPromise(source) && (source = observableFromPromise(source));
  2398. sad.setDisposable(source.subscribe(function(x) {
  2399. values[i] = x;
  2400. next(i);
  2401. }, function(e) {
  2402. o.onError(e);
  2403. }, function() {
  2404. done(i);
  2405. }));
  2406. subscriptions[i] = sad;
  2407. }(idx));
  2408. }
  2409. return new CompositeDisposable(subscriptions);
  2410. }, this);
  2411. };
  2412. observableProto.concat = function() {
  2413. for (var args = [],
  2414. i = 0,
  2415. len = arguments.length; i < len; i++) {
  2416. args.push(arguments[i]);
  2417. }
  2418. args.unshift(this);
  2419. return observableConcat.apply(null, args);
  2420. };
  2421. var observableConcat = Observable.concat = function() {
  2422. var args;
  2423. if (Array.isArray(arguments[0])) {
  2424. args = arguments[0];
  2425. } else {
  2426. args = new Array(arguments.length);
  2427. for (var i = 0,
  2428. len = arguments.length; i < len; i++) {
  2429. args[i] = arguments[i];
  2430. }
  2431. }
  2432. return enumerableOf(args).concat();
  2433. };
  2434. observableProto.concatAll = observableProto.concatObservable = function() {
  2435. return this.merge(1);
  2436. };
  2437. var MergeObservable = (function(__super__) {
  2438. inherits(MergeObservable, __super__);
  2439. function MergeObservable(source, maxConcurrent) {
  2440. this.source = source;
  2441. this.maxConcurrent = maxConcurrent;
  2442. __super__.call(this);
  2443. }
  2444. MergeObservable.prototype.subscribeCore = function(observer) {
  2445. var g = new CompositeDisposable();
  2446. g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));
  2447. return g;
  2448. };
  2449. return MergeObservable;
  2450. }(ObservableBase));
  2451. var MergeObserver = (function() {
  2452. function MergeObserver(o, max, g) {
  2453. this.o = o;
  2454. this.max = max;
  2455. this.g = g;
  2456. this.done = false;
  2457. this.q = [];
  2458. this.activeCount = 0;
  2459. this.isStopped = false;
  2460. }
  2461. MergeObserver.prototype.handleSubscribe = function(xs) {
  2462. var sad = new SingleAssignmentDisposable();
  2463. this.g.add(sad);
  2464. isPromise(xs) && (xs = observableFromPromise(xs));
  2465. sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));
  2466. };
  2467. MergeObserver.prototype.onNext = function(innerSource) {
  2468. if (this.isStopped) {
  2469. return ;
  2470. }
  2471. if (this.activeCount < this.max) {
  2472. this.activeCount++;
  2473. this.handleSubscribe(innerSource);
  2474. } else {
  2475. this.q.push(innerSource);
  2476. }
  2477. };
  2478. MergeObserver.prototype.onError = function(e) {
  2479. if (!this.isStopped) {
  2480. this.isStopped = true;
  2481. this.o.onError(e);
  2482. }
  2483. };
  2484. MergeObserver.prototype.onCompleted = function() {
  2485. if (!this.isStopped) {
  2486. this.isStopped = true;
  2487. this.done = true;
  2488. this.activeCount === 0 && this.o.onCompleted();
  2489. }
  2490. };
  2491. MergeObserver.prototype.dispose = function() {
  2492. this.isStopped = true;
  2493. };
  2494. MergeObserver.prototype.fail = function(e) {
  2495. if (!this.isStopped) {
  2496. this.isStopped = true;
  2497. this.o.onError(e);
  2498. return true;
  2499. }
  2500. return false;
  2501. };
  2502. function InnerObserver(parent, sad) {
  2503. this.parent = parent;
  2504. this.sad = sad;
  2505. this.isStopped = false;
  2506. }
  2507. InnerObserver.prototype.onNext = function(x) {
  2508. if (!this.isStopped) {
  2509. this.parent.o.onNext(x);
  2510. }
  2511. };
  2512. InnerObserver.prototype.onError = function(e) {
  2513. if (!this.isStopped) {
  2514. this.isStopped = true;
  2515. this.parent.o.onError(e);
  2516. }
  2517. };
  2518. InnerObserver.prototype.onCompleted = function() {
  2519. if (!this.isStopped) {
  2520. this.isStopped = true;
  2521. var parent = this.parent;
  2522. parent.g.remove(this.sad);
  2523. if (parent.q.length > 0) {
  2524. parent.handleSubscribe(parent.q.shift());
  2525. } else {
  2526. parent.activeCount--;
  2527. parent.done && parent.activeCount === 0 && parent.o.onCompleted();
  2528. }
  2529. }
  2530. };
  2531. InnerObserver.prototype.dispose = function() {
  2532. this.isStopped = true;
  2533. };
  2534. InnerObserver.prototype.fail = function(e) {
  2535. if (!this.isStopped) {
  2536. this.isStopped = true;
  2537. this.parent.o.onError(e);
  2538. return true;
  2539. }
  2540. return false;
  2541. };
  2542. return MergeObserver;
  2543. }());
  2544. observableProto.merge = function(maxConcurrentOrOther) {
  2545. return typeof maxConcurrentOrOther !== 'number' ? observableMerge(this, maxConcurrentOrOther) : new MergeObservable(this, maxConcurrentOrOther);
  2546. };
  2547. var observableMerge = Observable.merge = function() {
  2548. var scheduler,
  2549. sources = [],
  2550. i,
  2551. len = arguments.length;
  2552. if (!arguments[0]) {
  2553. scheduler = immediateScheduler;
  2554. for (i = 1; i < len; i++) {
  2555. sources.push(arguments[i]);
  2556. }
  2557. } else if (isScheduler(arguments[0])) {
  2558. scheduler = arguments[0];
  2559. for (i = 1; i < len; i++) {
  2560. sources.push(arguments[i]);
  2561. }
  2562. } else {
  2563. scheduler = immediateScheduler;
  2564. for (i = 0; i < len; i++) {
  2565. sources.push(arguments[i]);
  2566. }
  2567. }
  2568. if (Array.isArray(sources[0])) {
  2569. sources = sources[0];
  2570. }
  2571. return observableOf(scheduler, sources).mergeAll();
  2572. };
  2573. var MergeAllObservable = (function(__super__) {
  2574. inherits(MergeAllObservable, __super__);
  2575. function MergeAllObservable(source) {
  2576. this.source = source;
  2577. __super__.call(this);
  2578. }
  2579. MergeAllObservable.prototype.subscribeCore = function(observer) {
  2580. var g = new CompositeDisposable(),
  2581. m = new SingleAssignmentDisposable();
  2582. g.add(m);
  2583. m.setDisposable(this.source.subscribe(new MergeAllObserver(observer, g)));
  2584. return g;
  2585. };
  2586. return MergeAllObservable;
  2587. }(ObservableBase));
  2588. var MergeAllObserver = (function() {
  2589. function MergeAllObserver(o, g) {
  2590. this.o = o;
  2591. this.g = g;
  2592. this.isStopped = false;
  2593. this.done = false;
  2594. }
  2595. MergeAllObserver.prototype.onNext = function(innerSource) {
  2596. if (this.isStopped) {
  2597. return ;
  2598. }
  2599. var sad = new SingleAssignmentDisposable();
  2600. this.g.add(sad);
  2601. isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
  2602. sad.setDisposable(innerSource.subscribe(new InnerObserver(this, this.g, sad)));
  2603. };
  2604. MergeAllObserver.prototype.onError = function(e) {
  2605. if (!this.isStopped) {
  2606. this.isStopped = true;
  2607. this.o.onError(e);
  2608. }
  2609. };
  2610. MergeAllObserver.prototype.onCompleted = function() {
  2611. if (!this.isStopped) {
  2612. this.isStopped = true;
  2613. this.done = true;
  2614. this.g.length === 1 && this.o.onCompleted();
  2615. }
  2616. };
  2617. MergeAllObserver.prototype.dispose = function() {
  2618. this.isStopped = true;
  2619. };
  2620. MergeAllObserver.prototype.fail = function(e) {
  2621. if (!this.isStopped) {
  2622. this.isStopped = true;
  2623. this.o.onError(e);
  2624. return true;
  2625. }
  2626. return false;
  2627. };
  2628. function InnerObserver(parent, g, sad) {
  2629. this.parent = parent;
  2630. this.g = g;
  2631. this.sad = sad;
  2632. this.isStopped = false;
  2633. }
  2634. InnerObserver.prototype.onNext = function(x) {
  2635. if (!this.isStopped) {
  2636. this.parent.o.onNext(x);
  2637. }
  2638. };
  2639. InnerObserver.prototype.onError = function(e) {
  2640. if (!this.isStopped) {
  2641. this.isStopped = true;
  2642. this.parent.o.onError(e);
  2643. }
  2644. };
  2645. InnerObserver.prototype.onCompleted = function() {
  2646. if (!this.isStopped) {
  2647. var parent = this.parent;
  2648. this.isStopped = true;
  2649. parent.g.remove(this.sad);
  2650. parent.done && parent.g.length === 1 && parent.o.onCompleted();
  2651. }
  2652. };
  2653. InnerObserver.prototype.dispose = function() {
  2654. this.isStopped = true;
  2655. };
  2656. InnerObserver.prototype.fail = function(e) {
  2657. if (!this.isStopped) {
  2658. this.isStopped = true;
  2659. this.parent.o.onError(e);
  2660. return true;
  2661. }
  2662. return false;
  2663. };
  2664. return MergeAllObserver;
  2665. }());
  2666. observableProto.mergeAll = observableProto.mergeObservable = function() {
  2667. return new MergeAllObservable(this);
  2668. };
  2669. var CompositeError = Rx.CompositeError = function(errors) {
  2670. this.name = "NotImplementedError";
  2671. this.innerErrors = errors;
  2672. this.message = 'This contains multiple errors. Check the innerErrors';
  2673. Error.call(this);
  2674. };
  2675. CompositeError.prototype = Error.prototype;
  2676. Observable.mergeDelayError = function() {
  2677. var args;
  2678. if (Array.isArray(arguments[0])) {
  2679. args = arguments[0];
  2680. } else {
  2681. var len = arguments.length;
  2682. args = new Array(len);
  2683. for (var i = 0; i < len; i++) {
  2684. args[i] = arguments[i];
  2685. }
  2686. }
  2687. var source = observableOf(null, args);
  2688. return new AnonymousObservable(function(o) {
  2689. var group = new CompositeDisposable(),
  2690. m = new SingleAssignmentDisposable(),
  2691. isStopped = false,
  2692. errors = [];
  2693. function setCompletion() {
  2694. if (errors.length === 0) {
  2695. o.onCompleted();
  2696. } else if (errors.length === 1) {
  2697. o.onError(errors[0]);
  2698. } else {
  2699. o.onError(new CompositeError(errors));
  2700. }
  2701. }
  2702. group.add(m);
  2703. m.setDisposable(source.subscribe(function(innerSource) {
  2704. var innerSubscription = new SingleAssignmentDisposable();
  2705. group.add(innerSubscription);
  2706. isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
  2707. innerSubscription.setDisposable(innerSource.subscribe(function(x) {
  2708. o.onNext(x);
  2709. }, function(e) {
  2710. errors.push(e);
  2711. group.remove(innerSubscription);
  2712. isStopped && group.length === 1 && setCompletion();
  2713. }, function() {
  2714. group.remove(innerSubscription);
  2715. isStopped && group.length === 1 && setCompletion();
  2716. }));
  2717. }, function(e) {
  2718. errors.push(e);
  2719. isStopped = true;
  2720. group.length === 1 && setCompletion();
  2721. }, function() {
  2722. isStopped = true;
  2723. group.length === 1 && setCompletion();
  2724. }));
  2725. return group;
  2726. });
  2727. };
  2728. observableProto.onErrorResumeNext = function(second) {
  2729. if (!second) {
  2730. throw new Error('Second observable is required');
  2731. }
  2732. return onErrorResumeNext([this, second]);
  2733. };
  2734. var onErrorResumeNext = Observable.onErrorResumeNext = function() {
  2735. var sources = [];
  2736. if (Array.isArray(arguments[0])) {
  2737. sources = arguments[0];
  2738. } else {
  2739. for (var i = 0,
  2740. len = arguments.length; i < len; i++) {
  2741. sources.push(arguments[i]);
  2742. }
  2743. }
  2744. return new AnonymousObservable(function(observer) {
  2745. var pos = 0,
  2746. subscription = new SerialDisposable(),
  2747. cancelable = immediateScheduler.scheduleRecursive(function(self) {
  2748. var current,
  2749. d;
  2750. if (pos < sources.length) {
  2751. current = sources[pos++];
  2752. isPromise(current) && (current = observableFromPromise(current));
  2753. d = new SingleAssignmentDisposable();
  2754. subscription.setDisposable(d);
  2755. d.setDisposable(current.subscribe(observer.onNext.bind(observer), self, self));
  2756. } else {
  2757. observer.onCompleted();
  2758. }
  2759. });
  2760. return new CompositeDisposable(subscription, cancelable);
  2761. });
  2762. };
  2763. observableProto.skipUntil = function(other) {
  2764. var source = this;
  2765. return new AnonymousObservable(function(o) {
  2766. var isOpen = false;
  2767. var disposables = new CompositeDisposable(source.subscribe(function(left) {
  2768. isOpen && o.onNext(left);
  2769. }, function(e) {
  2770. o.onError(e);
  2771. }, function() {
  2772. isOpen && o.onCompleted();
  2773. }));
  2774. isPromise(other) && (other = observableFromPromise(other));
  2775. var rightSubscription = new SingleAssignmentDisposable();
  2776. disposables.add(rightSubscription);
  2777. rightSubscription.setDisposable(other.subscribe(function() {
  2778. isOpen = true;
  2779. rightSubscription.dispose();
  2780. }, function(e) {
  2781. o.onError(e);
  2782. }, function() {
  2783. rightSubscription.dispose();
  2784. }));
  2785. return disposables;
  2786. }, source);
  2787. };
  2788. observableProto['switch'] = observableProto.switchLatest = function() {
  2789. var sources = this;
  2790. return new AnonymousObservable(function(observer) {
  2791. var hasLatest = false,
  2792. innerSubscription = new SerialDisposable(),
  2793. isStopped = false,
  2794. latest = 0,
  2795. subscription = sources.subscribe(function(innerSource) {
  2796. var d = new SingleAssignmentDisposable(),
  2797. id = ++latest;
  2798. hasLatest = true;
  2799. innerSubscription.setDisposable(d);
  2800. isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
  2801. d.setDisposable(innerSource.subscribe(function(x) {
  2802. latest === id && observer.onNext(x);
  2803. }, function(e) {
  2804. latest === id && observer.onError(e);
  2805. }, function() {
  2806. if (latest === id) {
  2807. hasLatest = false;
  2808. isStopped && observer.onCompleted();
  2809. }
  2810. }));
  2811. }, function(e) {
  2812. observer.onError(e);
  2813. }, function() {
  2814. isStopped = true;
  2815. !hasLatest && observer.onCompleted();
  2816. });
  2817. return new CompositeDisposable(subscription, innerSubscription);
  2818. }, sources);
  2819. };
  2820. observableProto.takeUntil = function(other) {
  2821. var source = this;
  2822. return new AnonymousObservable(function(o) {
  2823. isPromise(other) && (other = observableFromPromise(other));
  2824. return new CompositeDisposable(source.subscribe(o), other.subscribe(function() {
  2825. o.onCompleted();
  2826. }, function(e) {
  2827. o.onError(e);
  2828. }, noop));
  2829. }, source);
  2830. };
  2831. observableProto.withLatestFrom = function() {
  2832. var len = arguments.length,
  2833. args = new Array(len);
  2834. for (var i = 0; i < len; i++) {
  2835. args[i] = arguments[i];
  2836. }
  2837. var resultSelector = args.pop(),
  2838. source = this;
  2839. if (typeof source === 'undefined') {
  2840. throw new Error('Source observable not found for withLatestFrom().');
  2841. }
  2842. if (typeof resultSelector !== 'function') {
  2843. throw new Error('withLatestFrom() expects a resultSelector function.');
  2844. }
  2845. if (Array.isArray(args[0])) {
  2846. args = args[0];
  2847. }
  2848. return new AnonymousObservable(function(observer) {
  2849. var falseFactory = function() {
  2850. return false;
  2851. },
  2852. n = args.length,
  2853. hasValue = arrayInitialize(n, falseFactory),
  2854. hasValueAll = false,
  2855. values = new Array(n);
  2856. var subscriptions = new Array(n + 1);
  2857. for (var idx = 0; idx < n; idx++) {
  2858. (function(i) {
  2859. var other = args[i],
  2860. sad = new SingleAssignmentDisposable();
  2861. isPromise(other) && (other = observableFromPromise(other));
  2862. sad.setDisposable(other.subscribe(function(x) {
  2863. values[i] = x;
  2864. hasValue[i] = true;
  2865. hasValueAll = hasValue.every(identity);
  2866. }, observer.onError.bind(observer), function() {}));
  2867. subscriptions[i] = sad;
  2868. }(idx));
  2869. }
  2870. var sad = new SingleAssignmentDisposable();
  2871. sad.setDisposable(source.subscribe(function(x) {
  2872. var res;
  2873. var allValues = [x].concat(values);
  2874. if (!hasValueAll)
  2875. return ;
  2876. try {
  2877. res = resultSelector.apply(null, allValues);
  2878. } catch (ex) {
  2879. observer.onError(ex);
  2880. return ;
  2881. }
  2882. observer.onNext(res);
  2883. }, observer.onError.bind(observer), function() {
  2884. observer.onCompleted();
  2885. }));
  2886. subscriptions[n] = sad;
  2887. return new CompositeDisposable(subscriptions);
  2888. }, this);
  2889. };
  2890. function zipArray(second, resultSelector) {
  2891. var first = this;
  2892. return new AnonymousObservable(function(observer) {
  2893. var index = 0,
  2894. len = second.length;
  2895. return first.subscribe(function(left) {
  2896. if (index < len) {
  2897. var right = second[index++],
  2898. result;
  2899. try {
  2900. result = resultSelector(left, right);
  2901. } catch (e) {
  2902. return observer.onError(e);
  2903. }
  2904. observer.onNext(result);
  2905. } else {
  2906. observer.onCompleted();
  2907. }
  2908. }, function(e) {
  2909. observer.onError(e);
  2910. }, function() {
  2911. observer.onCompleted();
  2912. });
  2913. }, first);
  2914. }
  2915. function falseFactory() {
  2916. return false;
  2917. }
  2918. function emptyArrayFactory() {
  2919. return [];
  2920. }
  2921. observableProto.zip = function() {
  2922. if (Array.isArray(arguments[0])) {
  2923. return zipArray.apply(this, arguments);
  2924. }
  2925. var len = arguments.length,
  2926. args = new Array(len);
  2927. for (var i = 0; i < len; i++) {
  2928. args[i] = arguments[i];
  2929. }
  2930. var parent = this,
  2931. resultSelector = args.pop();
  2932. args.unshift(parent);
  2933. return new AnonymousObservable(function(observer) {
  2934. var n = args.length,
  2935. queues = arrayInitialize(n, emptyArrayFactory),
  2936. isDone = arrayInitialize(n, falseFactory);
  2937. function next(i) {
  2938. var res,
  2939. queuedValues;
  2940. if (queues.every(function(x) {
  2941. return x.length > 0;
  2942. })) {
  2943. try {
  2944. queuedValues = queues.map(function(x) {
  2945. return x.shift();
  2946. });
  2947. res = resultSelector.apply(parent, queuedValues);
  2948. } catch (ex) {
  2949. observer.onError(ex);
  2950. return ;
  2951. }
  2952. observer.onNext(res);
  2953. } else if (isDone.filter(function(x, j) {
  2954. return j !== i;
  2955. }).every(identity)) {
  2956. observer.onCompleted();
  2957. }
  2958. }
  2959. ;
  2960. function done(i) {
  2961. isDone[i] = true;
  2962. if (isDone.every(function(x) {
  2963. return x;
  2964. })) {
  2965. observer.onCompleted();
  2966. }
  2967. }
  2968. var subscriptions = new Array(n);
  2969. for (var idx = 0; idx < n; idx++) {
  2970. (function(i) {
  2971. var source = args[i],
  2972. sad = new SingleAssignmentDisposable();
  2973. isPromise(source) && (source = observableFromPromise(source));
  2974. sad.setDisposable(source.subscribe(function(x) {
  2975. queues[i].push(x);
  2976. next(i);
  2977. }, function(e) {
  2978. observer.onError(e);
  2979. }, function() {
  2980. done(i);
  2981. }));
  2982. subscriptions[i] = sad;
  2983. })(idx);
  2984. }
  2985. return new CompositeDisposable(subscriptions);
  2986. }, parent);
  2987. };
  2988. Observable.zip = function() {
  2989. var len = arguments.length,
  2990. args = new Array(len);
  2991. for (var i = 0; i < len; i++) {
  2992. args[i] = arguments[i];
  2993. }
  2994. var first = args.shift();
  2995. return first.zip.apply(first, args);
  2996. };
  2997. Observable.zipArray = function() {
  2998. var sources;
  2999. if (Array.isArray(arguments[0])) {
  3000. sources = arguments[0];
  3001. } else {
  3002. var len = arguments.length;
  3003. sources = new Array(len);
  3004. for (var i = 0; i < len; i++) {
  3005. sources[i] = arguments[i];
  3006. }
  3007. }
  3008. return new AnonymousObservable(function(observer) {
  3009. var n = sources.length,
  3010. queues = arrayInitialize(n, function() {
  3011. return [];
  3012. }),
  3013. isDone = arrayInitialize(n, function() {
  3014. return false;
  3015. });
  3016. function next(i) {
  3017. if (queues.every(function(x) {
  3018. return x.length > 0;
  3019. })) {
  3020. var res = queues.map(function(x) {
  3021. return x.shift();
  3022. });
  3023. observer.onNext(res);
  3024. } else if (isDone.filter(function(x, j) {
  3025. return j !== i;
  3026. }).every(identity)) {
  3027. observer.onCompleted();
  3028. return ;
  3029. }
  3030. }
  3031. ;
  3032. function done(i) {
  3033. isDone[i] = true;
  3034. if (isDone.every(identity)) {
  3035. observer.onCompleted();
  3036. return ;
  3037. }
  3038. }
  3039. var subscriptions = new Array(n);
  3040. for (var idx = 0; idx < n; idx++) {
  3041. (function(i) {
  3042. subscriptions[i] = new SingleAssignmentDisposable();
  3043. subscriptions[i].setDisposable(sources[i].subscribe(function(x) {
  3044. queues[i].push(x);
  3045. next(i);
  3046. }, function(e) {
  3047. observer.onError(e);
  3048. }, function() {
  3049. done(i);
  3050. }));
  3051. })(idx);
  3052. }
  3053. return new CompositeDisposable(subscriptions);
  3054. });
  3055. };
  3056. observableProto.asObservable = function() {
  3057. var source = this;
  3058. return new AnonymousObservable(function(o) {
  3059. return source.subscribe(o);
  3060. }, this);
  3061. };
  3062. observableProto.bufferWithCount = function(count, skip) {
  3063. if (typeof skip !== 'number') {
  3064. skip = count;
  3065. }
  3066. return this.windowWithCount(count, skip).selectMany(function(x) {
  3067. return x.toArray();
  3068. }).where(function(x) {
  3069. return x.length > 0;
  3070. });
  3071. };
  3072. observableProto.dematerialize = function() {
  3073. var source = this;
  3074. return new AnonymousObservable(function(o) {
  3075. return source.subscribe(function(x) {
  3076. return x.accept(o);
  3077. }, function(e) {
  3078. o.onError(e);
  3079. }, function() {
  3080. o.onCompleted();
  3081. });
  3082. }, this);
  3083. };
  3084. observableProto.distinctUntilChanged = function(keySelector, comparer) {
  3085. var source = this;
  3086. comparer || (comparer = defaultComparer);
  3087. return new AnonymousObservable(function(o) {
  3088. var hasCurrentKey = false,
  3089. currentKey;
  3090. return source.subscribe(function(value) {
  3091. var key = value;
  3092. if (keySelector) {
  3093. try {
  3094. key = keySelector(value);
  3095. } catch (e) {
  3096. o.onError(e);
  3097. return ;
  3098. }
  3099. }
  3100. if (hasCurrentKey) {
  3101. try {
  3102. var comparerEquals = comparer(currentKey, key);
  3103. } catch (e) {
  3104. o.onError(e);
  3105. return ;
  3106. }
  3107. }
  3108. if (!hasCurrentKey || !comparerEquals) {
  3109. hasCurrentKey = true;
  3110. currentKey = key;
  3111. o.onNext(value);
  3112. }
  3113. }, function(e) {
  3114. o.onError(e);
  3115. }, function() {
  3116. o.onCompleted();
  3117. });
  3118. }, this);
  3119. };
  3120. observableProto['do'] = observableProto.tap = observableProto.doAction = function(observerOrOnNext, onError, onCompleted) {
  3121. var source = this;
  3122. return new AnonymousObservable(function(observer) {
  3123. var tapObserver = !observerOrOnNext || isFunction(observerOrOnNext) ? observerCreate(observerOrOnNext || noop, onError || noop, onCompleted || noop) : observerOrOnNext;
  3124. return source.subscribe(function(x) {
  3125. try {
  3126. tapObserver.onNext(x);
  3127. } catch (e) {
  3128. observer.onError(e);
  3129. }
  3130. observer.onNext(x);
  3131. }, function(err) {
  3132. try {
  3133. tapObserver.onError(err);
  3134. } catch (e) {
  3135. observer.onError(e);
  3136. }
  3137. observer.onError(err);
  3138. }, function() {
  3139. try {
  3140. tapObserver.onCompleted();
  3141. } catch (e) {
  3142. observer.onError(e);
  3143. }
  3144. observer.onCompleted();
  3145. });
  3146. }, this);
  3147. };
  3148. observableProto.doOnNext = observableProto.tapOnNext = function(onNext, thisArg) {
  3149. return this.tap(typeof thisArg !== 'undefined' ? function(x) {
  3150. onNext.call(thisArg, x);
  3151. } : onNext);
  3152. };
  3153. observableProto.doOnError = observableProto.tapOnError = function(onError, thisArg) {
  3154. return this.tap(noop, typeof thisArg !== 'undefined' ? function(e) {
  3155. onError.call(thisArg, e);
  3156. } : onError);
  3157. };
  3158. observableProto.doOnCompleted = observableProto.tapOnCompleted = function(onCompleted, thisArg) {
  3159. return this.tap(noop, null, typeof thisArg !== 'undefined' ? function() {
  3160. onCompleted.call(thisArg);
  3161. } : onCompleted);
  3162. };
  3163. observableProto['finally'] = observableProto.ensure = function(action) {
  3164. var source = this;
  3165. return new AnonymousObservable(function(observer) {
  3166. var subscription;
  3167. try {
  3168. subscription = source.subscribe(observer);
  3169. } catch (e) {
  3170. action();
  3171. throw e;
  3172. }
  3173. return disposableCreate(function() {
  3174. try {
  3175. subscription.dispose();
  3176. } catch (e) {
  3177. throw e;
  3178. } finally {
  3179. action();
  3180. }
  3181. });
  3182. }, this);
  3183. };
  3184. observableProto.finallyAction = function(action) {
  3185. return this.ensure(action);
  3186. };
  3187. observableProto.ignoreElements = function() {
  3188. var source = this;
  3189. return new AnonymousObservable(function(o) {
  3190. return source.subscribe(noop, function(e) {
  3191. o.onError(e);
  3192. }, function() {
  3193. o.onCompleted();
  3194. });
  3195. }, source);
  3196. };
  3197. observableProto.materialize = function() {
  3198. var source = this;
  3199. return new AnonymousObservable(function(observer) {
  3200. return source.subscribe(function(value) {
  3201. observer.onNext(notificationCreateOnNext(value));
  3202. }, function(e) {
  3203. observer.onNext(notificationCreateOnError(e));
  3204. observer.onCompleted();
  3205. }, function() {
  3206. observer.onNext(notificationCreateOnCompleted());
  3207. observer.onCompleted();
  3208. });
  3209. }, source);
  3210. };
  3211. observableProto.repeat = function(repeatCount) {
  3212. return enumerableRepeat(this, repeatCount).concat();
  3213. };
  3214. observableProto.retry = function(retryCount) {
  3215. return enumerableRepeat(this, retryCount).catchError();
  3216. };
  3217. observableProto.retryWhen = function(notifier) {
  3218. return enumerableRepeat(this).catchErrorWhen(notifier);
  3219. };
  3220. observableProto.scan = function() {
  3221. var hasSeed = false,
  3222. seed,
  3223. accumulator,
  3224. source = this;
  3225. if (arguments.length === 2) {
  3226. hasSeed = true;
  3227. seed = arguments[0];
  3228. accumulator = arguments[1];
  3229. } else {
  3230. accumulator = arguments[0];
  3231. }
  3232. return new AnonymousObservable(function(o) {
  3233. var hasAccumulation,
  3234. accumulation,
  3235. hasValue;
  3236. return source.subscribe(function(x) {
  3237. !hasValue && (hasValue = true);
  3238. try {
  3239. if (hasAccumulation) {
  3240. accumulation = accumulator(accumulation, x);
  3241. } else {
  3242. accumulation = hasSeed ? accumulator(seed, x) : x;
  3243. hasAccumulation = true;
  3244. }
  3245. } catch (e) {
  3246. o.onError(e);
  3247. return ;
  3248. }
  3249. o.onNext(accumulation);
  3250. }, function(e) {
  3251. o.onError(e);
  3252. }, function() {
  3253. !hasValue && hasSeed && o.onNext(seed);
  3254. o.onCompleted();
  3255. });
  3256. }, source);
  3257. };
  3258. observableProto.skipLast = function(count) {
  3259. if (count < 0) {
  3260. throw new ArgumentOutOfRangeError();
  3261. }
  3262. var source = this;
  3263. return new AnonymousObservable(function(o) {
  3264. var q = [];
  3265. return source.subscribe(function(x) {
  3266. q.push(x);
  3267. q.length > count && o.onNext(q.shift());
  3268. }, function(e) {
  3269. o.onError(e);
  3270. }, function() {
  3271. o.onCompleted();
  3272. });
  3273. }, source);
  3274. };
  3275. observableProto.startWith = function() {
  3276. var values,
  3277. scheduler,
  3278. start = 0;
  3279. if (!!arguments.length && isScheduler(arguments[0])) {
  3280. scheduler = arguments[0];
  3281. start = 1;
  3282. } else {
  3283. scheduler = immediateScheduler;
  3284. }
  3285. for (var args = [],
  3286. i = start,
  3287. len = arguments.length; i < len; i++) {
  3288. args.push(arguments[i]);
  3289. }
  3290. return enumerableOf([observableFromArray(args, scheduler), this]).concat();
  3291. };
  3292. observableProto.takeLast = function(count) {
  3293. if (count < 0) {
  3294. throw new ArgumentOutOfRangeError();
  3295. }
  3296. var source = this;
  3297. return new AnonymousObservable(function(o) {
  3298. var q = [];
  3299. return source.subscribe(function(x) {
  3300. q.push(x);
  3301. q.length > count && q.shift();
  3302. }, function(e) {
  3303. o.onError(e);
  3304. }, function() {
  3305. while (q.length > 0) {
  3306. o.onNext(q.shift());
  3307. }
  3308. o.onCompleted();
  3309. });
  3310. }, source);
  3311. };
  3312. observableProto.takeLastBuffer = function(count) {
  3313. var source = this;
  3314. return new AnonymousObservable(function(o) {
  3315. var q = [];
  3316. return source.subscribe(function(x) {
  3317. q.push(x);
  3318. q.length > count && q.shift();
  3319. }, function(e) {
  3320. o.onError(e);
  3321. }, function() {
  3322. o.onNext(q);
  3323. o.onCompleted();
  3324. });
  3325. }, source);
  3326. };
  3327. observableProto.windowWithCount = function(count, skip) {
  3328. var source = this;
  3329. +count || (count = 0);
  3330. Math.abs(count) === Infinity && (count = 0);
  3331. if (count <= 0) {
  3332. throw new ArgumentOutOfRangeError();
  3333. }
  3334. skip == null && (skip = count);
  3335. +skip || (skip = 0);
  3336. Math.abs(skip) === Infinity && (skip = 0);
  3337. if (skip <= 0) {
  3338. throw new ArgumentOutOfRangeError();
  3339. }
  3340. return new AnonymousObservable(function(observer) {
  3341. var m = new SingleAssignmentDisposable(),
  3342. refCountDisposable = new RefCountDisposable(m),
  3343. n = 0,
  3344. q = [];
  3345. function createWindow() {
  3346. var s = new Subject();
  3347. q.push(s);
  3348. observer.onNext(addRef(s, refCountDisposable));
  3349. }
  3350. createWindow();
  3351. m.setDisposable(source.subscribe(function(x) {
  3352. for (var i = 0,
  3353. len = q.length; i < len; i++) {
  3354. q[i].onNext(x);
  3355. }
  3356. var c = n - count + 1;
  3357. c >= 0 && c % skip === 0 && q.shift().onCompleted();
  3358. ++n % skip === 0 && createWindow();
  3359. }, function(e) {
  3360. while (q.length > 0) {
  3361. q.shift().onError(e);
  3362. }
  3363. observer.onError(e);
  3364. }, function() {
  3365. while (q.length > 0) {
  3366. q.shift().onCompleted();
  3367. }
  3368. observer.onCompleted();
  3369. }));
  3370. return refCountDisposable;
  3371. }, source);
  3372. };
  3373. function concatMap(source, selector, thisArg) {
  3374. var selectorFunc = bindCallback(selector, thisArg, 3);
  3375. return source.map(function(x, i) {
  3376. var result = selectorFunc(x, i, source);
  3377. isPromise(result) && (result = observableFromPromise(result));
  3378. (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));
  3379. return result;
  3380. }).concatAll();
  3381. }
  3382. observableProto.selectConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {
  3383. if (isFunction(selector) && isFunction(resultSelector)) {
  3384. return this.concatMap(function(x, i) {
  3385. var selectorResult = selector(x, i);
  3386. isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));
  3387. (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));
  3388. return selectorResult.map(function(y, i2) {
  3389. return resultSelector(x, y, i, i2);
  3390. });
  3391. });
  3392. }
  3393. return isFunction(selector) ? concatMap(this, selector, thisArg) : concatMap(this, function() {
  3394. return selector;
  3395. });
  3396. };
  3397. observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {
  3398. var source = this,
  3399. onNextFunc = bindCallback(onNext, thisArg, 2),
  3400. onErrorFunc = bindCallback(onError, thisArg, 1),
  3401. onCompletedFunc = bindCallback(onCompleted, thisArg, 0);
  3402. return new AnonymousObservable(function(observer) {
  3403. var index = 0;
  3404. return source.subscribe(function(x) {
  3405. var result;
  3406. try {
  3407. result = onNextFunc(x, index++);
  3408. } catch (e) {
  3409. observer.onError(e);
  3410. return ;
  3411. }
  3412. isPromise(result) && (result = observableFromPromise(result));
  3413. observer.onNext(result);
  3414. }, function(err) {
  3415. var result;
  3416. try {
  3417. result = onErrorFunc(err);
  3418. } catch (e) {
  3419. observer.onError(e);
  3420. return ;
  3421. }
  3422. isPromise(result) && (result = observableFromPromise(result));
  3423. observer.onNext(result);
  3424. observer.onCompleted();
  3425. }, function() {
  3426. var result;
  3427. try {
  3428. result = onCompletedFunc();
  3429. } catch (e) {
  3430. observer.onError(e);
  3431. return ;
  3432. }
  3433. isPromise(result) && (result = observableFromPromise(result));
  3434. observer.onNext(result);
  3435. observer.onCompleted();
  3436. });
  3437. }, this).concatAll();
  3438. };
  3439. observableProto.defaultIfEmpty = function(defaultValue) {
  3440. var source = this;
  3441. defaultValue === undefined && (defaultValue = null);
  3442. return new AnonymousObservable(function(observer) {
  3443. var found = false;
  3444. return source.subscribe(function(x) {
  3445. found = true;
  3446. observer.onNext(x);
  3447. }, function(e) {
  3448. observer.onError(e);
  3449. }, function() {
  3450. !found && observer.onNext(defaultValue);
  3451. observer.onCompleted();
  3452. });
  3453. }, source);
  3454. };
  3455. function arrayIndexOfComparer(array, item, comparer) {
  3456. for (var i = 0,
  3457. len = array.length; i < len; i++) {
  3458. if (comparer(array[i], item)) {
  3459. return i;
  3460. }
  3461. }
  3462. return -1;
  3463. }
  3464. function HashSet(comparer) {
  3465. this.comparer = comparer;
  3466. this.set = [];
  3467. }
  3468. HashSet.prototype.push = function(value) {
  3469. var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;
  3470. retValue && this.set.push(value);
  3471. return retValue;
  3472. };
  3473. observableProto.distinct = function(keySelector, comparer) {
  3474. var source = this;
  3475. comparer || (comparer = defaultComparer);
  3476. return new AnonymousObservable(function(o) {
  3477. var hashSet = new HashSet(comparer);
  3478. return source.subscribe(function(x) {
  3479. var key = x;
  3480. if (keySelector) {
  3481. try {
  3482. key = keySelector(x);
  3483. } catch (e) {
  3484. o.onError(e);
  3485. return ;
  3486. }
  3487. }
  3488. hashSet.push(key) && o.onNext(x);
  3489. }, function(e) {
  3490. o.onError(e);
  3491. }, function() {
  3492. o.onCompleted();
  3493. });
  3494. }, this);
  3495. };
  3496. observableProto.groupBy = function(keySelector, elementSelector, comparer) {
  3497. return this.groupByUntil(keySelector, elementSelector, observableNever, comparer);
  3498. };
  3499. observableProto.groupByUntil = function(keySelector, elementSelector, durationSelector, comparer) {
  3500. var source = this;
  3501. elementSelector || (elementSelector = identity);
  3502. comparer || (comparer = defaultComparer);
  3503. return new AnonymousObservable(function(observer) {
  3504. function handleError(e) {
  3505. return function(item) {
  3506. item.onError(e);
  3507. };
  3508. }
  3509. var map = new Dictionary(0, comparer),
  3510. groupDisposable = new CompositeDisposable(),
  3511. refCountDisposable = new RefCountDisposable(groupDisposable);
  3512. groupDisposable.add(source.subscribe(function(x) {
  3513. var key;
  3514. try {
  3515. key = keySelector(x);
  3516. } catch (e) {
  3517. map.getValues().forEach(handleError(e));
  3518. observer.onError(e);
  3519. return ;
  3520. }
  3521. var fireNewMapEntry = false,
  3522. writer = map.tryGetValue(key);
  3523. if (!writer) {
  3524. writer = new Subject();
  3525. map.set(key, writer);
  3526. fireNewMapEntry = true;
  3527. }
  3528. if (fireNewMapEntry) {
  3529. var group = new GroupedObservable(key, writer, refCountDisposable),
  3530. durationGroup = new GroupedObservable(key, writer);
  3531. try {
  3532. duration = durationSelector(durationGroup);
  3533. } catch (e) {
  3534. map.getValues().forEach(handleError(e));
  3535. observer.onError(e);
  3536. return ;
  3537. }
  3538. observer.onNext(group);
  3539. var md = new SingleAssignmentDisposable();
  3540. groupDisposable.add(md);
  3541. var expire = function() {
  3542. map.remove(key) && writer.onCompleted();
  3543. groupDisposable.remove(md);
  3544. };
  3545. md.setDisposable(duration.take(1).subscribe(noop, function(exn) {
  3546. map.getValues().forEach(handleError(exn));
  3547. observer.onError(exn);
  3548. }, expire));
  3549. }
  3550. var element;
  3551. try {
  3552. element = elementSelector(x);
  3553. } catch (e) {
  3554. map.getValues().forEach(handleError(e));
  3555. observer.onError(e);
  3556. return ;
  3557. }
  3558. writer.onNext(element);
  3559. }, function(ex) {
  3560. map.getValues().forEach(handleError(ex));
  3561. observer.onError(ex);
  3562. }, function() {
  3563. map.getValues().forEach(function(item) {
  3564. item.onCompleted();
  3565. });
  3566. observer.onCompleted();
  3567. }));
  3568. return refCountDisposable;
  3569. }, source);
  3570. };
  3571. var MapObservable = (function(__super__) {
  3572. inherits(MapObservable, __super__);
  3573. function MapObservable(source, selector, thisArg) {
  3574. this.source = source;
  3575. this.selector = bindCallback(selector, thisArg, 3);
  3576. __super__.call(this);
  3577. }
  3578. MapObservable.prototype.internalMap = function(selector, thisArg) {
  3579. var self = this;
  3580. return new MapObservable(this.source, function(x, i, o) {
  3581. return selector.call(this, self.selector(x, i, o), i, o);
  3582. }, thisArg);
  3583. };
  3584. MapObservable.prototype.subscribeCore = function(observer) {
  3585. return this.source.subscribe(new MapObserver(observer, this.selector, this));
  3586. };
  3587. return MapObservable;
  3588. }(ObservableBase));
  3589. function MapObserver(observer, selector, source) {
  3590. this.observer = observer;
  3591. this.selector = selector;
  3592. this.source = source;
  3593. this.i = 0;
  3594. this.isStopped = false;
  3595. }
  3596. MapObserver.prototype.onNext = function(x) {
  3597. if (this.isStopped) {
  3598. return ;
  3599. }
  3600. var result = tryCatch(this.selector).call(this, x, this.i++, this.source);
  3601. if (result === errorObj) {
  3602. return this.observer.onError(result.e);
  3603. }
  3604. this.observer.onNext(result);
  3605. };
  3606. MapObserver.prototype.onError = function(e) {
  3607. if (!this.isStopped) {
  3608. this.isStopped = true;
  3609. this.observer.onError(e);
  3610. }
  3611. };
  3612. MapObserver.prototype.onCompleted = function() {
  3613. if (!this.isStopped) {
  3614. this.isStopped = true;
  3615. this.observer.onCompleted();
  3616. }
  3617. };
  3618. MapObserver.prototype.dispose = function() {
  3619. this.isStopped = true;
  3620. };
  3621. MapObserver.prototype.fail = function(e) {
  3622. if (!this.isStopped) {
  3623. this.isStopped = true;
  3624. this.observer.onError(e);
  3625. return true;
  3626. }
  3627. return false;
  3628. };
  3629. observableProto.map = observableProto.select = function(selector, thisArg) {
  3630. var selectorFn = typeof selector === 'function' ? selector : function() {
  3631. return selector;
  3632. };
  3633. return this instanceof MapObservable ? this.internalMap(selectorFn, thisArg) : new MapObservable(this, selectorFn, thisArg);
  3634. };
  3635. observableProto.pluck = function() {
  3636. var args = arguments,
  3637. len = arguments.length;
  3638. if (len === 0) {
  3639. throw new Error('List of properties cannot be empty.');
  3640. }
  3641. return this.map(function(x) {
  3642. var currentProp = x;
  3643. for (var i = 0; i < len; i++) {
  3644. var p = currentProp[args[i]];
  3645. if (typeof p !== 'undefined') {
  3646. currentProp = p;
  3647. } else {
  3648. return undefined;
  3649. }
  3650. }
  3651. return currentProp;
  3652. });
  3653. };
  3654. function flatMap(source, selector, thisArg) {
  3655. var selectorFunc = bindCallback(selector, thisArg, 3);
  3656. return source.map(function(x, i) {
  3657. var result = selectorFunc(x, i, source);
  3658. isPromise(result) && (result = observableFromPromise(result));
  3659. (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));
  3660. return result;
  3661. }).mergeAll();
  3662. }
  3663. observableProto.selectMany = observableProto.flatMap = function(selector, resultSelector, thisArg) {
  3664. if (isFunction(selector) && isFunction(resultSelector)) {
  3665. return this.flatMap(function(x, i) {
  3666. var selectorResult = selector(x, i);
  3667. isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));
  3668. (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));
  3669. return selectorResult.map(function(y, i2) {
  3670. return resultSelector(x, y, i, i2);
  3671. });
  3672. }, thisArg);
  3673. }
  3674. return isFunction(selector) ? flatMap(this, selector, thisArg) : flatMap(this, function() {
  3675. return selector;
  3676. });
  3677. };
  3678. observableProto.flatMapObserver = observableProto.selectManyObserver = function(onNext, onError, onCompleted, thisArg) {
  3679. var source = this;
  3680. return new AnonymousObservable(function(observer) {
  3681. var index = 0;
  3682. return source.subscribe(function(x) {
  3683. var result;
  3684. try {
  3685. result = onNext.call(thisArg, x, index++);
  3686. } catch (e) {
  3687. observer.onError(e);
  3688. return ;
  3689. }
  3690. isPromise(result) && (result = observableFromPromise(result));
  3691. observer.onNext(result);
  3692. }, function(err) {
  3693. var result;
  3694. try {
  3695. result = onError.call(thisArg, err);
  3696. } catch (e) {
  3697. observer.onError(e);
  3698. return ;
  3699. }
  3700. isPromise(result) && (result = observableFromPromise(result));
  3701. observer.onNext(result);
  3702. observer.onCompleted();
  3703. }, function() {
  3704. var result;
  3705. try {
  3706. result = onCompleted.call(thisArg);
  3707. } catch (e) {
  3708. observer.onError(e);
  3709. return ;
  3710. }
  3711. isPromise(result) && (result = observableFromPromise(result));
  3712. observer.onNext(result);
  3713. observer.onCompleted();
  3714. });
  3715. }, source).mergeAll();
  3716. };
  3717. observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function(selector, thisArg) {
  3718. return this.select(selector, thisArg).switchLatest();
  3719. };
  3720. observableProto.skip = function(count) {
  3721. if (count < 0) {
  3722. throw new ArgumentOutOfRangeError();
  3723. }
  3724. var source = this;
  3725. return new AnonymousObservable(function(o) {
  3726. var remaining = count;
  3727. return source.subscribe(function(x) {
  3728. if (remaining <= 0) {
  3729. o.onNext(x);
  3730. } else {
  3731. remaining--;
  3732. }
  3733. }, function(e) {
  3734. o.onError(e);
  3735. }, function() {
  3736. o.onCompleted();
  3737. });
  3738. }, source);
  3739. };
  3740. observableProto.skipWhile = function(predicate, thisArg) {
  3741. var source = this,
  3742. callback = bindCallback(predicate, thisArg, 3);
  3743. return new AnonymousObservable(function(o) {
  3744. var i = 0,
  3745. running = false;
  3746. return source.subscribe(function(x) {
  3747. if (!running) {
  3748. try {
  3749. running = !callback(x, i++, source);
  3750. } catch (e) {
  3751. o.onError(e);
  3752. return ;
  3753. }
  3754. }
  3755. running && o.onNext(x);
  3756. }, function(e) {
  3757. o.onError(e);
  3758. }, function() {
  3759. o.onCompleted();
  3760. });
  3761. }, source);
  3762. };
  3763. observableProto.take = function(count, scheduler) {
  3764. if (count < 0) {
  3765. throw new ArgumentOutOfRangeError();
  3766. }
  3767. if (count === 0) {
  3768. return observableEmpty(scheduler);
  3769. }
  3770. var source = this;
  3771. return new AnonymousObservable(function(o) {
  3772. var remaining = count;
  3773. return source.subscribe(function(x) {
  3774. if (remaining-- > 0) {
  3775. o.onNext(x);
  3776. remaining === 0 && o.onCompleted();
  3777. }
  3778. }, function(e) {
  3779. o.onError(e);
  3780. }, function() {
  3781. o.onCompleted();
  3782. });
  3783. }, source);
  3784. };
  3785. observableProto.takeWhile = function(predicate, thisArg) {
  3786. var source = this,
  3787. callback = bindCallback(predicate, thisArg, 3);
  3788. return new AnonymousObservable(function(o) {
  3789. var i = 0,
  3790. running = true;
  3791. return source.subscribe(function(x) {
  3792. if (running) {
  3793. try {
  3794. running = callback(x, i++, source);
  3795. } catch (e) {
  3796. o.onError(e);
  3797. return ;
  3798. }
  3799. if (running) {
  3800. o.onNext(x);
  3801. } else {
  3802. o.onCompleted();
  3803. }
  3804. }
  3805. }, function(e) {
  3806. o.onError(e);
  3807. }, function() {
  3808. o.onCompleted();
  3809. });
  3810. }, source);
  3811. };
  3812. var FilterObservable = (function(__super__) {
  3813. inherits(FilterObservable, __super__);
  3814. function FilterObservable(source, predicate, thisArg) {
  3815. this.source = source;
  3816. this.predicate = bindCallback(predicate, thisArg, 3);
  3817. __super__.call(this);
  3818. }
  3819. FilterObservable.prototype.subscribeCore = function(observer) {
  3820. return this.source.subscribe(new FilterObserver(observer, this.predicate, this));
  3821. };
  3822. FilterObservable.prototype.internalFilter = function(predicate, thisArg) {
  3823. var self = this;
  3824. return new FilterObservable(this.source, function(x, i, o) {
  3825. return self.predicate(x, i, o) && predicate.call(this, x, i, o);
  3826. }, thisArg);
  3827. };
  3828. return FilterObservable;
  3829. }(ObservableBase));
  3830. function FilterObserver(observer, predicate, source) {
  3831. this.observer = observer;
  3832. this.predicate = predicate;
  3833. this.source = source;
  3834. this.i = 0;
  3835. this.isStopped = false;
  3836. }
  3837. FilterObserver.prototype.onNext = function(x) {
  3838. if (this.isStopped) {
  3839. return ;
  3840. }
  3841. var shouldYield = tryCatch(this.predicate).call(this, x, this.i++, this.source);
  3842. if (shouldYield === errorObj) {
  3843. return this.observer.onError(shouldYield.e);
  3844. }
  3845. shouldYield && this.observer.onNext(x);
  3846. };
  3847. FilterObserver.prototype.onError = function(e) {
  3848. if (!this.isStopped) {
  3849. this.isStopped = true;
  3850. this.observer.onError(e);
  3851. }
  3852. };
  3853. FilterObserver.prototype.onCompleted = function() {
  3854. if (!this.isStopped) {
  3855. this.isStopped = true;
  3856. this.observer.onCompleted();
  3857. }
  3858. };
  3859. FilterObserver.prototype.dispose = function() {
  3860. this.isStopped = true;
  3861. };
  3862. FilterObserver.prototype.fail = function(e) {
  3863. if (!this.isStopped) {
  3864. this.isStopped = true;
  3865. this.observer.onError(e);
  3866. return true;
  3867. }
  3868. return false;
  3869. };
  3870. observableProto.filter = observableProto.where = function(predicate, thisArg) {
  3871. return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) : new FilterObservable(this, predicate, thisArg);
  3872. };
  3873. function extremaBy(source, keySelector, comparer) {
  3874. return new AnonymousObservable(function(o) {
  3875. var hasValue = false,
  3876. lastKey = null,
  3877. list = [];
  3878. return source.subscribe(function(x) {
  3879. var comparison,
  3880. key;
  3881. try {
  3882. key = keySelector(x);
  3883. } catch (ex) {
  3884. o.onError(ex);
  3885. return ;
  3886. }
  3887. comparison = 0;
  3888. if (!hasValue) {
  3889. hasValue = true;
  3890. lastKey = key;
  3891. } else {
  3892. try {
  3893. comparison = comparer(key, lastKey);
  3894. } catch (ex1) {
  3895. o.onError(ex1);
  3896. return ;
  3897. }
  3898. }
  3899. if (comparison > 0) {
  3900. lastKey = key;
  3901. list = [];
  3902. }
  3903. if (comparison >= 0) {
  3904. list.push(x);
  3905. }
  3906. }, function(e) {
  3907. o.onError(e);
  3908. }, function() {
  3909. o.onNext(list);
  3910. o.onCompleted();
  3911. });
  3912. }, source);
  3913. }
  3914. function firstOnly(x) {
  3915. if (x.length === 0) {
  3916. throw new EmptyError();
  3917. }
  3918. return x[0];
  3919. }
  3920. observableProto.aggregate = function() {
  3921. var hasSeed = false,
  3922. accumulator,
  3923. seed,
  3924. source = this;
  3925. if (arguments.length === 2) {
  3926. hasSeed = true;
  3927. seed = arguments[0];
  3928. accumulator = arguments[1];
  3929. } else {
  3930. accumulator = arguments[0];
  3931. }
  3932. return new AnonymousObservable(function(o) {
  3933. var hasAccumulation,
  3934. accumulation,
  3935. hasValue;
  3936. return source.subscribe(function(x) {
  3937. !hasValue && (hasValue = true);
  3938. try {
  3939. if (hasAccumulation) {
  3940. accumulation = accumulator(accumulation, x);
  3941. } else {
  3942. accumulation = hasSeed ? accumulator(seed, x) : x;
  3943. hasAccumulation = true;
  3944. }
  3945. } catch (e) {
  3946. return o.onError(e);
  3947. }
  3948. }, function(e) {
  3949. o.onError(e);
  3950. }, function() {
  3951. hasValue && o.onNext(accumulation);
  3952. !hasValue && hasSeed && o.onNext(seed);
  3953. !hasValue && !hasSeed && o.onError(new EmptyError());
  3954. o.onCompleted();
  3955. });
  3956. }, source);
  3957. };
  3958. observableProto.reduce = function(accumulator) {
  3959. var hasSeed = false,
  3960. seed,
  3961. source = this;
  3962. if (arguments.length === 2) {
  3963. hasSeed = true;
  3964. seed = arguments[1];
  3965. }
  3966. return new AnonymousObservable(function(o) {
  3967. var hasAccumulation,
  3968. accumulation,
  3969. hasValue;
  3970. return source.subscribe(function(x) {
  3971. !hasValue && (hasValue = true);
  3972. try {
  3973. if (hasAccumulation) {
  3974. accumulation = accumulator(accumulation, x);
  3975. } else {
  3976. accumulation = hasSeed ? accumulator(seed, x) : x;
  3977. hasAccumulation = true;
  3978. }
  3979. } catch (e) {
  3980. return o.onError(e);
  3981. }
  3982. }, function(e) {
  3983. o.onError(e);
  3984. }, function() {
  3985. hasValue && o.onNext(accumulation);
  3986. !hasValue && hasSeed && o.onNext(seed);
  3987. !hasValue && !hasSeed && o.onError(new EmptyError());
  3988. o.onCompleted();
  3989. });
  3990. }, source);
  3991. };
  3992. observableProto.some = function(predicate, thisArg) {
  3993. var source = this;
  3994. return predicate ? source.filter(predicate, thisArg).some() : new AnonymousObservable(function(observer) {
  3995. return source.subscribe(function() {
  3996. observer.onNext(true);
  3997. observer.onCompleted();
  3998. }, function(e) {
  3999. observer.onError(e);
  4000. }, function() {
  4001. observer.onNext(false);
  4002. observer.onCompleted();
  4003. });
  4004. }, source);
  4005. };
  4006. observableProto.any = function() {
  4007. return this.some.apply(this, arguments);
  4008. };
  4009. observableProto.isEmpty = function() {
  4010. return this.any().map(not);
  4011. };
  4012. observableProto.every = function(predicate, thisArg) {
  4013. return this.filter(function(v) {
  4014. return !predicate(v);
  4015. }, thisArg).some().map(not);
  4016. };
  4017. observableProto.all = function() {
  4018. return this.every.apply(this, arguments);
  4019. };
  4020. observableProto.includes = function(searchElement, fromIndex) {
  4021. var source = this;
  4022. function comparer(a, b) {
  4023. return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));
  4024. }
  4025. return new AnonymousObservable(function(o) {
  4026. var i = 0,
  4027. n = +fromIndex || 0;
  4028. Math.abs(n) === Infinity && (n = 0);
  4029. if (n < 0) {
  4030. o.onNext(false);
  4031. o.onCompleted();
  4032. return disposableEmpty;
  4033. }
  4034. return source.subscribe(function(x) {
  4035. if (i++ >= n && comparer(x, searchElement)) {
  4036. o.onNext(true);
  4037. o.onCompleted();
  4038. }
  4039. }, function(e) {
  4040. o.onError(e);
  4041. }, function() {
  4042. o.onNext(false);
  4043. o.onCompleted();
  4044. });
  4045. }, this);
  4046. };
  4047. observableProto.contains = function(searchElement, fromIndex) {
  4048. observableProto.includes(searchElement, fromIndex);
  4049. };
  4050. observableProto.count = function(predicate, thisArg) {
  4051. return predicate ? this.filter(predicate, thisArg).count() : this.reduce(function(count) {
  4052. return count + 1;
  4053. }, 0);
  4054. };
  4055. observableProto.indexOf = function(searchElement, fromIndex) {
  4056. var source = this;
  4057. return new AnonymousObservable(function(o) {
  4058. var i = 0,
  4059. n = +fromIndex || 0;
  4060. Math.abs(n) === Infinity && (n = 0);
  4061. if (n < 0) {
  4062. o.onNext(-1);
  4063. o.onCompleted();
  4064. return disposableEmpty;
  4065. }
  4066. return source.subscribe(function(x) {
  4067. if (i >= n && x === searchElement) {
  4068. o.onNext(i);
  4069. o.onCompleted();
  4070. }
  4071. i++;
  4072. }, function(e) {
  4073. o.onError(e);
  4074. }, function() {
  4075. o.onNext(-1);
  4076. o.onCompleted();
  4077. });
  4078. }, source);
  4079. };
  4080. observableProto.sum = function(keySelector, thisArg) {
  4081. return keySelector && isFunction(keySelector) ? this.map(keySelector, thisArg).sum() : this.reduce(function(prev, curr) {
  4082. return prev + curr;
  4083. }, 0);
  4084. };
  4085. observableProto.minBy = function(keySelector, comparer) {
  4086. comparer || (comparer = defaultSubComparer);
  4087. return extremaBy(this, keySelector, function(x, y) {
  4088. return comparer(x, y) * -1;
  4089. });
  4090. };
  4091. observableProto.min = function(comparer) {
  4092. return this.minBy(identity, comparer).map(function(x) {
  4093. return firstOnly(x);
  4094. });
  4095. };
  4096. observableProto.maxBy = function(keySelector, comparer) {
  4097. comparer || (comparer = defaultSubComparer);
  4098. return extremaBy(this, keySelector, comparer);
  4099. };
  4100. observableProto.max = function(comparer) {
  4101. return this.maxBy(identity, comparer).map(function(x) {
  4102. return firstOnly(x);
  4103. });
  4104. };
  4105. observableProto.average = function(keySelector, thisArg) {
  4106. return keySelector && isFunction(keySelector) ? this.map(keySelector, thisArg).average() : this.reduce(function(prev, cur) {
  4107. return {
  4108. sum: prev.sum + cur,
  4109. count: prev.count + 1
  4110. };
  4111. }, {
  4112. sum: 0,
  4113. count: 0
  4114. }).map(function(s) {
  4115. if (s.count === 0) {
  4116. throw new EmptyError();
  4117. }
  4118. return s.sum / s.count;
  4119. });
  4120. };
  4121. observableProto.sequenceEqual = function(second, comparer) {
  4122. var first = this;
  4123. comparer || (comparer = defaultComparer);
  4124. return new AnonymousObservable(function(o) {
  4125. var donel = false,
  4126. doner = false,
  4127. ql = [],
  4128. qr = [];
  4129. var subscription1 = first.subscribe(function(x) {
  4130. var equal,
  4131. v;
  4132. if (qr.length > 0) {
  4133. v = qr.shift();
  4134. try {
  4135. equal = comparer(v, x);
  4136. } catch (e) {
  4137. o.onError(e);
  4138. return ;
  4139. }
  4140. if (!equal) {
  4141. o.onNext(false);
  4142. o.onCompleted();
  4143. }
  4144. } else if (doner) {
  4145. o.onNext(false);
  4146. o.onCompleted();
  4147. } else {
  4148. ql.push(x);
  4149. }
  4150. }, function(e) {
  4151. o.onError(e);
  4152. }, function() {
  4153. donel = true;
  4154. if (ql.length === 0) {
  4155. if (qr.length > 0) {
  4156. o.onNext(false);
  4157. o.onCompleted();
  4158. } else if (doner) {
  4159. o.onNext(true);
  4160. o.onCompleted();
  4161. }
  4162. }
  4163. });
  4164. (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));
  4165. isPromise(second) && (second = observableFromPromise(second));
  4166. var subscription2 = second.subscribe(function(x) {
  4167. var equal;
  4168. if (ql.length > 0) {
  4169. var v = ql.shift();
  4170. try {
  4171. equal = comparer(v, x);
  4172. } catch (exception) {
  4173. o.onError(exception);
  4174. return ;
  4175. }
  4176. if (!equal) {
  4177. o.onNext(false);
  4178. o.onCompleted();
  4179. }
  4180. } else if (donel) {
  4181. o.onNext(false);
  4182. o.onCompleted();
  4183. } else {
  4184. qr.push(x);
  4185. }
  4186. }, function(e) {
  4187. o.onError(e);
  4188. }, function() {
  4189. doner = true;
  4190. if (qr.length === 0) {
  4191. if (ql.length > 0) {
  4192. o.onNext(false);
  4193. o.onCompleted();
  4194. } else if (donel) {
  4195. o.onNext(true);
  4196. o.onCompleted();
  4197. }
  4198. }
  4199. });
  4200. return new CompositeDisposable(subscription1, subscription2);
  4201. }, first);
  4202. };
  4203. function elementAtOrDefault(source, index, hasDefault, defaultValue) {
  4204. if (index < 0) {
  4205. throw new ArgumentOutOfRangeError();
  4206. }
  4207. return new AnonymousObservable(function(o) {
  4208. var i = index;
  4209. return source.subscribe(function(x) {
  4210. if (i-- === 0) {
  4211. o.onNext(x);
  4212. o.onCompleted();
  4213. }
  4214. }, function(e) {
  4215. o.onError(e);
  4216. }, function() {
  4217. if (!hasDefault) {
  4218. o.onError(new ArgumentOutOfRangeError());
  4219. } else {
  4220. o.onNext(defaultValue);
  4221. o.onCompleted();
  4222. }
  4223. });
  4224. }, source);
  4225. }
  4226. observableProto.elementAt = function(index) {
  4227. return elementAtOrDefault(this, index, false);
  4228. };
  4229. observableProto.elementAtOrDefault = function(index, defaultValue) {
  4230. return elementAtOrDefault(this, index, true, defaultValue);
  4231. };
  4232. function singleOrDefaultAsync(source, hasDefault, defaultValue) {
  4233. return new AnonymousObservable(function(o) {
  4234. var value = defaultValue,
  4235. seenValue = false;
  4236. return source.subscribe(function(x) {
  4237. if (seenValue) {
  4238. o.onError(new Error('Sequence contains more than one element'));
  4239. } else {
  4240. value = x;
  4241. seenValue = true;
  4242. }
  4243. }, function(e) {
  4244. o.onError(e);
  4245. }, function() {
  4246. if (!seenValue && !hasDefault) {
  4247. o.onError(new EmptyError());
  4248. } else {
  4249. o.onNext(value);
  4250. o.onCompleted();
  4251. }
  4252. });
  4253. }, source);
  4254. }
  4255. observableProto.single = function(predicate, thisArg) {
  4256. return predicate && isFunction(predicate) ? this.where(predicate, thisArg).single() : singleOrDefaultAsync(this, false);
  4257. };
  4258. observableProto.singleOrDefault = function(predicate, defaultValue, thisArg) {
  4259. return predicate && isFunction(predicate) ? this.filter(predicate, thisArg).singleOrDefault(null, defaultValue) : singleOrDefaultAsync(this, true, defaultValue);
  4260. };
  4261. function firstOrDefaultAsync(source, hasDefault, defaultValue) {
  4262. return new AnonymousObservable(function(o) {
  4263. return source.subscribe(function(x) {
  4264. o.onNext(x);
  4265. o.onCompleted();
  4266. }, function(e) {
  4267. o.onError(e);
  4268. }, function() {
  4269. if (!hasDefault) {
  4270. o.onError(new EmptyError());
  4271. } else {
  4272. o.onNext(defaultValue);
  4273. o.onCompleted();
  4274. }
  4275. });
  4276. }, source);
  4277. }
  4278. observableProto.first = function(predicate, thisArg) {
  4279. return predicate ? this.where(predicate, thisArg).first() : firstOrDefaultAsync(this, false);
  4280. };
  4281. observableProto.firstOrDefault = function(predicate, defaultValue, thisArg) {
  4282. return predicate ? this.where(predicate).firstOrDefault(null, defaultValue) : firstOrDefaultAsync(this, true, defaultValue);
  4283. };
  4284. function lastOrDefaultAsync(source, hasDefault, defaultValue) {
  4285. return new AnonymousObservable(function(o) {
  4286. var value = defaultValue,
  4287. seenValue = false;
  4288. return source.subscribe(function(x) {
  4289. value = x;
  4290. seenValue = true;
  4291. }, function(e) {
  4292. o.onError(e);
  4293. }, function() {
  4294. if (!seenValue && !hasDefault) {
  4295. o.onError(new EmptyError());
  4296. } else {
  4297. o.onNext(value);
  4298. o.onCompleted();
  4299. }
  4300. });
  4301. }, source);
  4302. }
  4303. observableProto.last = function(predicate, thisArg) {
  4304. return predicate ? this.where(predicate, thisArg).last() : lastOrDefaultAsync(this, false);
  4305. };
  4306. observableProto.lastOrDefault = function(predicate, defaultValue, thisArg) {
  4307. return predicate ? this.where(predicate, thisArg).lastOrDefault(null, defaultValue) : lastOrDefaultAsync(this, true, defaultValue);
  4308. };
  4309. function findValue(source, predicate, thisArg, yieldIndex) {
  4310. var callback = bindCallback(predicate, thisArg, 3);
  4311. return new AnonymousObservable(function(o) {
  4312. var i = 0;
  4313. return source.subscribe(function(x) {
  4314. var shouldRun;
  4315. try {
  4316. shouldRun = callback(x, i, source);
  4317. } catch (e) {
  4318. o.onError(e);
  4319. return ;
  4320. }
  4321. if (shouldRun) {
  4322. o.onNext(yieldIndex ? i : x);
  4323. o.onCompleted();
  4324. } else {
  4325. i++;
  4326. }
  4327. }, function(e) {
  4328. o.onError(e);
  4329. }, function() {
  4330. o.onNext(yieldIndex ? -1 : undefined);
  4331. o.onCompleted();
  4332. });
  4333. }, source);
  4334. }
  4335. observableProto.find = function(predicate, thisArg) {
  4336. return findValue(this, predicate, thisArg, false);
  4337. };
  4338. observableProto.findIndex = function(predicate, thisArg) {
  4339. return findValue(this, predicate, thisArg, true);
  4340. };
  4341. observableProto.toSet = function() {
  4342. if (typeof root.Set === 'undefined') {
  4343. throw new TypeError();
  4344. }
  4345. var source = this;
  4346. return new AnonymousObservable(function(o) {
  4347. var s = new root.Set();
  4348. return source.subscribe(function(x) {
  4349. s.add(x);
  4350. }, function(e) {
  4351. o.onError(e);
  4352. }, function() {
  4353. o.onNext(s);
  4354. o.onCompleted();
  4355. });
  4356. }, source);
  4357. };
  4358. observableProto.toMap = function(keySelector, elementSelector) {
  4359. if (typeof root.Map === 'undefined') {
  4360. throw new TypeError();
  4361. }
  4362. var source = this;
  4363. return new AnonymousObservable(function(o) {
  4364. var m = new root.Map();
  4365. return source.subscribe(function(x) {
  4366. var key;
  4367. try {
  4368. key = keySelector(x);
  4369. } catch (e) {
  4370. o.onError(e);
  4371. return ;
  4372. }
  4373. var element = x;
  4374. if (elementSelector) {
  4375. try {
  4376. element = elementSelector(x);
  4377. } catch (e) {
  4378. o.onError(e);
  4379. return ;
  4380. }
  4381. }
  4382. m.set(key, element);
  4383. }, function(e) {
  4384. o.onError(e);
  4385. }, function() {
  4386. o.onNext(m);
  4387. o.onCompleted();
  4388. });
  4389. }, source);
  4390. };
  4391. var fnString = 'function',
  4392. throwString = 'throw',
  4393. isObject = Rx.internals.isObject;
  4394. function toThunk(obj, ctx) {
  4395. if (Array.isArray(obj)) {
  4396. return objectToThunk.call(ctx, obj);
  4397. }
  4398. if (isGeneratorFunction(obj)) {
  4399. return observableSpawn(obj.call(ctx));
  4400. }
  4401. if (isGenerator(obj)) {
  4402. return observableSpawn(obj);
  4403. }
  4404. if (isObservable(obj)) {
  4405. return observableToThunk(obj);
  4406. }
  4407. if (isPromise(obj)) {
  4408. return promiseToThunk(obj);
  4409. }
  4410. if (typeof obj === fnString) {
  4411. return obj;
  4412. }
  4413. if (isObject(obj) || Array.isArray(obj)) {
  4414. return objectToThunk.call(ctx, obj);
  4415. }
  4416. return obj;
  4417. }
  4418. function objectToThunk(obj) {
  4419. var ctx = this;
  4420. return function(done) {
  4421. var keys = Object.keys(obj),
  4422. pending = keys.length,
  4423. results = new obj.constructor(),
  4424. finished;
  4425. if (!pending) {
  4426. timeoutScheduler.schedule(function() {
  4427. done(null, results);
  4428. });
  4429. return ;
  4430. }
  4431. for (var i = 0,
  4432. len = keys.length; i < len; i++) {
  4433. run(obj[keys[i]], keys[i]);
  4434. }
  4435. function run(fn, key) {
  4436. if (finished) {
  4437. return ;
  4438. }
  4439. try {
  4440. fn = toThunk(fn, ctx);
  4441. if (typeof fn !== fnString) {
  4442. results[key] = fn;
  4443. return --pending || done(null, results);
  4444. }
  4445. fn.call(ctx, function(err, res) {
  4446. if (finished) {
  4447. return ;
  4448. }
  4449. if (err) {
  4450. finished = true;
  4451. return done(err);
  4452. }
  4453. results[key] = res;
  4454. --pending || done(null, results);
  4455. });
  4456. } catch (e) {
  4457. finished = true;
  4458. done(e);
  4459. }
  4460. }
  4461. };
  4462. }
  4463. function observableToThunk(observable) {
  4464. return function(fn) {
  4465. var value,
  4466. hasValue = false;
  4467. observable.subscribe(function(v) {
  4468. value = v;
  4469. hasValue = true;
  4470. }, fn, function() {
  4471. hasValue && fn(null, value);
  4472. });
  4473. };
  4474. }
  4475. function promiseToThunk(promise) {
  4476. return function(fn) {
  4477. promise.then(function(res) {
  4478. fn(null, res);
  4479. }, fn);
  4480. };
  4481. }
  4482. function isObservable(obj) {
  4483. return obj && typeof obj.subscribe === fnString;
  4484. }
  4485. function isGeneratorFunction(obj) {
  4486. return obj && obj.constructor && obj.constructor.name === 'GeneratorFunction';
  4487. }
  4488. function isGenerator(obj) {
  4489. return obj && typeof obj.next === fnString && typeof obj[throwString] === fnString;
  4490. }
  4491. var observableSpawn = Rx.spawn = function(fn) {
  4492. var isGenFun = isGeneratorFunction(fn);
  4493. return function(done) {
  4494. var ctx = this,
  4495. gen = fn;
  4496. if (isGenFun) {
  4497. for (var args = [],
  4498. i = 0,
  4499. len = arguments.length; i < len; i++) {
  4500. args.push(arguments[i]);
  4501. }
  4502. var len = args.length,
  4503. hasCallback = len && typeof args[len - 1] === fnString;
  4504. done = hasCallback ? args.pop() : handleError;
  4505. gen = fn.apply(this, args);
  4506. } else {
  4507. done = done || handleError;
  4508. }
  4509. next();
  4510. function exit(err, res) {
  4511. timeoutScheduler.schedule(done.bind(ctx, err, res));
  4512. }
  4513. function next(err, res) {
  4514. var ret;
  4515. if (arguments.length > 2) {
  4516. for (var res = [],
  4517. i = 1,
  4518. len = arguments.length; i < len; i++) {
  4519. res.push(arguments[i]);
  4520. }
  4521. }
  4522. if (err) {
  4523. try {
  4524. ret = gen[throwString](err);
  4525. } catch (e) {
  4526. return exit(e);
  4527. }
  4528. }
  4529. if (!err) {
  4530. try {
  4531. ret = gen.next(res);
  4532. } catch (e) {
  4533. return exit(e);
  4534. }
  4535. }
  4536. if (ret.done) {
  4537. return exit(null, ret.value);
  4538. }
  4539. ret.value = toThunk(ret.value, ctx);
  4540. if (typeof ret.value === fnString) {
  4541. var called = false;
  4542. try {
  4543. ret.value.call(ctx, function() {
  4544. if (called) {
  4545. return ;
  4546. }
  4547. called = true;
  4548. next.apply(ctx, arguments);
  4549. });
  4550. } catch (e) {
  4551. timeoutScheduler.schedule(function() {
  4552. if (called) {
  4553. return ;
  4554. }
  4555. called = true;
  4556. next.call(ctx, e);
  4557. });
  4558. }
  4559. return ;
  4560. }
  4561. next(new TypeError('Rx.spawn only supports a function, Promise, Observable, Object or Array.'));
  4562. }
  4563. };
  4564. };
  4565. function handleError(err) {
  4566. if (!err) {
  4567. return ;
  4568. }
  4569. timeoutScheduler.schedule(function() {
  4570. throw err;
  4571. });
  4572. }
  4573. Observable.start = function(func, context, scheduler) {
  4574. return observableToAsync(func, context, scheduler)();
  4575. };
  4576. var observableToAsync = Observable.toAsync = function(func, context, scheduler) {
  4577. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  4578. return function() {
  4579. var args = arguments,
  4580. subject = new AsyncSubject();
  4581. scheduler.schedule(function() {
  4582. var result;
  4583. try {
  4584. result = func.apply(context, args);
  4585. } catch (e) {
  4586. subject.onError(e);
  4587. return ;
  4588. }
  4589. subject.onNext(result);
  4590. subject.onCompleted();
  4591. });
  4592. return subject.asObservable();
  4593. };
  4594. };
  4595. Observable.fromCallback = function(func, context, selector) {
  4596. return function() {
  4597. var len = arguments.length,
  4598. args = new Array(len);
  4599. for (var i = 0; i < len; i++) {
  4600. args[i] = arguments[i];
  4601. }
  4602. return new AnonymousObservable(function(observer) {
  4603. function handler() {
  4604. var len = arguments.length,
  4605. results = new Array(len);
  4606. for (var i = 0; i < len; i++) {
  4607. results[i] = arguments[i];
  4608. }
  4609. if (selector) {
  4610. try {
  4611. results = selector.apply(context, results);
  4612. } catch (e) {
  4613. return observer.onError(e);
  4614. }
  4615. observer.onNext(results);
  4616. } else {
  4617. if (results.length <= 1) {
  4618. observer.onNext.apply(observer, results);
  4619. } else {
  4620. observer.onNext(results);
  4621. }
  4622. }
  4623. observer.onCompleted();
  4624. }
  4625. args.push(handler);
  4626. func.apply(context, args);
  4627. }).publishLast().refCount();
  4628. };
  4629. };
  4630. Observable.fromNodeCallback = function(func, context, selector) {
  4631. return function() {
  4632. var len = arguments.length,
  4633. args = new Array(len);
  4634. for (var i = 0; i < len; i++) {
  4635. args[i] = arguments[i];
  4636. }
  4637. return new AnonymousObservable(function(observer) {
  4638. function handler(err) {
  4639. if (err) {
  4640. observer.onError(err);
  4641. return ;
  4642. }
  4643. var len = arguments.length,
  4644. results = [];
  4645. for (var i = 1; i < len; i++) {
  4646. results[i - 1] = arguments[i];
  4647. }
  4648. if (selector) {
  4649. try {
  4650. results = selector.apply(context, results);
  4651. } catch (e) {
  4652. return observer.onError(e);
  4653. }
  4654. observer.onNext(results);
  4655. } else {
  4656. if (results.length <= 1) {
  4657. observer.onNext.apply(observer, results);
  4658. } else {
  4659. observer.onNext(results);
  4660. }
  4661. }
  4662. observer.onCompleted();
  4663. }
  4664. args.push(handler);
  4665. func.apply(context, args);
  4666. }).publishLast().refCount();
  4667. };
  4668. };
  4669. function createListener(element, name, handler) {
  4670. if (element.addEventListener) {
  4671. element.addEventListener(name, handler, false);
  4672. return disposableCreate(function() {
  4673. element.removeEventListener(name, handler, false);
  4674. });
  4675. }
  4676. throw new Error('No listener found');
  4677. }
  4678. function createEventListener(el, eventName, handler) {
  4679. var disposables = new CompositeDisposable();
  4680. if (Object.prototype.toString.call(el) === '[object NodeList]') {
  4681. for (var i = 0,
  4682. len = el.length; i < len; i++) {
  4683. disposables.add(createEventListener(el.item(i), eventName, handler));
  4684. }
  4685. } else if (el) {
  4686. disposables.add(createListener(el, eventName, handler));
  4687. }
  4688. return disposables;
  4689. }
  4690. Rx.config.useNativeEvents = false;
  4691. Observable.fromEvent = function(element, eventName, selector) {
  4692. if (element.addListener) {
  4693. return fromEventPattern(function(h) {
  4694. element.addListener(eventName, h);
  4695. }, function(h) {
  4696. element.removeListener(eventName, h);
  4697. }, selector);
  4698. }
  4699. if (!Rx.config.useNativeEvents) {
  4700. if (typeof element.on === 'function' && typeof element.off === 'function') {
  4701. return fromEventPattern(function(h) {
  4702. element.on(eventName, h);
  4703. }, function(h) {
  4704. element.off(eventName, h);
  4705. }, selector);
  4706. }
  4707. }
  4708. return new AnonymousObservable(function(observer) {
  4709. return createEventListener(element, eventName, function handler(e) {
  4710. var results = e;
  4711. if (selector) {
  4712. try {
  4713. results = selector(arguments);
  4714. } catch (err) {
  4715. return observer.onError(err);
  4716. }
  4717. }
  4718. observer.onNext(results);
  4719. });
  4720. }).publish().refCount();
  4721. };
  4722. var fromEventPattern = Observable.fromEventPattern = function(addHandler, removeHandler, selector) {
  4723. return new AnonymousObservable(function(observer) {
  4724. function innerHandler(e) {
  4725. var result = e;
  4726. if (selector) {
  4727. try {
  4728. result = selector(arguments);
  4729. } catch (err) {
  4730. return observer.onError(err);
  4731. }
  4732. }
  4733. observer.onNext(result);
  4734. }
  4735. var returnValue = addHandler(innerHandler);
  4736. return disposableCreate(function() {
  4737. if (removeHandler) {
  4738. removeHandler(innerHandler, returnValue);
  4739. }
  4740. });
  4741. }).publish().refCount();
  4742. };
  4743. Observable.startAsync = function(functionAsync) {
  4744. var promise;
  4745. try {
  4746. promise = functionAsync();
  4747. } catch (e) {
  4748. return observableThrow(e);
  4749. }
  4750. return observableFromPromise(promise);
  4751. };
  4752. var PausableObservable = (function(__super__) {
  4753. inherits(PausableObservable, __super__);
  4754. function subscribe(observer) {
  4755. var conn = this.source.publish(),
  4756. subscription = conn.subscribe(observer),
  4757. connection = disposableEmpty;
  4758. var pausable = this.pauser.distinctUntilChanged().subscribe(function(b) {
  4759. if (b) {
  4760. connection = conn.connect();
  4761. } else {
  4762. connection.dispose();
  4763. connection = disposableEmpty;
  4764. }
  4765. });
  4766. return new CompositeDisposable(subscription, connection, pausable);
  4767. }
  4768. function PausableObservable(source, pauser) {
  4769. this.source = source;
  4770. this.controller = new Subject();
  4771. if (pauser && pauser.subscribe) {
  4772. this.pauser = this.controller.merge(pauser);
  4773. } else {
  4774. this.pauser = this.controller;
  4775. }
  4776. __super__.call(this, subscribe, source);
  4777. }
  4778. PausableObservable.prototype.pause = function() {
  4779. this.controller.onNext(false);
  4780. };
  4781. PausableObservable.prototype.resume = function() {
  4782. this.controller.onNext(true);
  4783. };
  4784. return PausableObservable;
  4785. }(Observable));
  4786. observableProto.pausable = function(pauser) {
  4787. return new PausableObservable(this, pauser);
  4788. };
  4789. function combineLatestSource(source, subject, resultSelector) {
  4790. return new AnonymousObservable(function(o) {
  4791. var hasValue = [false, false],
  4792. hasValueAll = false,
  4793. isDone = false,
  4794. values = new Array(2),
  4795. err;
  4796. function next(x, i) {
  4797. values[i] = x;
  4798. var res;
  4799. hasValue[i] = true;
  4800. if (hasValueAll || (hasValueAll = hasValue.every(identity))) {
  4801. if (err) {
  4802. o.onError(err);
  4803. return ;
  4804. }
  4805. try {
  4806. res = resultSelector.apply(null, values);
  4807. } catch (ex) {
  4808. o.onError(ex);
  4809. return ;
  4810. }
  4811. o.onNext(res);
  4812. }
  4813. if (isDone && values[1]) {
  4814. o.onCompleted();
  4815. }
  4816. }
  4817. return new CompositeDisposable(source.subscribe(function(x) {
  4818. next(x, 0);
  4819. }, function(e) {
  4820. if (values[1]) {
  4821. o.onError(e);
  4822. } else {
  4823. err = e;
  4824. }
  4825. }, function() {
  4826. isDone = true;
  4827. values[1] && o.onCompleted();
  4828. }), subject.subscribe(function(x) {
  4829. next(x, 1);
  4830. }, function(e) {
  4831. o.onError(e);
  4832. }, function() {
  4833. isDone = true;
  4834. next(true, 1);
  4835. }));
  4836. }, source);
  4837. }
  4838. var PausableBufferedObservable = (function(__super__) {
  4839. inherits(PausableBufferedObservable, __super__);
  4840. function subscribe(o) {
  4841. var q = [],
  4842. previousShouldFire;
  4843. var subscription = combineLatestSource(this.source, this.pauser.distinctUntilChanged().startWith(false), function(data, shouldFire) {
  4844. return {
  4845. data: data,
  4846. shouldFire: shouldFire
  4847. };
  4848. }).subscribe(function(results) {
  4849. if (previousShouldFire !== undefined && results.shouldFire != previousShouldFire) {
  4850. previousShouldFire = results.shouldFire;
  4851. if (results.shouldFire) {
  4852. while (q.length > 0) {
  4853. o.onNext(q.shift());
  4854. }
  4855. }
  4856. } else {
  4857. previousShouldFire = results.shouldFire;
  4858. if (results.shouldFire) {
  4859. o.onNext(results.data);
  4860. } else {
  4861. q.push(results.data);
  4862. }
  4863. }
  4864. }, function(err) {
  4865. while (q.length > 0) {
  4866. o.onNext(q.shift());
  4867. }
  4868. o.onError(err);
  4869. }, function() {
  4870. while (q.length > 0) {
  4871. o.onNext(q.shift());
  4872. }
  4873. o.onCompleted();
  4874. });
  4875. return subscription;
  4876. }
  4877. function PausableBufferedObservable(source, pauser) {
  4878. this.source = source;
  4879. this.controller = new Subject();
  4880. if (pauser && pauser.subscribe) {
  4881. this.pauser = this.controller.merge(pauser);
  4882. } else {
  4883. this.pauser = this.controller;
  4884. }
  4885. __super__.call(this, subscribe, source);
  4886. }
  4887. PausableBufferedObservable.prototype.pause = function() {
  4888. this.controller.onNext(false);
  4889. };
  4890. PausableBufferedObservable.prototype.resume = function() {
  4891. this.controller.onNext(true);
  4892. };
  4893. return PausableBufferedObservable;
  4894. }(Observable));
  4895. observableProto.pausableBuffered = function(subject) {
  4896. return new PausableBufferedObservable(this, subject);
  4897. };
  4898. var ControlledObservable = (function(__super__) {
  4899. inherits(ControlledObservable, __super__);
  4900. function subscribe(observer) {
  4901. return this.source.subscribe(observer);
  4902. }
  4903. function ControlledObservable(source, enableQueue) {
  4904. __super__.call(this, subscribe, source);
  4905. this.subject = new ControlledSubject(enableQueue);
  4906. this.source = source.multicast(this.subject).refCount();
  4907. }
  4908. ControlledObservable.prototype.request = function(numberOfItems) {
  4909. if (numberOfItems == null) {
  4910. numberOfItems = -1;
  4911. }
  4912. return this.subject.request(numberOfItems);
  4913. };
  4914. return ControlledObservable;
  4915. }(Observable));
  4916. var ControlledSubject = (function(__super__) {
  4917. function subscribe(observer) {
  4918. return this.subject.subscribe(observer);
  4919. }
  4920. inherits(ControlledSubject, __super__);
  4921. function ControlledSubject(enableQueue) {
  4922. enableQueue == null && (enableQueue = true);
  4923. __super__.call(this, subscribe);
  4924. this.subject = new Subject();
  4925. this.enableQueue = enableQueue;
  4926. this.queue = enableQueue ? [] : null;
  4927. this.requestedCount = 0;
  4928. this.requestedDisposable = disposableEmpty;
  4929. this.error = null;
  4930. this.hasFailed = false;
  4931. this.hasCompleted = false;
  4932. }
  4933. addProperties(ControlledSubject.prototype, Observer, {
  4934. onCompleted: function() {
  4935. this.hasCompleted = true;
  4936. if (!this.enableQueue || this.queue.length === 0)
  4937. this.subject.onCompleted();
  4938. else
  4939. this.queue.push(Rx.Notification.createOnCompleted());
  4940. },
  4941. onError: function(error) {
  4942. this.hasFailed = true;
  4943. this.error = error;
  4944. if (!this.enableQueue || this.queue.length === 0)
  4945. this.subject.onError(error);
  4946. else
  4947. this.queue.push(Rx.Notification.createOnError(error));
  4948. },
  4949. onNext: function(value) {
  4950. var hasRequested = false;
  4951. if (this.requestedCount === 0) {
  4952. this.enableQueue && this.queue.push(Rx.Notification.createOnNext(value));
  4953. } else {
  4954. (this.requestedCount !== -1 && this.requestedCount-- === 0) && this.disposeCurrentRequest();
  4955. hasRequested = true;
  4956. }
  4957. hasRequested && this.subject.onNext(value);
  4958. },
  4959. _processRequest: function(numberOfItems) {
  4960. if (this.enableQueue) {
  4961. while ((this.queue.length >= numberOfItems && numberOfItems > 0) || (this.queue.length > 0 && this.queue[0].kind !== 'N')) {
  4962. var first = this.queue.shift();
  4963. first.accept(this.subject);
  4964. if (first.kind === 'N')
  4965. numberOfItems--;
  4966. else {
  4967. this.disposeCurrentRequest();
  4968. this.queue = [];
  4969. }
  4970. }
  4971. return {
  4972. numberOfItems: numberOfItems,
  4973. returnValue: this.queue.length !== 0
  4974. };
  4975. }
  4976. return {
  4977. numberOfItems: numberOfItems,
  4978. returnValue: false
  4979. };
  4980. },
  4981. request: function(number) {
  4982. this.disposeCurrentRequest();
  4983. var self = this,
  4984. r = this._processRequest(number);
  4985. var number = r.numberOfItems;
  4986. if (!r.returnValue) {
  4987. this.requestedCount = number;
  4988. this.requestedDisposable = disposableCreate(function() {
  4989. self.requestedCount = 0;
  4990. });
  4991. return this.requestedDisposable;
  4992. } else {
  4993. return disposableEmpty;
  4994. }
  4995. },
  4996. disposeCurrentRequest: function() {
  4997. this.requestedDisposable.dispose();
  4998. this.requestedDisposable = disposableEmpty;
  4999. }
  5000. });
  5001. return ControlledSubject;
  5002. }(Observable));
  5003. observableProto.controlled = function(enableQueue) {
  5004. if (enableQueue == null) {
  5005. enableQueue = true;
  5006. }
  5007. return new ControlledObservable(this, enableQueue);
  5008. };
  5009. var StopAndWaitObservable = (function(__super__) {
  5010. function subscribe(observer) {
  5011. this.subscription = this.source.subscribe(new StopAndWaitObserver(observer, this, this.subscription));
  5012. var self = this;
  5013. timeoutScheduler.schedule(function() {
  5014. self.source.request(1);
  5015. });
  5016. return this.subscription;
  5017. }
  5018. inherits(StopAndWaitObservable, __super__);
  5019. function StopAndWaitObservable(source) {
  5020. __super__.call(this, subscribe, source);
  5021. this.source = source;
  5022. }
  5023. var StopAndWaitObserver = (function(__sub__) {
  5024. inherits(StopAndWaitObserver, __sub__);
  5025. function StopAndWaitObserver(observer, observable, cancel) {
  5026. __sub__.call(this);
  5027. this.observer = observer;
  5028. this.observable = observable;
  5029. this.cancel = cancel;
  5030. }
  5031. var stopAndWaitObserverProto = StopAndWaitObserver.prototype;
  5032. stopAndWaitObserverProto.completed = function() {
  5033. this.observer.onCompleted();
  5034. this.dispose();
  5035. };
  5036. stopAndWaitObserverProto.error = function(error) {
  5037. this.observer.onError(error);
  5038. this.dispose();
  5039. };
  5040. stopAndWaitObserverProto.next = function(value) {
  5041. this.observer.onNext(value);
  5042. var self = this;
  5043. timeoutScheduler.schedule(function() {
  5044. self.observable.source.request(1);
  5045. });
  5046. };
  5047. stopAndWaitObserverProto.dispose = function() {
  5048. this.observer = null;
  5049. if (this.cancel) {
  5050. this.cancel.dispose();
  5051. this.cancel = null;
  5052. }
  5053. __sub__.prototype.dispose.call(this);
  5054. };
  5055. return StopAndWaitObserver;
  5056. }(AbstractObserver));
  5057. return StopAndWaitObservable;
  5058. }(Observable));
  5059. ControlledObservable.prototype.stopAndWait = function() {
  5060. return new StopAndWaitObservable(this);
  5061. };
  5062. var WindowedObservable = (function(__super__) {
  5063. function subscribe(observer) {
  5064. this.subscription = this.source.subscribe(new WindowedObserver(observer, this, this.subscription));
  5065. var self = this;
  5066. timeoutScheduler.schedule(function() {
  5067. self.source.request(self.windowSize);
  5068. });
  5069. return this.subscription;
  5070. }
  5071. inherits(WindowedObservable, __super__);
  5072. function WindowedObservable(source, windowSize) {
  5073. __super__.call(this, subscribe, source);
  5074. this.source = source;
  5075. this.windowSize = windowSize;
  5076. }
  5077. var WindowedObserver = (function(__sub__) {
  5078. inherits(WindowedObserver, __sub__);
  5079. function WindowedObserver(observer, observable, cancel) {
  5080. this.observer = observer;
  5081. this.observable = observable;
  5082. this.cancel = cancel;
  5083. this.received = 0;
  5084. }
  5085. var windowedObserverPrototype = WindowedObserver.prototype;
  5086. windowedObserverPrototype.completed = function() {
  5087. this.observer.onCompleted();
  5088. this.dispose();
  5089. };
  5090. windowedObserverPrototype.error = function(error) {
  5091. this.observer.onError(error);
  5092. this.dispose();
  5093. };
  5094. windowedObserverPrototype.next = function(value) {
  5095. this.observer.onNext(value);
  5096. this.received = ++this.received % this.observable.windowSize;
  5097. if (this.received === 0) {
  5098. var self = this;
  5099. timeoutScheduler.schedule(function() {
  5100. self.observable.source.request(self.observable.windowSize);
  5101. });
  5102. }
  5103. };
  5104. windowedObserverPrototype.dispose = function() {
  5105. this.observer = null;
  5106. if (this.cancel) {
  5107. this.cancel.dispose();
  5108. this.cancel = null;
  5109. }
  5110. __sub__.prototype.dispose.call(this);
  5111. };
  5112. return WindowedObserver;
  5113. }(AbstractObserver));
  5114. return WindowedObservable;
  5115. }(Observable));
  5116. ControlledObservable.prototype.windowed = function(windowSize) {
  5117. return new WindowedObservable(this, windowSize);
  5118. };
  5119. observableProto.pipe = function(dest) {
  5120. var source = this.pausableBuffered();
  5121. function onDrain() {
  5122. source.resume();
  5123. }
  5124. dest.addListener('drain', onDrain);
  5125. source.subscribe(function(x) {
  5126. !dest.write(String(x)) && source.pause();
  5127. }, function(err) {
  5128. dest.emit('error', err);
  5129. }, function() {
  5130. !dest._isStdio && dest.end();
  5131. dest.removeListener('drain', onDrain);
  5132. });
  5133. source.resume();
  5134. return dest;
  5135. };
  5136. observableProto.multicast = function(subjectOrSubjectSelector, selector) {
  5137. var source = this;
  5138. return typeof subjectOrSubjectSelector === 'function' ? new AnonymousObservable(function(observer) {
  5139. var connectable = source.multicast(subjectOrSubjectSelector());
  5140. return new CompositeDisposable(selector(connectable).subscribe(observer), connectable.connect());
  5141. }, source) : new ConnectableObservable(source, subjectOrSubjectSelector);
  5142. };
  5143. observableProto.publish = function(selector) {
  5144. return selector && isFunction(selector) ? this.multicast(function() {
  5145. return new Subject();
  5146. }, selector) : this.multicast(new Subject());
  5147. };
  5148. observableProto.share = function() {
  5149. return this.publish().refCount();
  5150. };
  5151. observableProto.publishLast = function(selector) {
  5152. return selector && isFunction(selector) ? this.multicast(function() {
  5153. return new AsyncSubject();
  5154. }, selector) : this.multicast(new AsyncSubject());
  5155. };
  5156. observableProto.publishValue = function(initialValueOrSelector, initialValue) {
  5157. return arguments.length === 2 ? this.multicast(function() {
  5158. return new BehaviorSubject(initialValue);
  5159. }, initialValueOrSelector) : this.multicast(new BehaviorSubject(initialValueOrSelector));
  5160. };
  5161. observableProto.shareValue = function(initialValue) {
  5162. return this.publishValue(initialValue).refCount();
  5163. };
  5164. observableProto.replay = function(selector, bufferSize, windowSize, scheduler) {
  5165. return selector && isFunction(selector) ? this.multicast(function() {
  5166. return new ReplaySubject(bufferSize, windowSize, scheduler);
  5167. }, selector) : this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));
  5168. };
  5169. observableProto.shareReplay = function(bufferSize, windowSize, scheduler) {
  5170. return this.replay(null, bufferSize, windowSize, scheduler).refCount();
  5171. };
  5172. var InnerSubscription = function(subject, observer) {
  5173. this.subject = subject;
  5174. this.observer = observer;
  5175. };
  5176. InnerSubscription.prototype.dispose = function() {
  5177. if (!this.subject.isDisposed && this.observer !== null) {
  5178. var idx = this.subject.observers.indexOf(this.observer);
  5179. this.subject.observers.splice(idx, 1);
  5180. this.observer = null;
  5181. }
  5182. };
  5183. var BehaviorSubject = Rx.BehaviorSubject = (function(__super__) {
  5184. function subscribe(observer) {
  5185. checkDisposed(this);
  5186. if (!this.isStopped) {
  5187. this.observers.push(observer);
  5188. observer.onNext(this.value);
  5189. return new InnerSubscription(this, observer);
  5190. }
  5191. if (this.hasError) {
  5192. observer.onError(this.error);
  5193. } else {
  5194. observer.onCompleted();
  5195. }
  5196. return disposableEmpty;
  5197. }
  5198. inherits(BehaviorSubject, __super__);
  5199. function BehaviorSubject(value) {
  5200. __super__.call(this, subscribe);
  5201. this.value = value, this.observers = [], this.isDisposed = false, this.isStopped = false, this.hasError = false;
  5202. }
  5203. addProperties(BehaviorSubject.prototype, Observer, {
  5204. getValue: function() {
  5205. checkDisposed(this);
  5206. if (this.hasError) {
  5207. throw this.error;
  5208. }
  5209. return this.value;
  5210. },
  5211. hasObservers: function() {
  5212. return this.observers.length > 0;
  5213. },
  5214. onCompleted: function() {
  5215. checkDisposed(this);
  5216. if (this.isStopped) {
  5217. return ;
  5218. }
  5219. this.isStopped = true;
  5220. for (var i = 0,
  5221. os = cloneArray(this.observers),
  5222. len = os.length; i < len; i++) {
  5223. os[i].onCompleted();
  5224. }
  5225. this.observers.length = 0;
  5226. },
  5227. onError: function(error) {
  5228. checkDisposed(this);
  5229. if (this.isStopped) {
  5230. return ;
  5231. }
  5232. this.isStopped = true;
  5233. this.hasError = true;
  5234. this.error = error;
  5235. for (var i = 0,
  5236. os = cloneArray(this.observers),
  5237. len = os.length; i < len; i++) {
  5238. os[i].onError(error);
  5239. }
  5240. this.observers.length = 0;
  5241. },
  5242. onNext: function(value) {
  5243. checkDisposed(this);
  5244. if (this.isStopped) {
  5245. return ;
  5246. }
  5247. this.value = value;
  5248. for (var i = 0,
  5249. os = cloneArray(this.observers),
  5250. len = os.length; i < len; i++) {
  5251. os[i].onNext(value);
  5252. }
  5253. },
  5254. dispose: function() {
  5255. this.isDisposed = true;
  5256. this.observers = null;
  5257. this.value = null;
  5258. this.exception = null;
  5259. }
  5260. });
  5261. return BehaviorSubject;
  5262. }(Observable));
  5263. var ReplaySubject = Rx.ReplaySubject = (function(__super__) {
  5264. var maxSafeInteger = Math.pow(2, 53) - 1;
  5265. function createRemovableDisposable(subject, observer) {
  5266. return disposableCreate(function() {
  5267. observer.dispose();
  5268. !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);
  5269. });
  5270. }
  5271. function subscribe(observer) {
  5272. var so = new ScheduledObserver(this.scheduler, observer),
  5273. subscription = createRemovableDisposable(this, so);
  5274. checkDisposed(this);
  5275. this._trim(this.scheduler.now());
  5276. this.observers.push(so);
  5277. for (var i = 0,
  5278. len = this.q.length; i < len; i++) {
  5279. so.onNext(this.q[i].value);
  5280. }
  5281. if (this.hasError) {
  5282. so.onError(this.error);
  5283. } else if (this.isStopped) {
  5284. so.onCompleted();
  5285. }
  5286. so.ensureActive();
  5287. return subscription;
  5288. }
  5289. inherits(ReplaySubject, __super__);
  5290. function ReplaySubject(bufferSize, windowSize, scheduler) {
  5291. this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;
  5292. this.windowSize = windowSize == null ? maxSafeInteger : windowSize;
  5293. this.scheduler = scheduler || currentThreadScheduler;
  5294. this.q = [];
  5295. this.observers = [];
  5296. this.isStopped = false;
  5297. this.isDisposed = false;
  5298. this.hasError = false;
  5299. this.error = null;
  5300. __super__.call(this, subscribe);
  5301. }
  5302. addProperties(ReplaySubject.prototype, Observer.prototype, {
  5303. hasObservers: function() {
  5304. return this.observers.length > 0;
  5305. },
  5306. _trim: function(now) {
  5307. while (this.q.length > this.bufferSize) {
  5308. this.q.shift();
  5309. }
  5310. while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {
  5311. this.q.shift();
  5312. }
  5313. },
  5314. onNext: function(value) {
  5315. checkDisposed(this);
  5316. if (this.isStopped) {
  5317. return ;
  5318. }
  5319. var now = this.scheduler.now();
  5320. this.q.push({
  5321. interval: now,
  5322. value: value
  5323. });
  5324. this._trim(now);
  5325. for (var i = 0,
  5326. os = cloneArray(this.observers),
  5327. len = os.length; i < len; i++) {
  5328. var observer = os[i];
  5329. observer.onNext(value);
  5330. observer.ensureActive();
  5331. }
  5332. },
  5333. onError: function(error) {
  5334. checkDisposed(this);
  5335. if (this.isStopped) {
  5336. return ;
  5337. }
  5338. this.isStopped = true;
  5339. this.error = error;
  5340. this.hasError = true;
  5341. var now = this.scheduler.now();
  5342. this._trim(now);
  5343. for (var i = 0,
  5344. os = cloneArray(this.observers),
  5345. len = os.length; i < len; i++) {
  5346. var observer = os[i];
  5347. observer.onError(error);
  5348. observer.ensureActive();
  5349. }
  5350. this.observers.length = 0;
  5351. },
  5352. onCompleted: function() {
  5353. checkDisposed(this);
  5354. if (this.isStopped) {
  5355. return ;
  5356. }
  5357. this.isStopped = true;
  5358. var now = this.scheduler.now();
  5359. this._trim(now);
  5360. for (var i = 0,
  5361. os = cloneArray(this.observers),
  5362. len = os.length; i < len; i++) {
  5363. var observer = os[i];
  5364. observer.onCompleted();
  5365. observer.ensureActive();
  5366. }
  5367. this.observers.length = 0;
  5368. },
  5369. dispose: function() {
  5370. this.isDisposed = true;
  5371. this.observers = null;
  5372. }
  5373. });
  5374. return ReplaySubject;
  5375. }(Observable));
  5376. var ConnectableObservable = Rx.ConnectableObservable = (function(__super__) {
  5377. inherits(ConnectableObservable, __super__);
  5378. function ConnectableObservable(source, subject) {
  5379. var hasSubscription = false,
  5380. subscription,
  5381. sourceObservable = source.asObservable();
  5382. this.connect = function() {
  5383. if (!hasSubscription) {
  5384. hasSubscription = true;
  5385. subscription = new CompositeDisposable(sourceObservable.subscribe(subject), disposableCreate(function() {
  5386. hasSubscription = false;
  5387. }));
  5388. }
  5389. return subscription;
  5390. };
  5391. __super__.call(this, function(o) {
  5392. return subject.subscribe(o);
  5393. });
  5394. }
  5395. ConnectableObservable.prototype.refCount = function() {
  5396. var connectableSubscription,
  5397. count = 0,
  5398. source = this;
  5399. return new AnonymousObservable(function(observer) {
  5400. var shouldConnect = ++count === 1,
  5401. subscription = source.subscribe(observer);
  5402. shouldConnect && (connectableSubscription = source.connect());
  5403. return function() {
  5404. subscription.dispose();
  5405. --count === 0 && connectableSubscription.dispose();
  5406. };
  5407. });
  5408. };
  5409. return ConnectableObservable;
  5410. }(Observable));
  5411. var Dictionary = (function() {
  5412. var primes = [1, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647],
  5413. noSuchkey = "no such key",
  5414. duplicatekey = "duplicate key";
  5415. function isPrime(candidate) {
  5416. if ((candidate & 1) === 0) {
  5417. return candidate === 2;
  5418. }
  5419. var num1 = Math.sqrt(candidate),
  5420. num2 = 3;
  5421. while (num2 <= num1) {
  5422. if (candidate % num2 === 0) {
  5423. return false;
  5424. }
  5425. num2 += 2;
  5426. }
  5427. return true;
  5428. }
  5429. function getPrime(min) {
  5430. var index,
  5431. num,
  5432. candidate;
  5433. for (index = 0; index < primes.length; ++index) {
  5434. num = primes[index];
  5435. if (num >= min) {
  5436. return num;
  5437. }
  5438. }
  5439. candidate = min | 1;
  5440. while (candidate < primes[primes.length - 1]) {
  5441. if (isPrime(candidate)) {
  5442. return candidate;
  5443. }
  5444. candidate += 2;
  5445. }
  5446. return min;
  5447. }
  5448. function stringHashFn(str) {
  5449. var hash = 757602046;
  5450. if (!str.length) {
  5451. return hash;
  5452. }
  5453. for (var i = 0,
  5454. len = str.length; i < len; i++) {
  5455. var character = str.charCodeAt(i);
  5456. hash = ((hash << 5) - hash) + character;
  5457. hash = hash & hash;
  5458. }
  5459. return hash;
  5460. }
  5461. function numberHashFn(key) {
  5462. var c2 = 0x27d4eb2d;
  5463. key = (key ^ 61) ^ (key >>> 16);
  5464. key = key + (key << 3);
  5465. key = key ^ (key >>> 4);
  5466. key = key * c2;
  5467. key = key ^ (key >>> 15);
  5468. return key;
  5469. }
  5470. var getHashCode = (function() {
  5471. var uniqueIdCounter = 0;
  5472. return function(obj) {
  5473. if (obj == null) {
  5474. throw new Error(noSuchkey);
  5475. }
  5476. if (typeof obj === 'string') {
  5477. return stringHashFn(obj);
  5478. }
  5479. if (typeof obj === 'number') {
  5480. return numberHashFn(obj);
  5481. }
  5482. if (typeof obj === 'boolean') {
  5483. return obj === true ? 1 : 0;
  5484. }
  5485. if (obj instanceof Date) {
  5486. return numberHashFn(obj.valueOf());
  5487. }
  5488. if (obj instanceof RegExp) {
  5489. return stringHashFn(obj.toString());
  5490. }
  5491. if (typeof obj.valueOf === 'function') {
  5492. var valueOf = obj.valueOf();
  5493. if (typeof valueOf === 'number') {
  5494. return numberHashFn(valueOf);
  5495. }
  5496. if (typeof valueOf === 'string') {
  5497. return stringHashFn(valueOf);
  5498. }
  5499. }
  5500. if (obj.hashCode) {
  5501. return obj.hashCode();
  5502. }
  5503. var id = 17 * uniqueIdCounter++;
  5504. obj.hashCode = function() {
  5505. return id;
  5506. };
  5507. return id;
  5508. };
  5509. }());
  5510. function newEntry() {
  5511. return {
  5512. key: null,
  5513. value: null,
  5514. next: 0,
  5515. hashCode: 0
  5516. };
  5517. }
  5518. function Dictionary(capacity, comparer) {
  5519. if (capacity < 0) {
  5520. throw new ArgumentOutOfRangeError();
  5521. }
  5522. if (capacity > 0) {
  5523. this._initialize(capacity);
  5524. }
  5525. this.comparer = comparer || defaultComparer;
  5526. this.freeCount = 0;
  5527. this.size = 0;
  5528. this.freeList = -1;
  5529. }
  5530. var dictionaryProto = Dictionary.prototype;
  5531. dictionaryProto._initialize = function(capacity) {
  5532. var prime = getPrime(capacity),
  5533. i;
  5534. this.buckets = new Array(prime);
  5535. this.entries = new Array(prime);
  5536. for (i = 0; i < prime; i++) {
  5537. this.buckets[i] = -1;
  5538. this.entries[i] = newEntry();
  5539. }
  5540. this.freeList = -1;
  5541. };
  5542. dictionaryProto.add = function(key, value) {
  5543. this._insert(key, value, true);
  5544. };
  5545. dictionaryProto._insert = function(key, value, add) {
  5546. if (!this.buckets) {
  5547. this._initialize(0);
  5548. }
  5549. var index3,
  5550. num = getHashCode(key) & 2147483647,
  5551. index1 = num % this.buckets.length;
  5552. for (var index2 = this.buckets[index1]; index2 >= 0; index2 = this.entries[index2].next) {
  5553. if (this.entries[index2].hashCode === num && this.comparer(this.entries[index2].key, key)) {
  5554. if (add) {
  5555. throw new Error(duplicatekey);
  5556. }
  5557. this.entries[index2].value = value;
  5558. return ;
  5559. }
  5560. }
  5561. if (this.freeCount > 0) {
  5562. index3 = this.freeList;
  5563. this.freeList = this.entries[index3].next;
  5564. --this.freeCount;
  5565. } else {
  5566. if (this.size === this.entries.length) {
  5567. this._resize();
  5568. index1 = num % this.buckets.length;
  5569. }
  5570. index3 = this.size;
  5571. ++this.size;
  5572. }
  5573. this.entries[index3].hashCode = num;
  5574. this.entries[index3].next = this.buckets[index1];
  5575. this.entries[index3].key = key;
  5576. this.entries[index3].value = value;
  5577. this.buckets[index1] = index3;
  5578. };
  5579. dictionaryProto._resize = function() {
  5580. var prime = getPrime(this.size * 2),
  5581. numArray = new Array(prime);
  5582. for (index = 0; index < numArray.length; ++index) {
  5583. numArray[index] = -1;
  5584. }
  5585. var entryArray = new Array(prime);
  5586. for (index = 0; index < this.size; ++index) {
  5587. entryArray[index] = this.entries[index];
  5588. }
  5589. for (var index = this.size; index < prime; ++index) {
  5590. entryArray[index] = newEntry();
  5591. }
  5592. for (var index1 = 0; index1 < this.size; ++index1) {
  5593. var index2 = entryArray[index1].hashCode % prime;
  5594. entryArray[index1].next = numArray[index2];
  5595. numArray[index2] = index1;
  5596. }
  5597. this.buckets = numArray;
  5598. this.entries = entryArray;
  5599. };
  5600. dictionaryProto.remove = function(key) {
  5601. if (this.buckets) {
  5602. var num = getHashCode(key) & 2147483647,
  5603. index1 = num % this.buckets.length,
  5604. index2 = -1;
  5605. for (var index3 = this.buckets[index1]; index3 >= 0; index3 = this.entries[index3].next) {
  5606. if (this.entries[index3].hashCode === num && this.comparer(this.entries[index3].key, key)) {
  5607. if (index2 < 0) {
  5608. this.buckets[index1] = this.entries[index3].next;
  5609. } else {
  5610. this.entries[index2].next = this.entries[index3].next;
  5611. }
  5612. this.entries[index3].hashCode = -1;
  5613. this.entries[index3].next = this.freeList;
  5614. this.entries[index3].key = null;
  5615. this.entries[index3].value = null;
  5616. this.freeList = index3;
  5617. ++this.freeCount;
  5618. return true;
  5619. } else {
  5620. index2 = index3;
  5621. }
  5622. }
  5623. }
  5624. return false;
  5625. };
  5626. dictionaryProto.clear = function() {
  5627. var index,
  5628. len;
  5629. if (this.size <= 0) {
  5630. return ;
  5631. }
  5632. for (index = 0, len = this.buckets.length; index < len; ++index) {
  5633. this.buckets[index] = -1;
  5634. }
  5635. for (index = 0; index < this.size; ++index) {
  5636. this.entries[index] = newEntry();
  5637. }
  5638. this.freeList = -1;
  5639. this.size = 0;
  5640. };
  5641. dictionaryProto._findEntry = function(key) {
  5642. if (this.buckets) {
  5643. var num = getHashCode(key) & 2147483647;
  5644. for (var index = this.buckets[num % this.buckets.length]; index >= 0; index = this.entries[index].next) {
  5645. if (this.entries[index].hashCode === num && this.comparer(this.entries[index].key, key)) {
  5646. return index;
  5647. }
  5648. }
  5649. }
  5650. return -1;
  5651. };
  5652. dictionaryProto.count = function() {
  5653. return this.size - this.freeCount;
  5654. };
  5655. dictionaryProto.tryGetValue = function(key) {
  5656. var entry = this._findEntry(key);
  5657. return entry >= 0 ? this.entries[entry].value : undefined;
  5658. };
  5659. dictionaryProto.getValues = function() {
  5660. var index = 0,
  5661. results = [];
  5662. if (this.entries) {
  5663. for (var index1 = 0; index1 < this.size; index1++) {
  5664. if (this.entries[index1].hashCode >= 0) {
  5665. results[index++] = this.entries[index1].value;
  5666. }
  5667. }
  5668. }
  5669. return results;
  5670. };
  5671. dictionaryProto.get = function(key) {
  5672. var entry = this._findEntry(key);
  5673. if (entry >= 0) {
  5674. return this.entries[entry].value;
  5675. }
  5676. throw new Error(noSuchkey);
  5677. };
  5678. dictionaryProto.set = function(key, value) {
  5679. this._insert(key, value, false);
  5680. };
  5681. dictionaryProto.containskey = function(key) {
  5682. return this._findEntry(key) >= 0;
  5683. };
  5684. return Dictionary;
  5685. }());
  5686. observableProto.join = function(right, leftDurationSelector, rightDurationSelector, resultSelector) {
  5687. var left = this;
  5688. return new AnonymousObservable(function(observer) {
  5689. var group = new CompositeDisposable();
  5690. var leftDone = false,
  5691. rightDone = false;
  5692. var leftId = 0,
  5693. rightId = 0;
  5694. var leftMap = new Dictionary(),
  5695. rightMap = new Dictionary();
  5696. group.add(left.subscribe(function(value) {
  5697. var id = leftId++;
  5698. var md = new SingleAssignmentDisposable();
  5699. leftMap.add(id, value);
  5700. group.add(md);
  5701. var expire = function() {
  5702. leftMap.remove(id) && leftMap.count() === 0 && leftDone && observer.onCompleted();
  5703. group.remove(md);
  5704. };
  5705. var duration;
  5706. try {
  5707. duration = leftDurationSelector(value);
  5708. } catch (e) {
  5709. observer.onError(e);
  5710. return ;
  5711. }
  5712. md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));
  5713. rightMap.getValues().forEach(function(v) {
  5714. var result;
  5715. try {
  5716. result = resultSelector(value, v);
  5717. } catch (exn) {
  5718. observer.onError(exn);
  5719. return ;
  5720. }
  5721. observer.onNext(result);
  5722. });
  5723. }, observer.onError.bind(observer), function() {
  5724. leftDone = true;
  5725. (rightDone || leftMap.count() === 0) && observer.onCompleted();
  5726. }));
  5727. group.add(right.subscribe(function(value) {
  5728. var id = rightId++;
  5729. var md = new SingleAssignmentDisposable();
  5730. rightMap.add(id, value);
  5731. group.add(md);
  5732. var expire = function() {
  5733. rightMap.remove(id) && rightMap.count() === 0 && rightDone && observer.onCompleted();
  5734. group.remove(md);
  5735. };
  5736. var duration;
  5737. try {
  5738. duration = rightDurationSelector(value);
  5739. } catch (e) {
  5740. observer.onError(e);
  5741. return ;
  5742. }
  5743. md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));
  5744. leftMap.getValues().forEach(function(v) {
  5745. var result;
  5746. try {
  5747. result = resultSelector(v, value);
  5748. } catch (exn) {
  5749. observer.onError(exn);
  5750. return ;
  5751. }
  5752. observer.onNext(result);
  5753. });
  5754. }, observer.onError.bind(observer), function() {
  5755. rightDone = true;
  5756. (leftDone || rightMap.count() === 0) && observer.onCompleted();
  5757. }));
  5758. return group;
  5759. }, left);
  5760. };
  5761. observableProto.groupJoin = function(right, leftDurationSelector, rightDurationSelector, resultSelector) {
  5762. var left = this;
  5763. return new AnonymousObservable(function(observer) {
  5764. var group = new CompositeDisposable();
  5765. var r = new RefCountDisposable(group);
  5766. var leftMap = new Dictionary(),
  5767. rightMap = new Dictionary();
  5768. var leftId = 0,
  5769. rightId = 0;
  5770. function handleError(e) {
  5771. return function(v) {
  5772. v.onError(e);
  5773. };
  5774. }
  5775. ;
  5776. group.add(left.subscribe(function(value) {
  5777. var s = new Subject();
  5778. var id = leftId++;
  5779. leftMap.add(id, s);
  5780. var result;
  5781. try {
  5782. result = resultSelector(value, addRef(s, r));
  5783. } catch (e) {
  5784. leftMap.getValues().forEach(handleError(e));
  5785. observer.onError(e);
  5786. return ;
  5787. }
  5788. observer.onNext(result);
  5789. rightMap.getValues().forEach(function(v) {
  5790. s.onNext(v);
  5791. });
  5792. var md = new SingleAssignmentDisposable();
  5793. group.add(md);
  5794. var expire = function() {
  5795. leftMap.remove(id) && s.onCompleted();
  5796. group.remove(md);
  5797. };
  5798. var duration;
  5799. try {
  5800. duration = leftDurationSelector(value);
  5801. } catch (e) {
  5802. leftMap.getValues().forEach(handleError(e));
  5803. observer.onError(e);
  5804. return ;
  5805. }
  5806. md.setDisposable(duration.take(1).subscribe(noop, function(e) {
  5807. leftMap.getValues().forEach(handleError(e));
  5808. observer.onError(e);
  5809. }, expire));
  5810. }, function(e) {
  5811. leftMap.getValues().forEach(handleError(e));
  5812. observer.onError(e);
  5813. }, observer.onCompleted.bind(observer)));
  5814. group.add(right.subscribe(function(value) {
  5815. var id = rightId++;
  5816. rightMap.add(id, value);
  5817. var md = new SingleAssignmentDisposable();
  5818. group.add(md);
  5819. var expire = function() {
  5820. rightMap.remove(id);
  5821. group.remove(md);
  5822. };
  5823. var duration;
  5824. try {
  5825. duration = rightDurationSelector(value);
  5826. } catch (e) {
  5827. leftMap.getValues().forEach(handleError(e));
  5828. observer.onError(e);
  5829. return ;
  5830. }
  5831. md.setDisposable(duration.take(1).subscribe(noop, function(e) {
  5832. leftMap.getValues().forEach(handleError(e));
  5833. observer.onError(e);
  5834. }, expire));
  5835. leftMap.getValues().forEach(function(v) {
  5836. v.onNext(value);
  5837. });
  5838. }, function(e) {
  5839. leftMap.getValues().forEach(handleError(e));
  5840. observer.onError(e);
  5841. }));
  5842. return r;
  5843. }, left);
  5844. };
  5845. observableProto.buffer = function(bufferOpeningsOrClosingSelector, bufferClosingSelector) {
  5846. return this.window.apply(this, arguments).selectMany(function(x) {
  5847. return x.toArray();
  5848. });
  5849. };
  5850. observableProto.window = function(windowOpeningsOrClosingSelector, windowClosingSelector) {
  5851. if (arguments.length === 1 && typeof arguments[0] !== 'function') {
  5852. return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);
  5853. }
  5854. return typeof windowOpeningsOrClosingSelector === 'function' ? observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) : observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);
  5855. };
  5856. function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {
  5857. return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function(_, win) {
  5858. return win;
  5859. });
  5860. }
  5861. function observableWindowWithBoundaries(windowBoundaries) {
  5862. var source = this;
  5863. return new AnonymousObservable(function(observer) {
  5864. var win = new Subject(),
  5865. d = new CompositeDisposable(),
  5866. r = new RefCountDisposable(d);
  5867. observer.onNext(addRef(win, r));
  5868. d.add(source.subscribe(function(x) {
  5869. win.onNext(x);
  5870. }, function(err) {
  5871. win.onError(err);
  5872. observer.onError(err);
  5873. }, function() {
  5874. win.onCompleted();
  5875. observer.onCompleted();
  5876. }));
  5877. isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));
  5878. d.add(windowBoundaries.subscribe(function(w) {
  5879. win.onCompleted();
  5880. win = new Subject();
  5881. observer.onNext(addRef(win, r));
  5882. }, function(err) {
  5883. win.onError(err);
  5884. observer.onError(err);
  5885. }, function() {
  5886. win.onCompleted();
  5887. observer.onCompleted();
  5888. }));
  5889. return r;
  5890. }, source);
  5891. }
  5892. function observableWindowWithClosingSelector(windowClosingSelector) {
  5893. var source = this;
  5894. return new AnonymousObservable(function(observer) {
  5895. var m = new SerialDisposable(),
  5896. d = new CompositeDisposable(m),
  5897. r = new RefCountDisposable(d),
  5898. win = new Subject();
  5899. observer.onNext(addRef(win, r));
  5900. d.add(source.subscribe(function(x) {
  5901. win.onNext(x);
  5902. }, function(err) {
  5903. win.onError(err);
  5904. observer.onError(err);
  5905. }, function() {
  5906. win.onCompleted();
  5907. observer.onCompleted();
  5908. }));
  5909. function createWindowClose() {
  5910. var windowClose;
  5911. try {
  5912. windowClose = windowClosingSelector();
  5913. } catch (e) {
  5914. observer.onError(e);
  5915. return ;
  5916. }
  5917. isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));
  5918. var m1 = new SingleAssignmentDisposable();
  5919. m.setDisposable(m1);
  5920. m1.setDisposable(windowClose.take(1).subscribe(noop, function(err) {
  5921. win.onError(err);
  5922. observer.onError(err);
  5923. }, function() {
  5924. win.onCompleted();
  5925. win = new Subject();
  5926. observer.onNext(addRef(win, r));
  5927. createWindowClose();
  5928. }));
  5929. }
  5930. createWindowClose();
  5931. return r;
  5932. }, source);
  5933. }
  5934. observableProto.pairwise = function() {
  5935. var source = this;
  5936. return new AnonymousObservable(function(observer) {
  5937. var previous,
  5938. hasPrevious = false;
  5939. return source.subscribe(function(x) {
  5940. if (hasPrevious) {
  5941. observer.onNext([previous, x]);
  5942. } else {
  5943. hasPrevious = true;
  5944. }
  5945. previous = x;
  5946. }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
  5947. }, source);
  5948. };
  5949. observableProto.partition = function(predicate, thisArg) {
  5950. return [this.filter(predicate, thisArg), this.filter(function(x, i, o) {
  5951. return !predicate.call(thisArg, x, i, o);
  5952. })];
  5953. };
  5954. function enumerableWhile(condition, source) {
  5955. return new Enumerable(function() {
  5956. return new Enumerator(function() {
  5957. return condition() ? {
  5958. done: false,
  5959. value: source
  5960. } : {
  5961. done: true,
  5962. value: undefined
  5963. };
  5964. });
  5965. });
  5966. }
  5967. observableProto.letBind = observableProto['let'] = function(func) {
  5968. return func(this);
  5969. };
  5970. Observable['if'] = Observable.ifThen = function(condition, thenSource, elseSourceOrScheduler) {
  5971. return observableDefer(function() {
  5972. elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());
  5973. isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));
  5974. isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));
  5975. typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));
  5976. return condition() ? thenSource : elseSourceOrScheduler;
  5977. });
  5978. };
  5979. Observable['for'] = Observable.forIn = function(sources, resultSelector, thisArg) {
  5980. return enumerableOf(sources, resultSelector, thisArg).concat();
  5981. };
  5982. var observableWhileDo = Observable['while'] = Observable.whileDo = function(condition, source) {
  5983. isPromise(source) && (source = observableFromPromise(source));
  5984. return enumerableWhile(condition, source).concat();
  5985. };
  5986. observableProto.doWhile = function(condition) {
  5987. return observableConcat([this, observableWhileDo(condition, this)]);
  5988. };
  5989. Observable['case'] = Observable.switchCase = function(selector, sources, defaultSourceOrScheduler) {
  5990. return observableDefer(function() {
  5991. isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));
  5992. defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());
  5993. typeof defaultSourceOrScheduler.now === 'function' && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));
  5994. var result = sources[selector()];
  5995. isPromise(result) && (result = observableFromPromise(result));
  5996. return result || defaultSourceOrScheduler;
  5997. });
  5998. };
  5999. observableProto.expand = function(selector, scheduler) {
  6000. isScheduler(scheduler) || (scheduler = immediateScheduler);
  6001. var source = this;
  6002. return new AnonymousObservable(function(observer) {
  6003. var q = [],
  6004. m = new SerialDisposable(),
  6005. d = new CompositeDisposable(m),
  6006. activeCount = 0,
  6007. isAcquired = false;
  6008. var ensureActive = function() {
  6009. var isOwner = false;
  6010. if (q.length > 0) {
  6011. isOwner = !isAcquired;
  6012. isAcquired = true;
  6013. }
  6014. if (isOwner) {
  6015. m.setDisposable(scheduler.scheduleRecursive(function(self) {
  6016. var work;
  6017. if (q.length > 0) {
  6018. work = q.shift();
  6019. } else {
  6020. isAcquired = false;
  6021. return ;
  6022. }
  6023. var m1 = new SingleAssignmentDisposable();
  6024. d.add(m1);
  6025. m1.setDisposable(work.subscribe(function(x) {
  6026. observer.onNext(x);
  6027. var result = null;
  6028. try {
  6029. result = selector(x);
  6030. } catch (e) {
  6031. observer.onError(e);
  6032. }
  6033. q.push(result);
  6034. activeCount++;
  6035. ensureActive();
  6036. }, observer.onError.bind(observer), function() {
  6037. d.remove(m1);
  6038. activeCount--;
  6039. if (activeCount === 0) {
  6040. observer.onCompleted();
  6041. }
  6042. }));
  6043. self();
  6044. }));
  6045. }
  6046. };
  6047. q.push(source);
  6048. activeCount++;
  6049. ensureActive();
  6050. return d;
  6051. }, this);
  6052. };
  6053. Observable.forkJoin = function() {
  6054. var allSources = [];
  6055. if (Array.isArray(arguments[0])) {
  6056. allSources = arguments[0];
  6057. } else {
  6058. for (var i = 0,
  6059. len = arguments.length; i < len; i++) {
  6060. allSources.push(arguments[i]);
  6061. }
  6062. }
  6063. return new AnonymousObservable(function(subscriber) {
  6064. var count = allSources.length;
  6065. if (count === 0) {
  6066. subscriber.onCompleted();
  6067. return disposableEmpty;
  6068. }
  6069. var group = new CompositeDisposable(),
  6070. finished = false,
  6071. hasResults = new Array(count),
  6072. hasCompleted = new Array(count),
  6073. results = new Array(count);
  6074. for (var idx = 0; idx < count; idx++) {
  6075. (function(i) {
  6076. var source = allSources[i];
  6077. isPromise(source) && (source = observableFromPromise(source));
  6078. group.add(source.subscribe(function(value) {
  6079. if (!finished) {
  6080. hasResults[i] = true;
  6081. results[i] = value;
  6082. }
  6083. }, function(e) {
  6084. finished = true;
  6085. subscriber.onError(e);
  6086. group.dispose();
  6087. }, function() {
  6088. if (!finished) {
  6089. if (!hasResults[i]) {
  6090. subscriber.onCompleted();
  6091. return ;
  6092. }
  6093. hasCompleted[i] = true;
  6094. for (var ix = 0; ix < count; ix++) {
  6095. if (!hasCompleted[ix]) {
  6096. return ;
  6097. }
  6098. }
  6099. finished = true;
  6100. subscriber.onNext(results);
  6101. subscriber.onCompleted();
  6102. }
  6103. }));
  6104. })(idx);
  6105. }
  6106. return group;
  6107. });
  6108. };
  6109. observableProto.forkJoin = function(second, resultSelector) {
  6110. var first = this;
  6111. return new AnonymousObservable(function(observer) {
  6112. var leftStopped = false,
  6113. rightStopped = false,
  6114. hasLeft = false,
  6115. hasRight = false,
  6116. lastLeft,
  6117. lastRight,
  6118. leftSubscription = new SingleAssignmentDisposable(),
  6119. rightSubscription = new SingleAssignmentDisposable();
  6120. isPromise(second) && (second = observableFromPromise(second));
  6121. leftSubscription.setDisposable(first.subscribe(function(left) {
  6122. hasLeft = true;
  6123. lastLeft = left;
  6124. }, function(err) {
  6125. rightSubscription.dispose();
  6126. observer.onError(err);
  6127. }, function() {
  6128. leftStopped = true;
  6129. if (rightStopped) {
  6130. if (!hasLeft) {
  6131. observer.onCompleted();
  6132. } else if (!hasRight) {
  6133. observer.onCompleted();
  6134. } else {
  6135. var result;
  6136. try {
  6137. result = resultSelector(lastLeft, lastRight);
  6138. } catch (e) {
  6139. observer.onError(e);
  6140. return ;
  6141. }
  6142. observer.onNext(result);
  6143. observer.onCompleted();
  6144. }
  6145. }
  6146. }));
  6147. rightSubscription.setDisposable(second.subscribe(function(right) {
  6148. hasRight = true;
  6149. lastRight = right;
  6150. }, function(err) {
  6151. leftSubscription.dispose();
  6152. observer.onError(err);
  6153. }, function() {
  6154. rightStopped = true;
  6155. if (leftStopped) {
  6156. if (!hasLeft) {
  6157. observer.onCompleted();
  6158. } else if (!hasRight) {
  6159. observer.onCompleted();
  6160. } else {
  6161. var result;
  6162. try {
  6163. result = resultSelector(lastLeft, lastRight);
  6164. } catch (e) {
  6165. observer.onError(e);
  6166. return ;
  6167. }
  6168. observer.onNext(result);
  6169. observer.onCompleted();
  6170. }
  6171. }
  6172. }));
  6173. return new CompositeDisposable(leftSubscription, rightSubscription);
  6174. }, first);
  6175. };
  6176. observableProto.manySelect = function(selector, scheduler) {
  6177. isScheduler(scheduler) || (scheduler = immediateScheduler);
  6178. var source = this;
  6179. return observableDefer(function() {
  6180. var chain;
  6181. return source.map(function(x) {
  6182. var curr = new ChainObservable(x);
  6183. chain && chain.onNext(x);
  6184. chain = curr;
  6185. return curr;
  6186. }).tap(noop, function(e) {
  6187. chain && chain.onError(e);
  6188. }, function() {
  6189. chain && chain.onCompleted();
  6190. }).observeOn(scheduler).map(selector);
  6191. }, source);
  6192. };
  6193. var ChainObservable = (function(__super__) {
  6194. function subscribe(observer) {
  6195. var self = this,
  6196. g = new CompositeDisposable();
  6197. g.add(currentThreadScheduler.schedule(function() {
  6198. observer.onNext(self.head);
  6199. g.add(self.tail.mergeAll().subscribe(observer));
  6200. }));
  6201. return g;
  6202. }
  6203. inherits(ChainObservable, __super__);
  6204. function ChainObservable(head) {
  6205. __super__.call(this, subscribe);
  6206. this.head = head;
  6207. this.tail = new AsyncSubject();
  6208. }
  6209. addProperties(ChainObservable.prototype, Observer, {
  6210. onCompleted: function() {
  6211. this.onNext(Observable.empty());
  6212. },
  6213. onError: function(e) {
  6214. this.onNext(Observable.throwError(e));
  6215. },
  6216. onNext: function(v) {
  6217. this.tail.onNext(v);
  6218. this.tail.onCompleted();
  6219. }
  6220. });
  6221. return ChainObservable;
  6222. }(Observable));
  6223. var Map = root.Map || (function() {
  6224. function Map() {
  6225. this._keys = [];
  6226. this._values = [];
  6227. }
  6228. Map.prototype.get = function(key) {
  6229. var i = this._keys.indexOf(key);
  6230. return i !== -1 ? this._values[i] : undefined;
  6231. };
  6232. Map.prototype.set = function(key, value) {
  6233. var i = this._keys.indexOf(key);
  6234. i !== -1 && (this._values[i] = value);
  6235. this._values[this._keys.push(key) - 1] = value;
  6236. };
  6237. Map.prototype.forEach = function(callback, thisArg) {
  6238. for (var i = 0,
  6239. len = this._keys.length; i < len; i++) {
  6240. callback.call(thisArg, this._values[i], this._keys[i]);
  6241. }
  6242. };
  6243. return Map;
  6244. }());
  6245. function Pattern(patterns) {
  6246. this.patterns = patterns;
  6247. }
  6248. Pattern.prototype.and = function(other) {
  6249. return new Pattern(this.patterns.concat(other));
  6250. };
  6251. Pattern.prototype.thenDo = function(selector) {
  6252. return new Plan(this, selector);
  6253. };
  6254. function Plan(expression, selector) {
  6255. this.expression = expression;
  6256. this.selector = selector;
  6257. }
  6258. Plan.prototype.activate = function(externalSubscriptions, observer, deactivate) {
  6259. var self = this;
  6260. var joinObservers = [];
  6261. for (var i = 0,
  6262. len = this.expression.patterns.length; i < len; i++) {
  6263. joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], observer.onError.bind(observer)));
  6264. }
  6265. var activePlan = new ActivePlan(joinObservers, function() {
  6266. var result;
  6267. try {
  6268. result = self.selector.apply(self, arguments);
  6269. } catch (e) {
  6270. observer.onError(e);
  6271. return ;
  6272. }
  6273. observer.onNext(result);
  6274. }, function() {
  6275. for (var j = 0,
  6276. jlen = joinObservers.length; j < jlen; j++) {
  6277. joinObservers[j].removeActivePlan(activePlan);
  6278. }
  6279. deactivate(activePlan);
  6280. });
  6281. for (i = 0, len = joinObservers.length; i < len; i++) {
  6282. joinObservers[i].addActivePlan(activePlan);
  6283. }
  6284. return activePlan;
  6285. };
  6286. function planCreateObserver(externalSubscriptions, observable, onError) {
  6287. var entry = externalSubscriptions.get(observable);
  6288. if (!entry) {
  6289. var observer = new JoinObserver(observable, onError);
  6290. externalSubscriptions.set(observable, observer);
  6291. return observer;
  6292. }
  6293. return entry;
  6294. }
  6295. function ActivePlan(joinObserverArray, onNext, onCompleted) {
  6296. this.joinObserverArray = joinObserverArray;
  6297. this.onNext = onNext;
  6298. this.onCompleted = onCompleted;
  6299. this.joinObservers = new Map();
  6300. for (var i = 0,
  6301. len = this.joinObserverArray.length; i < len; i++) {
  6302. var joinObserver = this.joinObserverArray[i];
  6303. this.joinObservers.set(joinObserver, joinObserver);
  6304. }
  6305. }
  6306. ActivePlan.prototype.dequeue = function() {
  6307. this.joinObservers.forEach(function(v) {
  6308. v.queue.shift();
  6309. });
  6310. };
  6311. ActivePlan.prototype.match = function() {
  6312. var i,
  6313. len,
  6314. hasValues = true;
  6315. for (i = 0, len = this.joinObserverArray.length; i < len; i++) {
  6316. if (this.joinObserverArray[i].queue.length === 0) {
  6317. hasValues = false;
  6318. break;
  6319. }
  6320. }
  6321. if (hasValues) {
  6322. var firstValues = [],
  6323. isCompleted = false;
  6324. for (i = 0, len = this.joinObserverArray.length; i < len; i++) {
  6325. firstValues.push(this.joinObserverArray[i].queue[0]);
  6326. this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);
  6327. }
  6328. if (isCompleted) {
  6329. this.onCompleted();
  6330. } else {
  6331. this.dequeue();
  6332. var values = [];
  6333. for (i = 0, len = firstValues.length; i < firstValues.length; i++) {
  6334. values.push(firstValues[i].value);
  6335. }
  6336. this.onNext.apply(this, values);
  6337. }
  6338. }
  6339. };
  6340. var JoinObserver = (function(__super__) {
  6341. inherits(JoinObserver, __super__);
  6342. function JoinObserver(source, onError) {
  6343. __super__.call(this);
  6344. this.source = source;
  6345. this.onError = onError;
  6346. this.queue = [];
  6347. this.activePlans = [];
  6348. this.subscription = new SingleAssignmentDisposable();
  6349. this.isDisposed = false;
  6350. }
  6351. var JoinObserverPrototype = JoinObserver.prototype;
  6352. JoinObserverPrototype.next = function(notification) {
  6353. if (!this.isDisposed) {
  6354. if (notification.kind === 'E') {
  6355. return this.onError(notification.exception);
  6356. }
  6357. this.queue.push(notification);
  6358. var activePlans = this.activePlans.slice(0);
  6359. for (var i = 0,
  6360. len = activePlans.length; i < len; i++) {
  6361. activePlans[i].match();
  6362. }
  6363. }
  6364. };
  6365. JoinObserverPrototype.error = noop;
  6366. JoinObserverPrototype.completed = noop;
  6367. JoinObserverPrototype.addActivePlan = function(activePlan) {
  6368. this.activePlans.push(activePlan);
  6369. };
  6370. JoinObserverPrototype.subscribe = function() {
  6371. this.subscription.setDisposable(this.source.materialize().subscribe(this));
  6372. };
  6373. JoinObserverPrototype.removeActivePlan = function(activePlan) {
  6374. this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);
  6375. this.activePlans.length === 0 && this.dispose();
  6376. };
  6377. JoinObserverPrototype.dispose = function() {
  6378. __super__.prototype.dispose.call(this);
  6379. if (!this.isDisposed) {
  6380. this.isDisposed = true;
  6381. this.subscription.dispose();
  6382. }
  6383. };
  6384. return JoinObserver;
  6385. }(AbstractObserver));
  6386. observableProto.and = function(right) {
  6387. return new Pattern([this, right]);
  6388. };
  6389. observableProto.thenDo = function(selector) {
  6390. return new Pattern([this]).thenDo(selector);
  6391. };
  6392. Observable.when = function() {
  6393. var len = arguments.length,
  6394. plans;
  6395. if (Array.isArray(arguments[0])) {
  6396. plans = arguments[0];
  6397. } else {
  6398. plans = new Array(len);
  6399. for (var i = 0; i < len; i++) {
  6400. plans[i] = arguments[i];
  6401. }
  6402. }
  6403. return new AnonymousObservable(function(o) {
  6404. var activePlans = [],
  6405. externalSubscriptions = new Map();
  6406. var outObserver = observerCreate(function(x) {
  6407. o.onNext(x);
  6408. }, function(err) {
  6409. externalSubscriptions.forEach(function(v) {
  6410. v.onError(err);
  6411. });
  6412. o.onError(err);
  6413. }, function(x) {
  6414. o.onCompleted();
  6415. });
  6416. try {
  6417. for (var i = 0,
  6418. len = plans.length; i < len; i++) {
  6419. activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function(activePlan) {
  6420. var idx = activePlans.indexOf(activePlan);
  6421. activePlans.splice(idx, 1);
  6422. activePlans.length === 0 && o.onCompleted();
  6423. }));
  6424. }
  6425. } catch (e) {
  6426. observableThrow(e).subscribe(o);
  6427. }
  6428. var group = new CompositeDisposable();
  6429. externalSubscriptions.forEach(function(joinObserver) {
  6430. joinObserver.subscribe();
  6431. group.add(joinObserver);
  6432. });
  6433. return group;
  6434. });
  6435. };
  6436. function observableTimerDate(dueTime, scheduler) {
  6437. return new AnonymousObservable(function(observer) {
  6438. return scheduler.scheduleWithAbsolute(dueTime, function() {
  6439. observer.onNext(0);
  6440. observer.onCompleted();
  6441. });
  6442. });
  6443. }
  6444. function observableTimerDateAndPeriod(dueTime, period, scheduler) {
  6445. return new AnonymousObservable(function(observer) {
  6446. var d = dueTime,
  6447. p = normalizeTime(period);
  6448. return scheduler.scheduleRecursiveWithAbsoluteAndState(0, d, function(count, self) {
  6449. if (p > 0) {
  6450. var now = scheduler.now();
  6451. d = d + p;
  6452. d <= now && (d = now + p);
  6453. }
  6454. observer.onNext(count);
  6455. self(count + 1, d);
  6456. });
  6457. });
  6458. }
  6459. function observableTimerTimeSpan(dueTime, scheduler) {
  6460. return new AnonymousObservable(function(observer) {
  6461. return scheduler.scheduleWithRelative(normalizeTime(dueTime), function() {
  6462. observer.onNext(0);
  6463. observer.onCompleted();
  6464. });
  6465. });
  6466. }
  6467. function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {
  6468. return dueTime === period ? new AnonymousObservable(function(observer) {
  6469. return scheduler.schedulePeriodicWithState(0, period, function(count) {
  6470. observer.onNext(count);
  6471. return count + 1;
  6472. });
  6473. }) : observableDefer(function() {
  6474. return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler);
  6475. });
  6476. }
  6477. var observableinterval = Observable.interval = function(period, scheduler) {
  6478. return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : timeoutScheduler);
  6479. };
  6480. var observableTimer = Observable.timer = function(dueTime, periodOrScheduler, scheduler) {
  6481. var period;
  6482. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6483. if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') {
  6484. period = periodOrScheduler;
  6485. } else if (isScheduler(periodOrScheduler)) {
  6486. scheduler = periodOrScheduler;
  6487. }
  6488. if (dueTime instanceof Date && period === undefined) {
  6489. return observableTimerDate(dueTime.getTime(), scheduler);
  6490. }
  6491. if (dueTime instanceof Date && period !== undefined) {
  6492. period = periodOrScheduler;
  6493. return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler);
  6494. }
  6495. return period === undefined ? observableTimerTimeSpan(dueTime, scheduler) : observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);
  6496. };
  6497. function observableDelayTimeSpan(source, dueTime, scheduler) {
  6498. return new AnonymousObservable(function(observer) {
  6499. var active = false,
  6500. cancelable = new SerialDisposable(),
  6501. exception = null,
  6502. q = [],
  6503. running = false,
  6504. subscription;
  6505. subscription = source.materialize().timestamp(scheduler).subscribe(function(notification) {
  6506. var d,
  6507. shouldRun;
  6508. if (notification.value.kind === 'E') {
  6509. q = [];
  6510. q.push(notification);
  6511. exception = notification.value.exception;
  6512. shouldRun = !running;
  6513. } else {
  6514. q.push({
  6515. value: notification.value,
  6516. timestamp: notification.timestamp + dueTime
  6517. });
  6518. shouldRun = !active;
  6519. active = true;
  6520. }
  6521. if (shouldRun) {
  6522. if (exception !== null) {
  6523. observer.onError(exception);
  6524. } else {
  6525. d = new SingleAssignmentDisposable();
  6526. cancelable.setDisposable(d);
  6527. d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function(self) {
  6528. var e,
  6529. recurseDueTime,
  6530. result,
  6531. shouldRecurse;
  6532. if (exception !== null) {
  6533. return ;
  6534. }
  6535. running = true;
  6536. do {
  6537. result = null;
  6538. if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {
  6539. result = q.shift().value;
  6540. }
  6541. if (result !== null) {
  6542. result.accept(observer);
  6543. }
  6544. } while (result !== null);
  6545. shouldRecurse = false;
  6546. recurseDueTime = 0;
  6547. if (q.length > 0) {
  6548. shouldRecurse = true;
  6549. recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());
  6550. } else {
  6551. active = false;
  6552. }
  6553. e = exception;
  6554. running = false;
  6555. if (e !== null) {
  6556. observer.onError(e);
  6557. } else if (shouldRecurse) {
  6558. self(recurseDueTime);
  6559. }
  6560. }));
  6561. }
  6562. }
  6563. });
  6564. return new CompositeDisposable(subscription, cancelable);
  6565. }, source);
  6566. }
  6567. function observableDelayDate(source, dueTime, scheduler) {
  6568. return observableDefer(function() {
  6569. return observableDelayTimeSpan(source, dueTime - scheduler.now(), scheduler);
  6570. });
  6571. }
  6572. observableProto.delay = function(dueTime, scheduler) {
  6573. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6574. return dueTime instanceof Date ? observableDelayDate(this, dueTime.getTime(), scheduler) : observableDelayTimeSpan(this, dueTime, scheduler);
  6575. };
  6576. observableProto.debounce = observableProto.throttleWithTimeout = function(dueTime, scheduler) {
  6577. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6578. var source = this;
  6579. return new AnonymousObservable(function(observer) {
  6580. var cancelable = new SerialDisposable(),
  6581. hasvalue = false,
  6582. value,
  6583. id = 0;
  6584. var subscription = source.subscribe(function(x) {
  6585. hasvalue = true;
  6586. value = x;
  6587. id++;
  6588. var currentId = id,
  6589. d = new SingleAssignmentDisposable();
  6590. cancelable.setDisposable(d);
  6591. d.setDisposable(scheduler.scheduleWithRelative(dueTime, function() {
  6592. hasvalue && id === currentId && observer.onNext(value);
  6593. hasvalue = false;
  6594. }));
  6595. }, function(e) {
  6596. cancelable.dispose();
  6597. observer.onError(e);
  6598. hasvalue = false;
  6599. id++;
  6600. }, function() {
  6601. cancelable.dispose();
  6602. hasvalue && observer.onNext(value);
  6603. observer.onCompleted();
  6604. hasvalue = false;
  6605. id++;
  6606. });
  6607. return new CompositeDisposable(subscription, cancelable);
  6608. }, this);
  6609. };
  6610. observableProto.throttle = function(dueTime, scheduler) {
  6611. return this.debounce(dueTime, scheduler);
  6612. };
  6613. observableProto.windowWithTime = function(timeSpan, timeShiftOrScheduler, scheduler) {
  6614. var source = this,
  6615. timeShift;
  6616. timeShiftOrScheduler == null && (timeShift = timeSpan);
  6617. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6618. if (typeof timeShiftOrScheduler === 'number') {
  6619. timeShift = timeShiftOrScheduler;
  6620. } else if (isScheduler(timeShiftOrScheduler)) {
  6621. timeShift = timeSpan;
  6622. scheduler = timeShiftOrScheduler;
  6623. }
  6624. return new AnonymousObservable(function(observer) {
  6625. var groupDisposable,
  6626. nextShift = timeShift,
  6627. nextSpan = timeSpan,
  6628. q = [],
  6629. refCountDisposable,
  6630. timerD = new SerialDisposable(),
  6631. totalTime = 0;
  6632. groupDisposable = new CompositeDisposable(timerD), refCountDisposable = new RefCountDisposable(groupDisposable);
  6633. function createTimer() {
  6634. var m = new SingleAssignmentDisposable(),
  6635. isSpan = false,
  6636. isShift = false;
  6637. timerD.setDisposable(m);
  6638. if (nextSpan === nextShift) {
  6639. isSpan = true;
  6640. isShift = true;
  6641. } else if (nextSpan < nextShift) {
  6642. isSpan = true;
  6643. } else {
  6644. isShift = true;
  6645. }
  6646. var newTotalTime = isSpan ? nextSpan : nextShift,
  6647. ts = newTotalTime - totalTime;
  6648. totalTime = newTotalTime;
  6649. if (isSpan) {
  6650. nextSpan += timeShift;
  6651. }
  6652. if (isShift) {
  6653. nextShift += timeShift;
  6654. }
  6655. m.setDisposable(scheduler.scheduleWithRelative(ts, function() {
  6656. if (isShift) {
  6657. var s = new Subject();
  6658. q.push(s);
  6659. observer.onNext(addRef(s, refCountDisposable));
  6660. }
  6661. isSpan && q.shift().onCompleted();
  6662. createTimer();
  6663. }));
  6664. }
  6665. ;
  6666. q.push(new Subject());
  6667. observer.onNext(addRef(q[0], refCountDisposable));
  6668. createTimer();
  6669. groupDisposable.add(source.subscribe(function(x) {
  6670. for (var i = 0,
  6671. len = q.length; i < len; i++) {
  6672. q[i].onNext(x);
  6673. }
  6674. }, function(e) {
  6675. for (var i = 0,
  6676. len = q.length; i < len; i++) {
  6677. q[i].onError(e);
  6678. }
  6679. observer.onError(e);
  6680. }, function() {
  6681. for (var i = 0,
  6682. len = q.length; i < len; i++) {
  6683. q[i].onCompleted();
  6684. }
  6685. observer.onCompleted();
  6686. }));
  6687. return refCountDisposable;
  6688. }, source);
  6689. };
  6690. observableProto.windowWithTimeOrCount = function(timeSpan, count, scheduler) {
  6691. var source = this;
  6692. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6693. return new AnonymousObservable(function(observer) {
  6694. var timerD = new SerialDisposable(),
  6695. groupDisposable = new CompositeDisposable(timerD),
  6696. refCountDisposable = new RefCountDisposable(groupDisposable),
  6697. n = 0,
  6698. windowId = 0,
  6699. s = new Subject();
  6700. function createTimer(id) {
  6701. var m = new SingleAssignmentDisposable();
  6702. timerD.setDisposable(m);
  6703. m.setDisposable(scheduler.scheduleWithRelative(timeSpan, function() {
  6704. if (id !== windowId) {
  6705. return ;
  6706. }
  6707. n = 0;
  6708. var newId = ++windowId;
  6709. s.onCompleted();
  6710. s = new Subject();
  6711. observer.onNext(addRef(s, refCountDisposable));
  6712. createTimer(newId);
  6713. }));
  6714. }
  6715. observer.onNext(addRef(s, refCountDisposable));
  6716. createTimer(0);
  6717. groupDisposable.add(source.subscribe(function(x) {
  6718. var newId = 0,
  6719. newWindow = false;
  6720. s.onNext(x);
  6721. if (++n === count) {
  6722. newWindow = true;
  6723. n = 0;
  6724. newId = ++windowId;
  6725. s.onCompleted();
  6726. s = new Subject();
  6727. observer.onNext(addRef(s, refCountDisposable));
  6728. }
  6729. newWindow && createTimer(newId);
  6730. }, function(e) {
  6731. s.onError(e);
  6732. observer.onError(e);
  6733. }, function() {
  6734. s.onCompleted();
  6735. observer.onCompleted();
  6736. }));
  6737. return refCountDisposable;
  6738. }, source);
  6739. };
  6740. observableProto.bufferWithTime = function(timeSpan, timeShiftOrScheduler, scheduler) {
  6741. return this.windowWithTime.apply(this, arguments).selectMany(function(x) {
  6742. return x.toArray();
  6743. });
  6744. };
  6745. observableProto.bufferWithTimeOrCount = function(timeSpan, count, scheduler) {
  6746. return this.windowWithTimeOrCount(timeSpan, count, scheduler).selectMany(function(x) {
  6747. return x.toArray();
  6748. });
  6749. };
  6750. observableProto.timeInterval = function(scheduler) {
  6751. var source = this;
  6752. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6753. return observableDefer(function() {
  6754. var last = scheduler.now();
  6755. return source.map(function(x) {
  6756. var now = scheduler.now(),
  6757. span = now - last;
  6758. last = now;
  6759. return {
  6760. value: x,
  6761. interval: span
  6762. };
  6763. });
  6764. });
  6765. };
  6766. observableProto.timestamp = function(scheduler) {
  6767. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6768. return this.map(function(x) {
  6769. return {
  6770. value: x,
  6771. timestamp: scheduler.now()
  6772. };
  6773. });
  6774. };
  6775. function sampleObservable(source, sampler) {
  6776. return new AnonymousObservable(function(observer) {
  6777. var atEnd,
  6778. value,
  6779. hasValue;
  6780. function sampleSubscribe() {
  6781. if (hasValue) {
  6782. hasValue = false;
  6783. observer.onNext(value);
  6784. }
  6785. atEnd && observer.onCompleted();
  6786. }
  6787. return new CompositeDisposable(source.subscribe(function(newValue) {
  6788. hasValue = true;
  6789. value = newValue;
  6790. }, observer.onError.bind(observer), function() {
  6791. atEnd = true;
  6792. }), sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe));
  6793. }, source);
  6794. }
  6795. observableProto.sample = observableProto.throttleLatest = function(intervalOrSampler, scheduler) {
  6796. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6797. return typeof intervalOrSampler === 'number' ? sampleObservable(this, observableinterval(intervalOrSampler, scheduler)) : sampleObservable(this, intervalOrSampler);
  6798. };
  6799. observableProto.timeout = function(dueTime, other, scheduler) {
  6800. (other == null || typeof other === 'string') && (other = observableThrow(new Error(other || 'Timeout')));
  6801. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6802. var source = this,
  6803. schedulerMethod = dueTime instanceof Date ? 'scheduleWithAbsolute' : 'scheduleWithRelative';
  6804. return new AnonymousObservable(function(observer) {
  6805. var id = 0,
  6806. original = new SingleAssignmentDisposable(),
  6807. subscription = new SerialDisposable(),
  6808. switched = false,
  6809. timer = new SerialDisposable();
  6810. subscription.setDisposable(original);
  6811. function createTimer() {
  6812. var myId = id;
  6813. timer.setDisposable(scheduler[schedulerMethod](dueTime, function() {
  6814. if (id === myId) {
  6815. isPromise(other) && (other = observableFromPromise(other));
  6816. subscription.setDisposable(other.subscribe(observer));
  6817. }
  6818. }));
  6819. }
  6820. createTimer();
  6821. original.setDisposable(source.subscribe(function(x) {
  6822. if (!switched) {
  6823. id++;
  6824. observer.onNext(x);
  6825. createTimer();
  6826. }
  6827. }, function(e) {
  6828. if (!switched) {
  6829. id++;
  6830. observer.onError(e);
  6831. }
  6832. }, function() {
  6833. if (!switched) {
  6834. id++;
  6835. observer.onCompleted();
  6836. }
  6837. }));
  6838. return new CompositeDisposable(subscription, timer);
  6839. }, source);
  6840. };
  6841. Observable.generateWithAbsoluteTime = function(initialState, condition, iterate, resultSelector, timeSelector, scheduler) {
  6842. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6843. return new AnonymousObservable(function(observer) {
  6844. var first = true,
  6845. hasResult = false,
  6846. result,
  6847. state = initialState,
  6848. time;
  6849. return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(), function(self) {
  6850. hasResult && observer.onNext(result);
  6851. try {
  6852. if (first) {
  6853. first = false;
  6854. } else {
  6855. state = iterate(state);
  6856. }
  6857. hasResult = condition(state);
  6858. if (hasResult) {
  6859. result = resultSelector(state);
  6860. time = timeSelector(state);
  6861. }
  6862. } catch (e) {
  6863. observer.onError(e);
  6864. return ;
  6865. }
  6866. if (hasResult) {
  6867. self(time);
  6868. } else {
  6869. observer.onCompleted();
  6870. }
  6871. });
  6872. });
  6873. };
  6874. Observable.generateWithRelativeTime = function(initialState, condition, iterate, resultSelector, timeSelector, scheduler) {
  6875. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  6876. return new AnonymousObservable(function(observer) {
  6877. var first = true,
  6878. hasResult = false,
  6879. result,
  6880. state = initialState,
  6881. time;
  6882. return scheduler.scheduleRecursiveWithRelative(0, function(self) {
  6883. hasResult && observer.onNext(result);
  6884. try {
  6885. if (first) {
  6886. first = false;
  6887. } else {
  6888. state = iterate(state);
  6889. }
  6890. hasResult = condition(state);
  6891. if (hasResult) {
  6892. result = resultSelector(state);
  6893. time = timeSelector(state);
  6894. }
  6895. } catch (e) {
  6896. observer.onError(e);
  6897. return ;
  6898. }
  6899. if (hasResult) {
  6900. self(time);
  6901. } else {
  6902. observer.onCompleted();
  6903. }
  6904. });
  6905. });
  6906. };
  6907. observableProto.delaySubscription = function(dueTime, scheduler) {
  6908. return this.delayWithSelector(observableTimer(dueTime, isScheduler(scheduler) ? scheduler : timeoutScheduler), observableEmpty);
  6909. };
  6910. observableProto.delayWithSelector = function(subscriptionDelay, delayDurationSelector) {
  6911. var source = this,
  6912. subDelay,
  6913. selector;
  6914. if (typeof subscriptionDelay === 'function') {
  6915. selector = subscriptionDelay;
  6916. } else {
  6917. subDelay = subscriptionDelay;
  6918. selector = delayDurationSelector;
  6919. }
  6920. return new AnonymousObservable(function(observer) {
  6921. var delays = new CompositeDisposable(),
  6922. atEnd = false,
  6923. done = function() {
  6924. if (atEnd && delays.length === 0) {
  6925. observer.onCompleted();
  6926. }
  6927. },
  6928. subscription = new SerialDisposable(),
  6929. start = function() {
  6930. subscription.setDisposable(source.subscribe(function(x) {
  6931. var delay;
  6932. try {
  6933. delay = selector(x);
  6934. } catch (error) {
  6935. observer.onError(error);
  6936. return ;
  6937. }
  6938. var d = new SingleAssignmentDisposable();
  6939. delays.add(d);
  6940. d.setDisposable(delay.subscribe(function() {
  6941. observer.onNext(x);
  6942. delays.remove(d);
  6943. done();
  6944. }, observer.onError.bind(observer), function() {
  6945. observer.onNext(x);
  6946. delays.remove(d);
  6947. done();
  6948. }));
  6949. }, observer.onError.bind(observer), function() {
  6950. atEnd = true;
  6951. subscription.dispose();
  6952. done();
  6953. }));
  6954. };
  6955. if (!subDelay) {
  6956. start();
  6957. } else {
  6958. subscription.setDisposable(subDelay.subscribe(start, observer.onError.bind(observer), start));
  6959. }
  6960. return new CompositeDisposable(subscription, delays);
  6961. }, this);
  6962. };
  6963. observableProto.timeoutWithSelector = function(firstTimeout, timeoutdurationSelector, other) {
  6964. if (arguments.length === 1) {
  6965. timeoutdurationSelector = firstTimeout;
  6966. firstTimeout = observableNever();
  6967. }
  6968. other || (other = observableThrow(new Error('Timeout')));
  6969. var source = this;
  6970. return new AnonymousObservable(function(observer) {
  6971. var subscription = new SerialDisposable(),
  6972. timer = new SerialDisposable(),
  6973. original = new SingleAssignmentDisposable();
  6974. subscription.setDisposable(original);
  6975. var id = 0,
  6976. switched = false;
  6977. function setTimer(timeout) {
  6978. var myId = id;
  6979. function timerWins() {
  6980. return id === myId;
  6981. }
  6982. var d = new SingleAssignmentDisposable();
  6983. timer.setDisposable(d);
  6984. d.setDisposable(timeout.subscribe(function() {
  6985. timerWins() && subscription.setDisposable(other.subscribe(observer));
  6986. d.dispose();
  6987. }, function(e) {
  6988. timerWins() && observer.onError(e);
  6989. }, function() {
  6990. timerWins() && subscription.setDisposable(other.subscribe(observer));
  6991. }));
  6992. }
  6993. ;
  6994. setTimer(firstTimeout);
  6995. function observerWins() {
  6996. var res = !switched;
  6997. if (res) {
  6998. id++;
  6999. }
  7000. return res;
  7001. }
  7002. original.setDisposable(source.subscribe(function(x) {
  7003. if (observerWins()) {
  7004. observer.onNext(x);
  7005. var timeout;
  7006. try {
  7007. timeout = timeoutdurationSelector(x);
  7008. } catch (e) {
  7009. observer.onError(e);
  7010. return ;
  7011. }
  7012. setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);
  7013. }
  7014. }, function(e) {
  7015. observerWins() && observer.onError(e);
  7016. }, function() {
  7017. observerWins() && observer.onCompleted();
  7018. }));
  7019. return new CompositeDisposable(subscription, timer);
  7020. }, source);
  7021. };
  7022. observableProto.debounceWithSelector = function(durationSelector) {
  7023. var source = this;
  7024. return new AnonymousObservable(function(observer) {
  7025. var value,
  7026. hasValue = false,
  7027. cancelable = new SerialDisposable(),
  7028. id = 0;
  7029. var subscription = source.subscribe(function(x) {
  7030. var throttle;
  7031. try {
  7032. throttle = durationSelector(x);
  7033. } catch (e) {
  7034. observer.onError(e);
  7035. return ;
  7036. }
  7037. isPromise(throttle) && (throttle = observableFromPromise(throttle));
  7038. hasValue = true;
  7039. value = x;
  7040. id++;
  7041. var currentid = id,
  7042. d = new SingleAssignmentDisposable();
  7043. cancelable.setDisposable(d);
  7044. d.setDisposable(throttle.subscribe(function() {
  7045. hasValue && id === currentid && observer.onNext(value);
  7046. hasValue = false;
  7047. d.dispose();
  7048. }, observer.onError.bind(observer), function() {
  7049. hasValue && id === currentid && observer.onNext(value);
  7050. hasValue = false;
  7051. d.dispose();
  7052. }));
  7053. }, function(e) {
  7054. cancelable.dispose();
  7055. observer.onError(e);
  7056. hasValue = false;
  7057. id++;
  7058. }, function() {
  7059. cancelable.dispose();
  7060. hasValue && observer.onNext(value);
  7061. observer.onCompleted();
  7062. hasValue = false;
  7063. id++;
  7064. });
  7065. return new CompositeDisposable(subscription, cancelable);
  7066. }, source);
  7067. };
  7068. observableProto.throttleWithSelector = function(durationSelector) {
  7069. return this.debounceWithSelector(durationSelector);
  7070. };
  7071. observableProto.skipLastWithTime = function(duration, scheduler) {
  7072. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  7073. var source = this;
  7074. return new AnonymousObservable(function(o) {
  7075. var q = [];
  7076. return source.subscribe(function(x) {
  7077. var now = scheduler.now();
  7078. q.push({
  7079. interval: now,
  7080. value: x
  7081. });
  7082. while (q.length > 0 && now - q[0].interval >= duration) {
  7083. o.onNext(q.shift().value);
  7084. }
  7085. }, function(e) {
  7086. o.onError(e);
  7087. }, function() {
  7088. var now = scheduler.now();
  7089. while (q.length > 0 && now - q[0].interval >= duration) {
  7090. o.onNext(q.shift().value);
  7091. }
  7092. o.onCompleted();
  7093. });
  7094. }, source);
  7095. };
  7096. observableProto.takeLastWithTime = function(duration, scheduler) {
  7097. var source = this;
  7098. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  7099. return new AnonymousObservable(function(o) {
  7100. var q = [];
  7101. return source.subscribe(function(x) {
  7102. var now = scheduler.now();
  7103. q.push({
  7104. interval: now,
  7105. value: x
  7106. });
  7107. while (q.length > 0 && now - q[0].interval >= duration) {
  7108. q.shift();
  7109. }
  7110. }, function(e) {
  7111. o.onError(e);
  7112. }, function() {
  7113. var now = scheduler.now();
  7114. while (q.length > 0) {
  7115. var next = q.shift();
  7116. if (now - next.interval <= duration) {
  7117. o.onNext(next.value);
  7118. }
  7119. }
  7120. o.onCompleted();
  7121. });
  7122. }, source);
  7123. };
  7124. observableProto.takeLastBufferWithTime = function(duration, scheduler) {
  7125. var source = this;
  7126. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  7127. return new AnonymousObservable(function(o) {
  7128. var q = [];
  7129. return source.subscribe(function(x) {
  7130. var now = scheduler.now();
  7131. q.push({
  7132. interval: now,
  7133. value: x
  7134. });
  7135. while (q.length > 0 && now - q[0].interval >= duration) {
  7136. q.shift();
  7137. }
  7138. }, function(e) {
  7139. o.onError(e);
  7140. }, function() {
  7141. var now = scheduler.now(),
  7142. res = [];
  7143. while (q.length > 0) {
  7144. var next = q.shift();
  7145. now - next.interval <= duration && res.push(next.value);
  7146. }
  7147. o.onNext(res);
  7148. o.onCompleted();
  7149. });
  7150. }, source);
  7151. };
  7152. observableProto.takeWithTime = function(duration, scheduler) {
  7153. var source = this;
  7154. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  7155. return new AnonymousObservable(function(o) {
  7156. return new CompositeDisposable(scheduler.scheduleWithRelative(duration, function() {
  7157. o.onCompleted();
  7158. }), source.subscribe(o));
  7159. }, source);
  7160. };
  7161. observableProto.skipWithTime = function(duration, scheduler) {
  7162. var source = this;
  7163. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  7164. return new AnonymousObservable(function(observer) {
  7165. var open = false;
  7166. return new CompositeDisposable(scheduler.scheduleWithRelative(duration, function() {
  7167. open = true;
  7168. }), source.subscribe(function(x) {
  7169. open && observer.onNext(x);
  7170. }, observer.onError.bind(observer), observer.onCompleted.bind(observer)));
  7171. }, source);
  7172. };
  7173. observableProto.skipUntilWithTime = function(startTime, scheduler) {
  7174. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  7175. var source = this,
  7176. schedulerMethod = startTime instanceof Date ? 'scheduleWithAbsolute' : 'scheduleWithRelative';
  7177. return new AnonymousObservable(function(o) {
  7178. var open = false;
  7179. return new CompositeDisposable(scheduler[schedulerMethod](startTime, function() {
  7180. open = true;
  7181. }), source.subscribe(function(x) {
  7182. open && o.onNext(x);
  7183. }, function(e) {
  7184. o.onError(e);
  7185. }, function() {
  7186. o.onCompleted();
  7187. }));
  7188. }, source);
  7189. };
  7190. observableProto.takeUntilWithTime = function(endTime, scheduler) {
  7191. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  7192. var source = this,
  7193. schedulerMethod = endTime instanceof Date ? 'scheduleWithAbsolute' : 'scheduleWithRelative';
  7194. return new AnonymousObservable(function(o) {
  7195. return new CompositeDisposable(scheduler[schedulerMethod](endTime, function() {
  7196. o.onCompleted();
  7197. }), source.subscribe(o));
  7198. }, source);
  7199. };
  7200. observableProto.throttleFirst = function(windowDuration, scheduler) {
  7201. isScheduler(scheduler) || (scheduler = timeoutScheduler);
  7202. var duration = +windowDuration || 0;
  7203. if (duration <= 0) {
  7204. throw new RangeError('windowDuration cannot be less or equal zero.');
  7205. }
  7206. var source = this;
  7207. return new AnonymousObservable(function(o) {
  7208. var lastOnNext = 0;
  7209. return source.subscribe(function(x) {
  7210. var now = scheduler.now();
  7211. if (lastOnNext === 0 || now - lastOnNext >= duration) {
  7212. lastOnNext = now;
  7213. o.onNext(x);
  7214. }
  7215. }, function(e) {
  7216. o.onError(e);
  7217. }, function() {
  7218. o.onCompleted();
  7219. });
  7220. }, source);
  7221. };
  7222. observableProto.transduce = function(transducer) {
  7223. var source = this;
  7224. function transformForObserver(o) {
  7225. return {
  7226. '@@transducer/init': function() {
  7227. return o;
  7228. },
  7229. '@@transducer/step': function(obs, input) {
  7230. return obs.onNext(input);
  7231. },
  7232. '@@transducer/result': function(obs) {
  7233. return obs.onCompleted();
  7234. }
  7235. };
  7236. }
  7237. return new AnonymousObservable(function(o) {
  7238. var xform = transducer(transformForObserver(o));
  7239. return source.subscribe(function(v) {
  7240. try {
  7241. xform['@@transducer/step'](o, v);
  7242. } catch (e) {
  7243. o.onError(e);
  7244. }
  7245. }, function(e) {
  7246. o.onError(e);
  7247. }, function() {
  7248. xform['@@transducer/result'](o);
  7249. });
  7250. }, source);
  7251. };
  7252. observableProto.exclusive = function() {
  7253. var sources = this;
  7254. return new AnonymousObservable(function(observer) {
  7255. var hasCurrent = false,
  7256. isStopped = false,
  7257. m = new SingleAssignmentDisposable(),
  7258. g = new CompositeDisposable();
  7259. g.add(m);
  7260. m.setDisposable(sources.subscribe(function(innerSource) {
  7261. if (!hasCurrent) {
  7262. hasCurrent = true;
  7263. isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
  7264. var innerSubscription = new SingleAssignmentDisposable();
  7265. g.add(innerSubscription);
  7266. innerSubscription.setDisposable(innerSource.subscribe(observer.onNext.bind(observer), observer.onError.bind(observer), function() {
  7267. g.remove(innerSubscription);
  7268. hasCurrent = false;
  7269. if (isStopped && g.length === 1) {
  7270. observer.onCompleted();
  7271. }
  7272. }));
  7273. }
  7274. }, observer.onError.bind(observer), function() {
  7275. isStopped = true;
  7276. if (!hasCurrent && g.length === 1) {
  7277. observer.onCompleted();
  7278. }
  7279. }));
  7280. return g;
  7281. }, this);
  7282. };
  7283. observableProto.exclusiveMap = function(selector, thisArg) {
  7284. var sources = this,
  7285. selectorFunc = bindCallback(selector, thisArg, 3);
  7286. return new AnonymousObservable(function(observer) {
  7287. var index = 0,
  7288. hasCurrent = false,
  7289. isStopped = true,
  7290. m = new SingleAssignmentDisposable(),
  7291. g = new CompositeDisposable();
  7292. g.add(m);
  7293. m.setDisposable(sources.subscribe(function(innerSource) {
  7294. if (!hasCurrent) {
  7295. hasCurrent = true;
  7296. innerSubscription = new SingleAssignmentDisposable();
  7297. g.add(innerSubscription);
  7298. isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
  7299. innerSubscription.setDisposable(innerSource.subscribe(function(x) {
  7300. var result;
  7301. try {
  7302. result = selectorFunc(x, index++, innerSource);
  7303. } catch (e) {
  7304. observer.onError(e);
  7305. return ;
  7306. }
  7307. observer.onNext(result);
  7308. }, function(e) {
  7309. observer.onError(e);
  7310. }, function() {
  7311. g.remove(innerSubscription);
  7312. hasCurrent = false;
  7313. if (isStopped && g.length === 1) {
  7314. observer.onCompleted();
  7315. }
  7316. }));
  7317. }
  7318. }, function(e) {
  7319. observer.onError(e);
  7320. }, function() {
  7321. isStopped = true;
  7322. if (g.length === 1 && !hasCurrent) {
  7323. observer.onCompleted();
  7324. }
  7325. }));
  7326. return g;
  7327. }, this);
  7328. };
  7329. Rx.VirtualTimeScheduler = (function(__super__) {
  7330. function localNow() {
  7331. return this.toDateTimeOffset(this.clock);
  7332. }
  7333. function scheduleNow(state, action) {
  7334. return this.scheduleAbsoluteWithState(state, this.clock, action);
  7335. }
  7336. function scheduleRelative(state, dueTime, action) {
  7337. return this.scheduleRelativeWithState(state, this.toRelative(dueTime), action);
  7338. }
  7339. function scheduleAbsolute(state, dueTime, action) {
  7340. return this.scheduleRelativeWithState(state, this.toRelative(dueTime - this.now()), action);
  7341. }
  7342. function invokeAction(scheduler, action) {
  7343. action();
  7344. return disposableEmpty;
  7345. }
  7346. inherits(VirtualTimeScheduler, __super__);
  7347. function VirtualTimeScheduler(initialClock, comparer) {
  7348. this.clock = initialClock;
  7349. this.comparer = comparer;
  7350. this.isEnabled = false;
  7351. this.queue = new PriorityQueue(1024);
  7352. __super__.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute);
  7353. }
  7354. var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;
  7355. VirtualTimeSchedulerPrototype.add = notImplemented;
  7356. VirtualTimeSchedulerPrototype.toDateTimeOffset = notImplemented;
  7357. VirtualTimeSchedulerPrototype.toRelative = notImplemented;
  7358. VirtualTimeSchedulerPrototype.schedulePeriodicWithState = function(state, period, action) {
  7359. var s = new SchedulePeriodicRecursive(this, state, period, action);
  7360. return s.start();
  7361. };
  7362. VirtualTimeSchedulerPrototype.scheduleRelativeWithState = function(state, dueTime, action) {
  7363. var runAt = this.add(this.clock, dueTime);
  7364. return this.scheduleAbsoluteWithState(state, runAt, action);
  7365. };
  7366. VirtualTimeSchedulerPrototype.scheduleRelative = function(dueTime, action) {
  7367. return this.scheduleRelativeWithState(action, dueTime, invokeAction);
  7368. };
  7369. VirtualTimeSchedulerPrototype.start = function() {
  7370. if (!this.isEnabled) {
  7371. this.isEnabled = true;
  7372. do {
  7373. var next = this.getNext();
  7374. if (next !== null) {
  7375. this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);
  7376. next.invoke();
  7377. } else {
  7378. this.isEnabled = false;
  7379. }
  7380. } while (this.isEnabled);
  7381. }
  7382. };
  7383. VirtualTimeSchedulerPrototype.stop = function() {
  7384. this.isEnabled = false;
  7385. };
  7386. VirtualTimeSchedulerPrototype.advanceTo = function(time) {
  7387. var dueToClock = this.comparer(this.clock, time);
  7388. if (this.comparer(this.clock, time) > 0) {
  7389. throw new ArgumentOutOfRangeError();
  7390. }
  7391. if (dueToClock === 0) {
  7392. return ;
  7393. }
  7394. if (!this.isEnabled) {
  7395. this.isEnabled = true;
  7396. do {
  7397. var next = this.getNext();
  7398. if (next !== null && this.comparer(next.dueTime, time) <= 0) {
  7399. this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);
  7400. next.invoke();
  7401. } else {
  7402. this.isEnabled = false;
  7403. }
  7404. } while (this.isEnabled);
  7405. this.clock = time;
  7406. }
  7407. };
  7408. VirtualTimeSchedulerPrototype.advanceBy = function(time) {
  7409. var dt = this.add(this.clock, time),
  7410. dueToClock = this.comparer(this.clock, dt);
  7411. if (dueToClock > 0) {
  7412. throw new ArgumentOutOfRangeError();
  7413. }
  7414. if (dueToClock === 0) {
  7415. return ;
  7416. }
  7417. this.advanceTo(dt);
  7418. };
  7419. VirtualTimeSchedulerPrototype.sleep = function(time) {
  7420. var dt = this.add(this.clock, time);
  7421. if (this.comparer(this.clock, dt) >= 0) {
  7422. throw new ArgumentOutOfRangeError();
  7423. }
  7424. this.clock = dt;
  7425. };
  7426. VirtualTimeSchedulerPrototype.getNext = function() {
  7427. while (this.queue.length > 0) {
  7428. var next = this.queue.peek();
  7429. if (next.isCancelled()) {
  7430. this.queue.dequeue();
  7431. } else {
  7432. return next;
  7433. }
  7434. }
  7435. return null;
  7436. };
  7437. VirtualTimeSchedulerPrototype.scheduleAbsolute = function(dueTime, action) {
  7438. return this.scheduleAbsoluteWithState(action, dueTime, invokeAction);
  7439. };
  7440. VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState = function(state, dueTime, action) {
  7441. var self = this;
  7442. function run(scheduler, state1) {
  7443. self.queue.remove(si);
  7444. return action(scheduler, state1);
  7445. }
  7446. var si = new ScheduledItem(this, state, run, dueTime, this.comparer);
  7447. this.queue.enqueue(si);
  7448. return si.disposable;
  7449. };
  7450. return VirtualTimeScheduler;
  7451. }(Scheduler));
  7452. Rx.HistoricalScheduler = (function(__super__) {
  7453. inherits(HistoricalScheduler, __super__);
  7454. function HistoricalScheduler(initialClock, comparer) {
  7455. var clock = initialClock == null ? 0 : initialClock;
  7456. var cmp = comparer || defaultSubComparer;
  7457. __super__.call(this, clock, cmp);
  7458. }
  7459. var HistoricalSchedulerProto = HistoricalScheduler.prototype;
  7460. HistoricalSchedulerProto.add = function(absolute, relative) {
  7461. return absolute + relative;
  7462. };
  7463. HistoricalSchedulerProto.toDateTimeOffset = function(absolute) {
  7464. return new Date(absolute).getTime();
  7465. };
  7466. HistoricalSchedulerProto.toRelative = function(timeSpan) {
  7467. return timeSpan;
  7468. };
  7469. return HistoricalScheduler;
  7470. }(Rx.VirtualTimeScheduler));
  7471. var AnonymousObservable = Rx.AnonymousObservable = (function(__super__) {
  7472. inherits(AnonymousObservable, __super__);
  7473. function fixSubscriber(subscriber) {
  7474. return subscriber && isFunction(subscriber.dispose) ? subscriber : isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;
  7475. }
  7476. function setDisposable(s, state) {
  7477. var ado = state[0],
  7478. subscribe = state[1];
  7479. var sub = tryCatch(subscribe)(ado);
  7480. if (sub === errorObj) {
  7481. if (!ado.fail(errorObj.e)) {
  7482. return thrower(errorObj.e);
  7483. }
  7484. }
  7485. ado.setDisposable(fixSubscriber(sub));
  7486. }
  7487. function AnonymousObservable(subscribe, parent) {
  7488. this.source = parent;
  7489. function s(observer) {
  7490. var ado = new AutoDetachObserver(observer),
  7491. state = [ado, subscribe];
  7492. if (currentThreadScheduler.scheduleRequired()) {
  7493. currentThreadScheduler.scheduleWithState(state, setDisposable);
  7494. } else {
  7495. setDisposable(null, state);
  7496. }
  7497. return ado;
  7498. }
  7499. __super__.call(this, s);
  7500. }
  7501. return AnonymousObservable;
  7502. }(Observable));
  7503. var AutoDetachObserver = (function(__super__) {
  7504. inherits(AutoDetachObserver, __super__);
  7505. function AutoDetachObserver(observer) {
  7506. __super__.call(this);
  7507. this.observer = observer;
  7508. this.m = new SingleAssignmentDisposable();
  7509. }
  7510. var AutoDetachObserverPrototype = AutoDetachObserver.prototype;
  7511. AutoDetachObserverPrototype.next = function(value) {
  7512. var result = tryCatch(this.observer.onNext).call(this.observer, value);
  7513. if (result === errorObj) {
  7514. this.dispose();
  7515. thrower(result.e);
  7516. }
  7517. };
  7518. AutoDetachObserverPrototype.error = function(err) {
  7519. var result = tryCatch(this.observer.onError).call(this.observer, err);
  7520. this.dispose();
  7521. result === errorObj && thrower(result.e);
  7522. };
  7523. AutoDetachObserverPrototype.completed = function() {
  7524. var result = tryCatch(this.observer.onCompleted).call(this.observer);
  7525. this.dispose();
  7526. result === errorObj && thrower(result.e);
  7527. };
  7528. AutoDetachObserverPrototype.setDisposable = function(value) {
  7529. this.m.setDisposable(value);
  7530. };
  7531. AutoDetachObserverPrototype.getDisposable = function() {
  7532. return this.m.getDisposable();
  7533. };
  7534. AutoDetachObserverPrototype.dispose = function() {
  7535. __super__.prototype.dispose.call(this);
  7536. this.m.dispose();
  7537. };
  7538. return AutoDetachObserver;
  7539. }(AbstractObserver));
  7540. var GroupedObservable = (function(__super__) {
  7541. inherits(GroupedObservable, __super__);
  7542. function subscribe(observer) {
  7543. return this.underlyingObservable.subscribe(observer);
  7544. }
  7545. function GroupedObservable(key, underlyingObservable, mergedDisposable) {
  7546. __super__.call(this, subscribe);
  7547. this.key = key;
  7548. this.underlyingObservable = !mergedDisposable ? underlyingObservable : new AnonymousObservable(function(observer) {
  7549. return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer));
  7550. });
  7551. }
  7552. return GroupedObservable;
  7553. }(Observable));
  7554. var Subject = Rx.Subject = (function(__super__) {
  7555. function subscribe(observer) {
  7556. checkDisposed(this);
  7557. if (!this.isStopped) {
  7558. this.observers.push(observer);
  7559. return new InnerSubscription(this, observer);
  7560. }
  7561. if (this.hasError) {
  7562. observer.onError(this.error);
  7563. return disposableEmpty;
  7564. }
  7565. observer.onCompleted();
  7566. return disposableEmpty;
  7567. }
  7568. inherits(Subject, __super__);
  7569. function Subject() {
  7570. __super__.call(this, subscribe);
  7571. this.isDisposed = false, this.isStopped = false, this.observers = [];
  7572. this.hasError = false;
  7573. }
  7574. addProperties(Subject.prototype, Observer.prototype, {
  7575. hasObservers: function() {
  7576. return this.observers.length > 0;
  7577. },
  7578. onCompleted: function() {
  7579. checkDisposed(this);
  7580. if (!this.isStopped) {
  7581. this.isStopped = true;
  7582. for (var i = 0,
  7583. os = cloneArray(this.observers),
  7584. len = os.length; i < len; i++) {
  7585. os[i].onCompleted();
  7586. }
  7587. this.observers.length = 0;
  7588. }
  7589. },
  7590. onError: function(error) {
  7591. checkDisposed(this);
  7592. if (!this.isStopped) {
  7593. this.isStopped = true;
  7594. this.error = error;
  7595. this.hasError = true;
  7596. for (var i = 0,
  7597. os = cloneArray(this.observers),
  7598. len = os.length; i < len; i++) {
  7599. os[i].onError(error);
  7600. }
  7601. this.observers.length = 0;
  7602. }
  7603. },
  7604. onNext: function(value) {
  7605. checkDisposed(this);
  7606. if (!this.isStopped) {
  7607. for (var i = 0,
  7608. os = cloneArray(this.observers),
  7609. len = os.length; i < len; i++) {
  7610. os[i].onNext(value);
  7611. }
  7612. }
  7613. },
  7614. dispose: function() {
  7615. this.isDisposed = true;
  7616. this.observers = null;
  7617. }
  7618. });
  7619. Subject.create = function(observer, observable) {
  7620. return new AnonymousSubject(observer, observable);
  7621. };
  7622. return Subject;
  7623. }(Observable));
  7624. var AsyncSubject = Rx.AsyncSubject = (function(__super__) {
  7625. function subscribe(observer) {
  7626. checkDisposed(this);
  7627. if (!this.isStopped) {
  7628. this.observers.push(observer);
  7629. return new InnerSubscription(this, observer);
  7630. }
  7631. if (this.hasError) {
  7632. observer.onError(this.error);
  7633. } else if (this.hasValue) {
  7634. observer.onNext(this.value);
  7635. observer.onCompleted();
  7636. } else {
  7637. observer.onCompleted();
  7638. }
  7639. return disposableEmpty;
  7640. }
  7641. inherits(AsyncSubject, __super__);
  7642. function AsyncSubject() {
  7643. __super__.call(this, subscribe);
  7644. this.isDisposed = false;
  7645. this.isStopped = false;
  7646. this.hasValue = false;
  7647. this.observers = [];
  7648. this.hasError = false;
  7649. }
  7650. addProperties(AsyncSubject.prototype, Observer, {
  7651. hasObservers: function() {
  7652. checkDisposed(this);
  7653. return this.observers.length > 0;
  7654. },
  7655. onCompleted: function() {
  7656. var i,
  7657. len;
  7658. checkDisposed(this);
  7659. if (!this.isStopped) {
  7660. this.isStopped = true;
  7661. var os = cloneArray(this.observers),
  7662. len = os.length;
  7663. if (this.hasValue) {
  7664. for (i = 0; i < len; i++) {
  7665. var o = os[i];
  7666. o.onNext(this.value);
  7667. o.onCompleted();
  7668. }
  7669. } else {
  7670. for (i = 0; i < len; i++) {
  7671. os[i].onCompleted();
  7672. }
  7673. }
  7674. this.observers.length = 0;
  7675. }
  7676. },
  7677. onError: function(error) {
  7678. checkDisposed(this);
  7679. if (!this.isStopped) {
  7680. this.isStopped = true;
  7681. this.hasError = true;
  7682. this.error = error;
  7683. for (var i = 0,
  7684. os = cloneArray(this.observers),
  7685. len = os.length; i < len; i++) {
  7686. os[i].onError(error);
  7687. }
  7688. this.observers.length = 0;
  7689. }
  7690. },
  7691. onNext: function(value) {
  7692. checkDisposed(this);
  7693. if (this.isStopped) {
  7694. return ;
  7695. }
  7696. this.value = value;
  7697. this.hasValue = true;
  7698. },
  7699. dispose: function() {
  7700. this.isDisposed = true;
  7701. this.observers = null;
  7702. this.exception = null;
  7703. this.value = null;
  7704. }
  7705. });
  7706. return AsyncSubject;
  7707. }(Observable));
  7708. var AnonymousSubject = Rx.AnonymousSubject = (function(__super__) {
  7709. inherits(AnonymousSubject, __super__);
  7710. function subscribe(observer) {
  7711. return this.observable.subscribe(observer);
  7712. }
  7713. function AnonymousSubject(observer, observable) {
  7714. this.observer = observer;
  7715. this.observable = observable;
  7716. __super__.call(this, subscribe);
  7717. }
  7718. addProperties(AnonymousSubject.prototype, Observer.prototype, {
  7719. onCompleted: function() {
  7720. this.observer.onCompleted();
  7721. },
  7722. onError: function(error) {
  7723. this.observer.onError(error);
  7724. },
  7725. onNext: function(value) {
  7726. this.observer.onNext(value);
  7727. }
  7728. });
  7729. return AnonymousSubject;
  7730. }(Observable));
  7731. Rx.Pauser = (function(__super__) {
  7732. inherits(Pauser, __super__);
  7733. function Pauser() {
  7734. __super__.call(this);
  7735. }
  7736. Pauser.prototype.pause = function() {
  7737. this.onNext(false);
  7738. };
  7739. Pauser.prototype.resume = function() {
  7740. this.onNext(true);
  7741. };
  7742. return Pauser;
  7743. }(Subject));
  7744. if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
  7745. root.Rx = Rx;
  7746. define(function() {
  7747. return Rx;
  7748. });
  7749. } else if (freeExports && freeModule) {
  7750. if (moduleExports) {
  7751. (freeModule.exports = Rx).Rx = Rx;
  7752. } else {
  7753. freeExports.Rx = Rx;
  7754. }
  7755. } else {
  7756. root.Rx = Rx;
  7757. }
  7758. var rEndingLine = captureLine();
  7759. }.call(this));
  7760. global.define = __define;
  7761. return module.exports;
  7762. });
  7763.  
  7764. System.register("angular2/src/facade/lang", [], function($__export) {
  7765. "use strict";
  7766. var __moduleName = "angular2/src/facade/lang";
  7767. var _global,
  7768. Type,
  7769. Math,
  7770. Date,
  7771. assertionsEnabled_,
  7772. int,
  7773. CONST,
  7774. ABSTRACT,
  7775. IMPLEMENTS,
  7776. StringWrapper,
  7777. StringJoiner,
  7778. NumberParseError,
  7779. NumberWrapper,
  7780. RegExp,
  7781. RegExpWrapper,
  7782. RegExpMatcherWrapper,
  7783. FunctionWrapper,
  7784. BaseException,
  7785. Json,
  7786. DateWrapper;
  7787. function isPresent(obj) {
  7788. return obj !== undefined && obj !== null;
  7789. }
  7790. function isBlank(obj) {
  7791. return obj === undefined || obj === null;
  7792. }
  7793. function isString(obj) {
  7794. return typeof obj === "string";
  7795. }
  7796. function isFunction(obj) {
  7797. return typeof obj === "function";
  7798. }
  7799. function stringify(token) {
  7800. if (typeof token === 'string') {
  7801. return token;
  7802. }
  7803. if (token === undefined || token === null) {
  7804. return '' + token;
  7805. }
  7806. if (token.name) {
  7807. return token.name;
  7808. }
  7809. return token.toString();
  7810. }
  7811. function looseIdentical(a, b) {
  7812. return a === b || typeof a === "number" && typeof b === "number" && isNaN(a) && isNaN(b);
  7813. }
  7814. function getMapKey(value) {
  7815. return value;
  7816. }
  7817. function normalizeBlank(obj) {
  7818. return isBlank(obj) ? null : obj;
  7819. }
  7820. function isJsObject(o) {
  7821. return o !== null && (typeof o === "function" || typeof o === "object");
  7822. }
  7823. function assertionsEnabled() {
  7824. return assertionsEnabled_;
  7825. }
  7826. function print(obj) {
  7827. if (obj instanceof Error) {
  7828. console.log(obj.stack);
  7829. } else {
  7830. console.log(obj);
  7831. }
  7832. }
  7833. $__export("isPresent", isPresent);
  7834. $__export("isBlank", isBlank);
  7835. $__export("isString", isString);
  7836. $__export("isFunction", isFunction);
  7837. $__export("stringify", stringify);
  7838. $__export("looseIdentical", looseIdentical);
  7839. $__export("getMapKey", getMapKey);
  7840. $__export("normalizeBlank", normalizeBlank);
  7841. $__export("isJsObject", isJsObject);
  7842. $__export("assertionsEnabled", assertionsEnabled);
  7843. $__export("print", print);
  7844. return {
  7845. setters: [],
  7846. execute: function() {
  7847. _global = typeof window === 'undefined' ? global : window;
  7848. $__export("global", _global);
  7849. Type = $__export("Type", Function);
  7850. Math = $__export("Math", _global.Math);
  7851. Date = $__export("Date", _global.Date);
  7852. assertionsEnabled_ = typeof assert !== 'undefined';
  7853. if (assertionsEnabled_) {
  7854. _global.assert = assert;
  7855. $__export("int", int = assert.define('int', function(value) {
  7856. return typeof value === 'number' && value % 1 === 0;
  7857. }));
  7858. } else {
  7859. $__export("int", int = {});
  7860. _global.assert = function() {};
  7861. }
  7862. $__export("int", int);
  7863. CONST = $__export("CONST", (function() {
  7864. var CONST = function CONST() {
  7865. ;
  7866. };
  7867. return ($traceurRuntime.createClass)(CONST, {}, {});
  7868. }()));
  7869. ABSTRACT = $__export("ABSTRACT", (function() {
  7870. var ABSTRACT = function ABSTRACT() {
  7871. ;
  7872. };
  7873. return ($traceurRuntime.createClass)(ABSTRACT, {}, {});
  7874. }()));
  7875. IMPLEMENTS = $__export("IMPLEMENTS", (function() {
  7876. var IMPLEMENTS = function IMPLEMENTS() {
  7877. ;
  7878. };
  7879. return ($traceurRuntime.createClass)(IMPLEMENTS, {}, {});
  7880. }()));
  7881. StringWrapper = $__export("StringWrapper", (function() {
  7882. var StringWrapper = function StringWrapper() {
  7883. ;
  7884. };
  7885. return ($traceurRuntime.createClass)(StringWrapper, {}, {
  7886. fromCharCode: function(code) {
  7887. return String.fromCharCode(code);
  7888. },
  7889. charCodeAt: function(s, index) {
  7890. return s.charCodeAt(index);
  7891. },
  7892. split: function(s, regExp) {
  7893. return s.split(regExp);
  7894. },
  7895. equals: function(s, s2) {
  7896. return s === s2;
  7897. },
  7898. replace: function(s, from, replace) {
  7899. return s.replace(from, replace);
  7900. },
  7901. replaceAll: function(s, from, replace) {
  7902. return s.replace(from, replace);
  7903. },
  7904. startsWith: function(s, start) {
  7905. return s.startsWith(start);
  7906. },
  7907. substring: function(s, start) {
  7908. var end = arguments[2] !== (void 0) ? arguments[2] : null;
  7909. return s.substring(start, end === null ? undefined : end);
  7910. },
  7911. replaceAllMapped: function(s, from, cb) {
  7912. return s.replace(from, function() {
  7913. for (var matches = [],
  7914. $__1 = 0; $__1 < arguments.length; $__1++)
  7915. matches[$__1] = arguments[$__1];
  7916. matches.splice(-2, 2);
  7917. return cb(matches);
  7918. });
  7919. },
  7920. contains: function(s, substr) {
  7921. return s.indexOf(substr) != -1;
  7922. }
  7923. });
  7924. }()));
  7925. Object.defineProperty(StringWrapper.fromCharCode, "parameters", {get: function() {
  7926. return [[int]];
  7927. }});
  7928. Object.defineProperty(StringWrapper.charCodeAt, "parameters", {get: function() {
  7929. return [[assert.type.string], [int]];
  7930. }});
  7931. Object.defineProperty(StringWrapper.split, "parameters", {get: function() {
  7932. return [[assert.type.string], []];
  7933. }});
  7934. Object.defineProperty(StringWrapper.equals, "parameters", {get: function() {
  7935. return [[assert.type.string], [assert.type.string]];
  7936. }});
  7937. Object.defineProperty(StringWrapper.replace, "parameters", {get: function() {
  7938. return [[assert.type.string], [assert.type.string], [assert.type.string]];
  7939. }});
  7940. Object.defineProperty(StringWrapper.replaceAll, "parameters", {get: function() {
  7941. return [[assert.type.string], [RegExp], [assert.type.string]];
  7942. }});
  7943. Object.defineProperty(StringWrapper.startsWith, "parameters", {get: function() {
  7944. return [[assert.type.string], [assert.type.string]];
  7945. }});
  7946. Object.defineProperty(StringWrapper.substring, "parameters", {get: function() {
  7947. return [[assert.type.string], [int], [int]];
  7948. }});
  7949. Object.defineProperty(StringWrapper.replaceAllMapped, "parameters", {get: function() {
  7950. return [[assert.type.string], [RegExp], [Function]];
  7951. }});
  7952. Object.defineProperty(StringWrapper.contains, "parameters", {get: function() {
  7953. return [[assert.type.string], [assert.type.string]];
  7954. }});
  7955. StringJoiner = $__export("StringJoiner", (function() {
  7956. var StringJoiner = function StringJoiner() {
  7957. this.parts = [];
  7958. };
  7959. return ($traceurRuntime.createClass)(StringJoiner, {
  7960. add: function(part) {
  7961. this.parts.push(part);
  7962. },
  7963. toString: function() {
  7964. return this.parts.join("");
  7965. }
  7966. }, {});
  7967. }()));
  7968. Object.defineProperty(StringJoiner.prototype.add, "parameters", {get: function() {
  7969. return [[assert.type.string]];
  7970. }});
  7971. NumberParseError = $__export("NumberParseError", (function($__super) {
  7972. var NumberParseError = function NumberParseError(message) {
  7973. $traceurRuntime.superConstructor(NumberParseError).call(this);
  7974. this.message = message;
  7975. };
  7976. return ($traceurRuntime.createClass)(NumberParseError, {toString: function() {
  7977. return this.message;
  7978. }}, {}, $__super);
  7979. }(Error)));
  7980. NumberWrapper = $__export("NumberWrapper", (function() {
  7981. var NumberWrapper = function NumberWrapper() {
  7982. ;
  7983. };
  7984. return ($traceurRuntime.createClass)(NumberWrapper, {}, {
  7985. toFixed: function(n, fractionDigits) {
  7986. return n.toFixed(fractionDigits);
  7987. },
  7988. equal: function(a, b) {
  7989. return a === b;
  7990. },
  7991. parseIntAutoRadix: function(text) {
  7992. var result = parseInt(text);
  7993. if (isNaN(result)) {
  7994. throw new NumberParseError("Invalid integer literal when parsing " + text);
  7995. }
  7996. return result;
  7997. },
  7998. parseInt: function(text, radix) {
  7999. if (radix == 10) {
  8000. if (/^(\-|\+)?[0-9]+$/.test(text)) {
  8001. return parseInt(text, radix);
  8002. }
  8003. } else if (radix == 16) {
  8004. if (/^(\-|\+)?[0-9ABCDEFabcdef]+$/.test(text)) {
  8005. return parseInt(text, radix);
  8006. }
  8007. } else {
  8008. var result = parseInt(text, radix);
  8009. if (!isNaN(result)) {
  8010. return result;
  8011. }
  8012. }
  8013. throw new NumberParseError("Invalid integer literal when parsing " + text + " in base " + radix);
  8014. },
  8015. parseFloat: function(text) {
  8016. return parseFloat(text);
  8017. },
  8018. get NaN() {
  8019. return NaN;
  8020. },
  8021. isNaN: function(value) {
  8022. return isNaN(value);
  8023. },
  8024. isInteger: function(value) {
  8025. return Number.isInteger(value);
  8026. }
  8027. });
  8028. }()));
  8029. Object.defineProperty(NumberWrapper.toFixed, "parameters", {get: function() {
  8030. return [[assert.type.number], [int]];
  8031. }});
  8032. Object.defineProperty(NumberWrapper.parseIntAutoRadix, "parameters", {get: function() {
  8033. return [[assert.type.string]];
  8034. }});
  8035. Object.defineProperty(NumberWrapper.parseInt, "parameters", {get: function() {
  8036. return [[assert.type.string], [int]];
  8037. }});
  8038. Object.defineProperty(NumberWrapper.parseFloat, "parameters", {get: function() {
  8039. return [[assert.type.string]];
  8040. }});
  8041. RegExp = $__export("RegExp", _global.RegExp);
  8042. RegExpWrapper = $__export("RegExpWrapper", (function() {
  8043. var RegExpWrapper = function RegExpWrapper() {
  8044. ;
  8045. };
  8046. return ($traceurRuntime.createClass)(RegExpWrapper, {}, {
  8047. create: function(regExpStr) {
  8048. var flags = arguments[1] !== (void 0) ? arguments[1] : '';
  8049. flags = flags.replace(/g/g, '');
  8050. return new _global.RegExp(regExpStr, flags + 'g');
  8051. },
  8052. firstMatch: function(regExp, input) {
  8053. regExp.lastIndex = 0;
  8054. return regExp.exec(input);
  8055. },
  8056. matcher: function(regExp, input) {
  8057. regExp.lastIndex = 0;
  8058. return {
  8059. re: regExp,
  8060. input: input
  8061. };
  8062. }
  8063. });
  8064. }()));
  8065. Object.defineProperty(RegExpWrapper.create, "parameters", {get: function() {
  8066. return [[], [assert.type.string]];
  8067. }});
  8068. RegExpMatcherWrapper = $__export("RegExpMatcherWrapper", (function() {
  8069. var RegExpMatcherWrapper = function RegExpMatcherWrapper() {
  8070. ;
  8071. };
  8072. return ($traceurRuntime.createClass)(RegExpMatcherWrapper, {}, {next: function(matcher) {
  8073. return matcher.re.exec(matcher.input);
  8074. }});
  8075. }()));
  8076. FunctionWrapper = $__export("FunctionWrapper", (function() {
  8077. var FunctionWrapper = function FunctionWrapper() {
  8078. ;
  8079. };
  8080. return ($traceurRuntime.createClass)(FunctionWrapper, {}, {apply: function(fn, posArgs) {
  8081. return fn.apply(null, posArgs);
  8082. }});
  8083. }()));
  8084. Object.defineProperty(FunctionWrapper.apply, "parameters", {get: function() {
  8085. return [[Function], []];
  8086. }});
  8087. BaseException = $__export("BaseException", Error);
  8088. Json = $__export("Json", _global.JSON);
  8089. DateWrapper = $__export("DateWrapper", (function() {
  8090. var DateWrapper = function DateWrapper() {
  8091. ;
  8092. };
  8093. return ($traceurRuntime.createClass)(DateWrapper, {}, {
  8094. fromMillis: function(ms) {
  8095. return new Date(ms);
  8096. },
  8097. toMillis: function(date) {
  8098. return date.getTime();
  8099. },
  8100. now: function() {
  8101. return new Date();
  8102. },
  8103. toJson: function(date) {
  8104. return date.toJSON();
  8105. }
  8106. });
  8107. }()));
  8108. Object.defineProperty(DateWrapper.toMillis, "parameters", {get: function() {
  8109. return [[Date]];
  8110. }});
  8111. }
  8112. };
  8113. });
  8114.  
  8115. System.register("angular2/src/facade/collection", ["angular2/src/facade/lang"], function($__export) {
  8116. "use strict";
  8117. var __moduleName = "angular2/src/facade/collection";
  8118. var int,
  8119. isJsObject,
  8120. global,
  8121. List,
  8122. Map,
  8123. Set,
  8124. StringMap,
  8125. MapWrapper,
  8126. StringMapWrapper,
  8127. ListWrapper,
  8128. SetWrapper;
  8129. function isListLikeIterable(obj) {
  8130. if (!isJsObject(obj))
  8131. return false;
  8132. return ListWrapper.isList(obj) || (!(obj instanceof Map) && Symbol.iterator in obj);
  8133. }
  8134. function iterateListLike(obj, fn) {
  8135. if (ListWrapper.isList(obj)) {
  8136. for (var i = 0; i < obj.length; i++) {
  8137. fn(obj[i]);
  8138. }
  8139. } else {
  8140. var iterator = obj[Symbol.iterator]();
  8141. var item;
  8142. while (!((item = iterator.next()).done)) {
  8143. fn(item.value);
  8144. }
  8145. }
  8146. }
  8147. $__export("isListLikeIterable", isListLikeIterable);
  8148. $__export("iterateListLike", iterateListLike);
  8149. return {
  8150. setters: [function($__m) {
  8151. int = $__m.int;
  8152. isJsObject = $__m.isJsObject;
  8153. global = $__m.global;
  8154. }],
  8155. execute: function() {
  8156. List = $__export("List", global.Array);
  8157. Map = $__export("Map", global.Map);
  8158. Set = $__export("Set", global.Set);
  8159. StringMap = $__export("StringMap", global.Object);
  8160. MapWrapper = $__export("MapWrapper", (function() {
  8161. var MapWrapper = function MapWrapper() {
  8162. ;
  8163. };
  8164. return ($traceurRuntime.createClass)(MapWrapper, {}, {
  8165. create: function() {
  8166. return new Map();
  8167. },
  8168. clone: function(m) {
  8169. return new Map(m);
  8170. },
  8171. createFromStringMap: function(stringMap) {
  8172. var result = MapWrapper.create();
  8173. for (var prop in stringMap) {
  8174. MapWrapper.set(result, prop, stringMap[prop]);
  8175. }
  8176. return result;
  8177. },
  8178. createFromPairs: function(pairs) {
  8179. return new Map(pairs);
  8180. },
  8181. get: function(m, k) {
  8182. return m.get(k);
  8183. },
  8184. set: function(m, k, v) {
  8185. m.set(k, v);
  8186. },
  8187. contains: function(m, k) {
  8188. return m.has(k);
  8189. },
  8190. forEach: function(m, fn) {
  8191. m.forEach(fn);
  8192. },
  8193. size: function(m) {
  8194. return m.size;
  8195. },
  8196. delete: function(m, k) {
  8197. m.delete(k);
  8198. },
  8199. clear: function(m) {
  8200. m.clear();
  8201. },
  8202. clearValues: function(m) {
  8203. var keyIterator = m.keys();
  8204. var k;
  8205. while (!((k = keyIterator.next()).done)) {
  8206. m.set(k.value, null);
  8207. }
  8208. },
  8209. iterable: function(m) {
  8210. return m;
  8211. },
  8212. keys: function(m) {
  8213. return m.keys();
  8214. },
  8215. values: function(m) {
  8216. return m.values();
  8217. }
  8218. });
  8219. }()));
  8220. Object.defineProperty(MapWrapper.clone, "parameters", {get: function() {
  8221. return [[Map]];
  8222. }});
  8223. Object.defineProperty(MapWrapper.createFromPairs, "parameters", {get: function() {
  8224. return [[List]];
  8225. }});
  8226. StringMapWrapper = $__export("StringMapWrapper", (function() {
  8227. var StringMapWrapper = function StringMapWrapper() {
  8228. ;
  8229. };
  8230. return ($traceurRuntime.createClass)(StringMapWrapper, {}, {
  8231. create: function() {
  8232. return {};
  8233. },
  8234. contains: function(map, key) {
  8235. return map.hasOwnProperty(key);
  8236. },
  8237. get: function(map, key) {
  8238. return map.hasOwnProperty(key) ? map[key] : undefined;
  8239. },
  8240. set: function(map, key, value) {
  8241. map[key] = value;
  8242. },
  8243. isEmpty: function(map) {
  8244. for (var prop in map) {
  8245. return false;
  8246. }
  8247. return true;
  8248. },
  8249. delete: function(map, key) {
  8250. delete map[key];
  8251. },
  8252. forEach: function(map, callback) {
  8253. for (var prop in map) {
  8254. if (map.hasOwnProperty(prop)) {
  8255. callback(map[prop], prop);
  8256. }
  8257. }
  8258. },
  8259. merge: function(m1, m2) {
  8260. var m = {};
  8261. for (var attr in m1) {
  8262. if (m1.hasOwnProperty(attr)) {
  8263. m[attr] = m1[attr];
  8264. }
  8265. }
  8266. for (var attr in m2) {
  8267. if (m2.hasOwnProperty(attr)) {
  8268. m[attr] = m2[attr];
  8269. }
  8270. }
  8271. return m;
  8272. }
  8273. });
  8274. }()));
  8275. ListWrapper = $__export("ListWrapper", (function() {
  8276. var ListWrapper = function ListWrapper() {
  8277. ;
  8278. };
  8279. return ($traceurRuntime.createClass)(ListWrapper, {}, {
  8280. create: function() {
  8281. return new List();
  8282. },
  8283. createFixedSize: function(size) {
  8284. return new List(size);
  8285. },
  8286. get: function(m, k) {
  8287. return m[k];
  8288. },
  8289. set: function(m, k, v) {
  8290. m[k] = v;
  8291. },
  8292. clone: function(array) {
  8293. return array.slice(0);
  8294. },
  8295. map: function(array, fn) {
  8296. return array.map(fn);
  8297. },
  8298. forEach: function(array, fn) {
  8299. for (var i = 0; i < array.length; i++) {
  8300. fn(array[i]);
  8301. }
  8302. },
  8303. push: function(array, el) {
  8304. array.push(el);
  8305. },
  8306. first: function(array) {
  8307. if (!array)
  8308. return null;
  8309. return array[0];
  8310. },
  8311. last: function(array) {
  8312. if (!array || array.length == 0)
  8313. return null;
  8314. return array[array.length - 1];
  8315. },
  8316. find: function(list, pred) {
  8317. for (var i = 0; i < list.length; ++i) {
  8318. if (pred(list[i]))
  8319. return list[i];
  8320. }
  8321. return null;
  8322. },
  8323. reduce: function(list, fn, init) {
  8324. return list.reduce(fn, init);
  8325. },
  8326. filter: function(array, pred) {
  8327. return array.filter(pred);
  8328. },
  8329. any: function(list, pred) {
  8330. for (var i = 0; i < list.length; ++i) {
  8331. if (pred(list[i]))
  8332. return true;
  8333. }
  8334. return false;
  8335. },
  8336. contains: function(list, el) {
  8337. return list.indexOf(el) !== -1;
  8338. },
  8339. reversed: function(array) {
  8340. var a = ListWrapper.clone(array);
  8341. return a.reverse();
  8342. },
  8343. concat: function(a, b) {
  8344. return a.concat(b);
  8345. },
  8346. isList: function(list) {
  8347. return Array.isArray(list);
  8348. },
  8349. insert: function(list, index, value) {
  8350. list.splice(index, 0, value);
  8351. },
  8352. removeAt: function(list, index) {
  8353. var res = list[index];
  8354. list.splice(index, 1);
  8355. return res;
  8356. },
  8357. removeAll: function(list, items) {
  8358. for (var i = 0; i < items.length; ++i) {
  8359. var index = list.indexOf(items[i]);
  8360. list.splice(index, 1);
  8361. }
  8362. },
  8363. removeLast: function(list) {
  8364. return list.pop();
  8365. },
  8366. remove: function(list, el) {
  8367. var index = list.indexOf(el);
  8368. if (index > -1) {
  8369. list.splice(index, 1);
  8370. return true;
  8371. }
  8372. return false;
  8373. },
  8374. clear: function(list) {
  8375. list.splice(0, list.length);
  8376. },
  8377. join: function(list, s) {
  8378. return list.join(s);
  8379. },
  8380. isEmpty: function(list) {
  8381. return list.length == 0;
  8382. },
  8383. fill: function(list, value) {
  8384. var start = arguments[2] !== (void 0) ? arguments[2] : 0;
  8385. var end = arguments[3] !== (void 0) ? arguments[3] : null;
  8386. list.fill(value, start, end === null ? undefined : end);
  8387. },
  8388. equals: function(a, b) {
  8389. if (a.length != b.length)
  8390. return false;
  8391. for (var i = 0; i < a.length; ++i) {
  8392. if (a[i] !== b[i])
  8393. return false;
  8394. }
  8395. return true;
  8396. },
  8397. slice: function(l, from, to) {
  8398. return l.slice(from, to);
  8399. },
  8400. sort: function(l, compareFn) {
  8401. l.sort(compareFn);
  8402. }
  8403. });
  8404. }()));
  8405. Object.defineProperty(ListWrapper.clone, "parameters", {get: function() {
  8406. return [[List]];
  8407. }});
  8408. Object.defineProperty(ListWrapper.forEach, "parameters", {get: function() {
  8409. return [[List], [Function]];
  8410. }});
  8411. Object.defineProperty(ListWrapper.find, "parameters", {get: function() {
  8412. return [[List], [Function]];
  8413. }});
  8414. Object.defineProperty(ListWrapper.reduce, "parameters", {get: function() {
  8415. return [[List], [Function], []];
  8416. }});
  8417. Object.defineProperty(ListWrapper.filter, "parameters", {get: function() {
  8418. return [[], [Function]];
  8419. }});
  8420. Object.defineProperty(ListWrapper.any, "parameters", {get: function() {
  8421. return [[List], [Function]];
  8422. }});
  8423. Object.defineProperty(ListWrapper.contains, "parameters", {get: function() {
  8424. return [[List], []];
  8425. }});
  8426. Object.defineProperty(ListWrapper.insert, "parameters", {get: function() {
  8427. return [[], [int], []];
  8428. }});
  8429. Object.defineProperty(ListWrapper.removeAt, "parameters", {get: function() {
  8430. return [[], [int]];
  8431. }});
  8432. Object.defineProperty(ListWrapper.removeLast, "parameters", {get: function() {
  8433. return [[List]];
  8434. }});
  8435. Object.defineProperty(ListWrapper.fill, "parameters", {get: function() {
  8436. return [[List], [], [int], [int]];
  8437. }});
  8438. Object.defineProperty(ListWrapper.equals, "parameters", {get: function() {
  8439. return [[List], [List]];
  8440. }});
  8441. Object.defineProperty(ListWrapper.slice, "parameters", {get: function() {
  8442. return [[List], [int], [int]];
  8443. }});
  8444. Object.defineProperty(ListWrapper.sort, "parameters", {get: function() {
  8445. return [[List], [Function]];
  8446. }});
  8447. Object.defineProperty(iterateListLike, "parameters", {get: function() {
  8448. return [[], [Function]];
  8449. }});
  8450. SetWrapper = $__export("SetWrapper", (function() {
  8451. var SetWrapper = function SetWrapper() {
  8452. ;
  8453. };
  8454. return ($traceurRuntime.createClass)(SetWrapper, {}, {
  8455. createFromList: function(lst) {
  8456. return new Set(lst);
  8457. },
  8458. has: function(s, key) {
  8459. return s.has(key);
  8460. }
  8461. });
  8462. }()));
  8463. Object.defineProperty(SetWrapper.createFromList, "parameters", {get: function() {
  8464. return [[List]];
  8465. }});
  8466. Object.defineProperty(SetWrapper.has, "parameters", {get: function() {
  8467. return [[Set], []];
  8468. }});
  8469. }
  8470. };
  8471. });
  8472.  
  8473. System.register("angular2/src/reflection/types", [], function($__export) {
  8474. "use strict";
  8475. var __moduleName = "angular2/src/reflection/types";
  8476. var SetterFn,
  8477. GetterFn,
  8478. MethodFn;
  8479. return {
  8480. setters: [],
  8481. execute: function() {
  8482. SetterFn = $__export("SetterFn", Function);
  8483. GetterFn = $__export("GetterFn", Function);
  8484. MethodFn = $__export("MethodFn", Function);
  8485. }
  8486. };
  8487. });
  8488.  
  8489. System.register("angular2/src/reflection/reflection_capabilities", ["angular2/src/facade/lang", "angular2/src/facade/collection", "angular2/src/reflection/types"], function($__export) {
  8490. "use strict";
  8491. var __moduleName = "angular2/src/reflection/reflection_capabilities";
  8492. var Type,
  8493. isPresent,
  8494. List,
  8495. ListWrapper,
  8496. GetterFn,
  8497. SetterFn,
  8498. MethodFn,
  8499. ReflectionCapabilities;
  8500. return {
  8501. setters: [function($__m) {
  8502. Type = $__m.Type;
  8503. isPresent = $__m.isPresent;
  8504. }, function($__m) {
  8505. List = $__m.List;
  8506. ListWrapper = $__m.ListWrapper;
  8507. }, function($__m) {
  8508. GetterFn = $__m.GetterFn;
  8509. SetterFn = $__m.SetterFn;
  8510. MethodFn = $__m.MethodFn;
  8511. }],
  8512. execute: function() {
  8513. ReflectionCapabilities = $__export("ReflectionCapabilities", (function() {
  8514. var ReflectionCapabilities = function ReflectionCapabilities() {
  8515. ;
  8516. };
  8517. return ($traceurRuntime.createClass)(ReflectionCapabilities, {
  8518. factory: function(type) {
  8519. switch (type.length) {
  8520. case 0:
  8521. return function() {
  8522. return new type();
  8523. };
  8524. case 1:
  8525. return function(a1) {
  8526. return new type(a1);
  8527. };
  8528. case 2:
  8529. return function(a1, a2) {
  8530. return new type(a1, a2);
  8531. };
  8532. case 3:
  8533. return function(a1, a2, a3) {
  8534. return new type(a1, a2, a3);
  8535. };
  8536. case 4:
  8537. return function(a1, a2, a3, a4) {
  8538. return new type(a1, a2, a3, a4);
  8539. };
  8540. case 5:
  8541. return function(a1, a2, a3, a4, a5) {
  8542. return new type(a1, a2, a3, a4, a5);
  8543. };
  8544. case 6:
  8545. return function(a1, a2, a3, a4, a5, a6) {
  8546. return new type(a1, a2, a3, a4, a5, a6);
  8547. };
  8548. case 7:
  8549. return function(a1, a2, a3, a4, a5, a6, a7) {
  8550. return new type(a1, a2, a3, a4, a5, a6, a7);
  8551. };
  8552. case 8:
  8553. return function(a1, a2, a3, a4, a5, a6, a7, a8) {
  8554. return new type(a1, a2, a3, a4, a5, a6, a7, a8);
  8555. };
  8556. case 9:
  8557. return function(a1, a2, a3, a4, a5, a6, a7, a8, a9) {
  8558. return new type(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  8559. };
  8560. case 10:
  8561. return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
  8562. return new type(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
  8563. };
  8564. }
  8565. ;
  8566. throw new Error("Factory cannot take more than 10 arguments");
  8567. },
  8568. parameters: function(typeOfFunc) {
  8569. return isPresent(typeOfFunc.parameters) ? typeOfFunc.parameters : ListWrapper.createFixedSize(typeOfFunc.length);
  8570. },
  8571. annotations: function(typeOfFunc) {
  8572. return isPresent(typeOfFunc.annotations) ? typeOfFunc.annotations : [];
  8573. },
  8574. getter: function(name) {
  8575. return new Function('o', 'return o.' + name + ';');
  8576. },
  8577. setter: function(name) {
  8578. return new Function('o', 'v', 'return o.' + name + ' = v;');
  8579. },
  8580. method: function(name) {
  8581. var method = ("o." + name);
  8582. return new Function('o', 'args', ("if (!" + method + ") throw new Error('\"" + name + "\" is undefined');") + ("return " + method + ".apply(o, args);"));
  8583. }
  8584. }, {});
  8585. }()));
  8586. Object.defineProperty(ReflectionCapabilities.prototype.factory, "parameters", {get: function() {
  8587. return [[Type]];
  8588. }});
  8589. Object.defineProperty(ReflectionCapabilities.prototype.getter, "parameters", {get: function() {
  8590. return [[assert.type.string]];
  8591. }});
  8592. Object.defineProperty(ReflectionCapabilities.prototype.setter, "parameters", {get: function() {
  8593. return [[assert.type.string]];
  8594. }});
  8595. Object.defineProperty(ReflectionCapabilities.prototype.method, "parameters", {get: function() {
  8596. return [[assert.type.string]];
  8597. }});
  8598. }
  8599. };
  8600. });
  8601.  
  8602. System.register("angular2/src/di/exceptions", ["angular2/src/facade/collection", "angular2/src/facade/lang"], function($__export) {
  8603. "use strict";
  8604. var __moduleName = "angular2/src/di/exceptions";
  8605. var ListWrapper,
  8606. List,
  8607. stringify,
  8608. KeyMetadataError,
  8609. ProviderError,
  8610. NoProviderError,
  8611. AsyncBindingError,
  8612. CyclicDependencyError,
  8613. InstantiationError,
  8614. InvalidBindingError,
  8615. NoAnnotationError;
  8616. function findFirstClosedCycle(keys) {
  8617. var res = [];
  8618. for (var i = 0; i < keys.length; ++i) {
  8619. if (ListWrapper.contains(res, keys[i])) {
  8620. ListWrapper.push(res, keys[i]);
  8621. return res;
  8622. } else {
  8623. ListWrapper.push(res, keys[i]);
  8624. }
  8625. }
  8626. return res;
  8627. }
  8628. function constructResolvingPath(keys) {
  8629. if (keys.length > 1) {
  8630. var reversed = findFirstClosedCycle(ListWrapper.reversed(keys));
  8631. var tokenStrs = ListWrapper.map(reversed, (function(k) {
  8632. return stringify(k.token);
  8633. }));
  8634. return " (" + tokenStrs.join(' -> ') + ")";
  8635. } else {
  8636. return "";
  8637. }
  8638. }
  8639. return {
  8640. setters: [function($__m) {
  8641. ListWrapper = $__m.ListWrapper;
  8642. List = $__m.List;
  8643. }, function($__m) {
  8644. stringify = $__m.stringify;
  8645. }],
  8646. execute: function() {
  8647. Object.defineProperty(findFirstClosedCycle, "parameters", {get: function() {
  8648. return [[List]];
  8649. }});
  8650. Object.defineProperty(constructResolvingPath, "parameters", {get: function() {
  8651. return [[List]];
  8652. }});
  8653. KeyMetadataError = $__export("KeyMetadataError", (function($__super) {
  8654. var KeyMetadataError = function KeyMetadataError() {
  8655. $traceurRuntime.superConstructor(KeyMetadataError).apply(this, arguments);
  8656. ;
  8657. };
  8658. return ($traceurRuntime.createClass)(KeyMetadataError, {}, {}, $__super);
  8659. }(Error)));
  8660. ProviderError = $__export("ProviderError", (function($__super) {
  8661. var ProviderError = function ProviderError(key, constructResolvingMessage) {
  8662. $traceurRuntime.superConstructor(ProviderError).call(this);
  8663. this.keys = [key];
  8664. this.constructResolvingMessage = constructResolvingMessage;
  8665. this.message = this.constructResolvingMessage(this.keys);
  8666. };
  8667. return ($traceurRuntime.createClass)(ProviderError, {
  8668. addKey: function(key) {
  8669. ListWrapper.push(this.keys, key);
  8670. this.message = this.constructResolvingMessage(this.keys);
  8671. },
  8672. toString: function() {
  8673. return this.message;
  8674. }
  8675. }, {}, $__super);
  8676. }(Error)));
  8677. Object.defineProperty(ProviderError, "parameters", {get: function() {
  8678. return [[], [Function]];
  8679. }});
  8680. NoProviderError = $__export("NoProviderError", (function($__super) {
  8681. var NoProviderError = function NoProviderError(key) {
  8682. $traceurRuntime.superConstructor(NoProviderError).call(this, key, function(keys) {
  8683. var first = stringify(ListWrapper.first(keys).token);
  8684. return ("No provider for " + first + "!" + constructResolvingPath(keys));
  8685. });
  8686. };
  8687. return ($traceurRuntime.createClass)(NoProviderError, {}, {}, $__super);
  8688. }(ProviderError)));
  8689. AsyncBindingError = $__export("AsyncBindingError", (function($__super) {
  8690. var AsyncBindingError = function AsyncBindingError(key) {
  8691. $traceurRuntime.superConstructor(AsyncBindingError).call(this, key, function(keys) {
  8692. var first = stringify(ListWrapper.first(keys).token);
  8693. return ("Cannot instantiate " + first + " synchronously. ") + ("It is provided as a promise!" + constructResolvingPath(keys));
  8694. });
  8695. };
  8696. return ($traceurRuntime.createClass)(AsyncBindingError, {}, {}, $__super);
  8697. }(ProviderError)));
  8698. CyclicDependencyError = $__export("CyclicDependencyError", (function($__super) {
  8699. var CyclicDependencyError = function CyclicDependencyError(key) {
  8700. $traceurRuntime.superConstructor(CyclicDependencyError).call(this, key, function(keys) {
  8701. return ("Cannot instantiate cyclic dependency!" + constructResolvingPath(keys));
  8702. });
  8703. };
  8704. return ($traceurRuntime.createClass)(CyclicDependencyError, {}, {}, $__super);
  8705. }(ProviderError)));
  8706. InstantiationError = $__export("InstantiationError", (function($__super) {
  8707. var InstantiationError = function InstantiationError(originalException, key) {
  8708. $traceurRuntime.superConstructor(InstantiationError).call(this, key, function(keys) {
  8709. var first = stringify(ListWrapper.first(keys).token);
  8710. return ("Error during instantiation of " + first + "!" + constructResolvingPath(keys) + ".") + (" ORIGINAL ERROR: " + originalException);
  8711. });
  8712. };
  8713. return ($traceurRuntime.createClass)(InstantiationError, {}, {}, $__super);
  8714. }(ProviderError)));
  8715. InvalidBindingError = $__export("InvalidBindingError", (function($__super) {
  8716. var InvalidBindingError = function InvalidBindingError(binding) {
  8717. $traceurRuntime.superConstructor(InvalidBindingError).call(this);
  8718. this.message = ("Invalid binding " + binding);
  8719. };
  8720. return ($traceurRuntime.createClass)(InvalidBindingError, {toString: function() {
  8721. return this.message;
  8722. }}, {}, $__super);
  8723. }(Error)));
  8724. NoAnnotationError = $__export("NoAnnotationError", (function($__super) {
  8725. var NoAnnotationError = function NoAnnotationError(typeOrFunc) {
  8726. $traceurRuntime.superConstructor(NoAnnotationError).call(this);
  8727. this.message = ("Cannot resolve all parameters for " + stringify(typeOrFunc));
  8728. };
  8729. return ($traceurRuntime.createClass)(NoAnnotationError, {toString: function() {
  8730. return this.message;
  8731. }}, {}, $__super);
  8732. }(Error)));
  8733. }
  8734. };
  8735. });
  8736.  
  8737. System.register("angular2/src/di/opaque_token", [], function($__export) {
  8738. "use strict";
  8739. var __moduleName = "angular2/src/di/opaque_token";
  8740. var OpaqueToken;
  8741. return {
  8742. setters: [],
  8743. execute: function() {
  8744. OpaqueToken = $__export("OpaqueToken", (function() {
  8745. var OpaqueToken = function OpaqueToken(desc) {
  8746. this._desc = ("Token(" + desc + ")");
  8747. };
  8748. return ($traceurRuntime.createClass)(OpaqueToken, {toString: function() {
  8749. return this._desc;
  8750. }}, {});
  8751. }()));
  8752. Object.defineProperty(OpaqueToken, "parameters", {get: function() {
  8753. return [[assert.type.string]];
  8754. }});
  8755. }
  8756. };
  8757. });
  8758.  
  8759. System.register("angular2/src/di/annotations", ["angular2/src/facade/lang"], function($__export) {
  8760. "use strict";
  8761. var __moduleName = "angular2/src/di/annotations";
  8762. var CONST,
  8763. Inject,
  8764. InjectPromise,
  8765. InjectLazy,
  8766. Optional,
  8767. DependencyAnnotation,
  8768. Injectable;
  8769. return {
  8770. setters: [function($__m) {
  8771. CONST = $__m.CONST;
  8772. }],
  8773. execute: function() {
  8774. Inject = $__export("Inject", (function() {
  8775. var Inject = function Inject(token) {
  8776. this.token = token;
  8777. };
  8778. return ($traceurRuntime.createClass)(Inject, {}, {});
  8779. }()));
  8780. Object.defineProperty(Inject, "annotations", {get: function() {
  8781. return [new CONST()];
  8782. }});
  8783. InjectPromise = $__export("InjectPromise", (function() {
  8784. var InjectPromise = function InjectPromise(token) {
  8785. this.token = token;
  8786. };
  8787. return ($traceurRuntime.createClass)(InjectPromise, {}, {});
  8788. }()));
  8789. Object.defineProperty(InjectPromise, "annotations", {get: function() {
  8790. return [new CONST()];
  8791. }});
  8792. InjectLazy = $__export("InjectLazy", (function() {
  8793. var InjectLazy = function InjectLazy(token) {
  8794. this.token = token;
  8795. };
  8796. return ($traceurRuntime.createClass)(InjectLazy, {}, {});
  8797. }()));
  8798. Object.defineProperty(InjectLazy, "annotations", {get: function() {
  8799. return [new CONST()];
  8800. }});
  8801. Optional = $__export("Optional", (function() {
  8802. var Optional = function Optional() {};
  8803. return ($traceurRuntime.createClass)(Optional, {}, {});
  8804. }()));
  8805. Object.defineProperty(Optional, "annotations", {get: function() {
  8806. return [new CONST()];
  8807. }});
  8808. DependencyAnnotation = $__export("DependencyAnnotation", (function() {
  8809. var DependencyAnnotation = function DependencyAnnotation() {};
  8810. return ($traceurRuntime.createClass)(DependencyAnnotation, {get token() {
  8811. return null;
  8812. }}, {});
  8813. }()));
  8814. Object.defineProperty(DependencyAnnotation, "annotations", {get: function() {
  8815. return [new CONST()];
  8816. }});
  8817. Injectable = $__export("Injectable", (function() {
  8818. var Injectable = function Injectable() {};
  8819. return ($traceurRuntime.createClass)(Injectable, {}, {});
  8820. }()));
  8821. Object.defineProperty(Injectable, "annotations", {get: function() {
  8822. return [new CONST()];
  8823. }});
  8824. }
  8825. };
  8826. });
  8827.  
  8828. System.register("angular2/src/reflection/reflector", ["angular2/src/facade/lang", "angular2/src/facade/collection", "angular2/src/reflection/types"], function($__export) {
  8829. "use strict";
  8830. var __moduleName = "angular2/src/reflection/reflector";
  8831. var Type,
  8832. isPresent,
  8833. stringify,
  8834. BaseException,
  8835. List,
  8836. ListWrapper,
  8837. Map,
  8838. MapWrapper,
  8839. StringMapWrapper,
  8840. SetterFn,
  8841. GetterFn,
  8842. MethodFn,
  8843. Reflector;
  8844. function _mergeMaps(target, config) {
  8845. StringMapWrapper.forEach(config, (function(v, k) {
  8846. return MapWrapper.set(target, k, v);
  8847. }));
  8848. }
  8849. return {
  8850. setters: [function($__m) {
  8851. Type = $__m.Type;
  8852. isPresent = $__m.isPresent;
  8853. stringify = $__m.stringify;
  8854. BaseException = $__m.BaseException;
  8855. }, function($__m) {
  8856. List = $__m.List;
  8857. ListWrapper = $__m.ListWrapper;
  8858. Map = $__m.Map;
  8859. MapWrapper = $__m.MapWrapper;
  8860. StringMapWrapper = $__m.StringMapWrapper;
  8861. }, function($__m) {
  8862. SetterFn = $__m.SetterFn;
  8863. GetterFn = $__m.GetterFn;
  8864. MethodFn = $__m.MethodFn;
  8865. $__export("SetterFn", $__m.SetterFn);
  8866. $__export("GetterFn", $__m.GetterFn);
  8867. $__export("MethodFn", $__m.MethodFn);
  8868. }],
  8869. execute: function() {
  8870. Reflector = $__export("Reflector", (function() {
  8871. var Reflector = function Reflector(reflectionCapabilities) {
  8872. this._typeInfo = MapWrapper.create();
  8873. this._getters = MapWrapper.create();
  8874. this._setters = MapWrapper.create();
  8875. this._methods = MapWrapper.create();
  8876. this.reflectionCapabilities = reflectionCapabilities;
  8877. };
  8878. return ($traceurRuntime.createClass)(Reflector, {
  8879. registerType: function(type, typeInfo) {
  8880. MapWrapper.set(this._typeInfo, type, typeInfo);
  8881. },
  8882. registerGetters: function(getters) {
  8883. _mergeMaps(this._getters, getters);
  8884. },
  8885. registerSetters: function(setters) {
  8886. _mergeMaps(this._setters, setters);
  8887. },
  8888. registerMethods: function(methods) {
  8889. _mergeMaps(this._methods, methods);
  8890. },
  8891. factory: function(type) {
  8892. if (MapWrapper.contains(this._typeInfo, type)) {
  8893. return MapWrapper.get(this._typeInfo, type)["factory"];
  8894. } else {
  8895. return this.reflectionCapabilities.factory(type);
  8896. }
  8897. },
  8898. parameters: function(typeOfFunc) {
  8899. if (MapWrapper.contains(this._typeInfo, typeOfFunc)) {
  8900. return MapWrapper.get(this._typeInfo, typeOfFunc)["parameters"];
  8901. } else {
  8902. return this.reflectionCapabilities.parameters(typeOfFunc);
  8903. }
  8904. },
  8905. annotations: function(typeOfFunc) {
  8906. if (MapWrapper.contains(this._typeInfo, typeOfFunc)) {
  8907. return MapWrapper.get(this._typeInfo, typeOfFunc)["annotations"];
  8908. } else {
  8909. return this.reflectionCapabilities.annotations(typeOfFunc);
  8910. }
  8911. },
  8912. getter: function(name) {
  8913. if (MapWrapper.contains(this._getters, name)) {
  8914. return MapWrapper.get(this._getters, name);
  8915. } else {
  8916. return this.reflectionCapabilities.getter(name);
  8917. }
  8918. },
  8919. setter: function(name) {
  8920. if (MapWrapper.contains(this._setters, name)) {
  8921. return MapWrapper.get(this._setters, name);
  8922. } else {
  8923. return this.reflectionCapabilities.setter(name);
  8924. }
  8925. },
  8926. method: function(name) {
  8927. if (MapWrapper.contains(this._methods, name)) {
  8928. return MapWrapper.get(this._methods, name);
  8929. } else {
  8930. return this.reflectionCapabilities.method(name);
  8931. }
  8932. }
  8933. }, {});
  8934. }()));
  8935. Object.defineProperty(Reflector.prototype.factory, "parameters", {get: function() {
  8936. return [[Type]];
  8937. }});
  8938. Object.defineProperty(Reflector.prototype.getter, "parameters", {get: function() {
  8939. return [[assert.type.string]];
  8940. }});
  8941. Object.defineProperty(Reflector.prototype.setter, "parameters", {get: function() {
  8942. return [[assert.type.string]];
  8943. }});
  8944. Object.defineProperty(Reflector.prototype.method, "parameters", {get: function() {
  8945. return [[assert.type.string]];
  8946. }});
  8947. Object.defineProperty(_mergeMaps, "parameters", {get: function() {
  8948. return [[Map], []];
  8949. }});
  8950. }
  8951. };
  8952. });
  8953.  
  8954. System.register("angular2/src/di/key", ["angular2/src/di/exceptions", "angular2/src/facade/collection", "angular2/src/facade/lang"], function($__export) {
  8955. "use strict";
  8956. var __moduleName = "angular2/src/di/key";
  8957. var KeyMetadataError,
  8958. MapWrapper,
  8959. Map,
  8960. int,
  8961. isPresent,
  8962. Key,
  8963. KeyRegistry,
  8964. _globalKeyRegistry;
  8965. return {
  8966. setters: [function($__m) {
  8967. KeyMetadataError = $__m.KeyMetadataError;
  8968. }, function($__m) {
  8969. MapWrapper = $__m.MapWrapper;
  8970. Map = $__m.Map;
  8971. }, function($__m) {
  8972. int = $__m.int;
  8973. isPresent = $__m.isPresent;
  8974. }],
  8975. execute: function() {
  8976. Key = $__export("Key", (function() {
  8977. var Key = function Key(token, id) {
  8978. this.token = token;
  8979. this.id = id;
  8980. this.metadata = null;
  8981. };
  8982. return ($traceurRuntime.createClass)(Key, {}, {
  8983. setMetadata: function(key, metadata) {
  8984. if (isPresent(key.metadata) && key.metadata !== metadata) {
  8985. throw new KeyMetadataError();
  8986. }
  8987. key.metadata = metadata;
  8988. return key;
  8989. },
  8990. get: function(token) {
  8991. return _globalKeyRegistry.get(token);
  8992. },
  8993. get numberOfKeys() {
  8994. return _globalKeyRegistry.numberOfKeys;
  8995. }
  8996. });
  8997. }()));
  8998. Object.defineProperty(Key, "parameters", {get: function() {
  8999. return [[], [int]];
  9000. }});
  9001. Object.defineProperty(Key.setMetadata, "parameters", {get: function() {
  9002. return [[Key], []];
  9003. }});
  9004. KeyRegistry = $__export("KeyRegistry", (function() {
  9005. var KeyRegistry = function KeyRegistry() {
  9006. this._allKeys = MapWrapper.create();
  9007. };
  9008. return ($traceurRuntime.createClass)(KeyRegistry, {
  9009. get: function(token) {
  9010. if (token instanceof Key)
  9011. return token;
  9012. if (MapWrapper.contains(this._allKeys, token)) {
  9013. return MapWrapper.get(this._allKeys, token);
  9014. }
  9015. var newKey = new Key(token, Key.numberOfKeys);
  9016. MapWrapper.set(this._allKeys, token, newKey);
  9017. return newKey;
  9018. },
  9019. get numberOfKeys() {
  9020. return MapWrapper.size(this._allKeys);
  9021. }
  9022. }, {});
  9023. }()));
  9024. _globalKeyRegistry = new KeyRegistry();
  9025. }
  9026. };
  9027. });
  9028.  
  9029. System.register("angular2/src/facade/async", ["angular2/src/facade/lang", "angular2/src/facade/collection", "rx/dist/rx.all"], function($__export) {
  9030. "use strict";
  9031. var __moduleName = "angular2/src/facade/async";
  9032. var int,
  9033. global,
  9034. isPresent,
  9035. List,
  9036. Rx,
  9037. Promise,
  9038. PromiseWrapper,
  9039. Observable,
  9040. ObservableController,
  9041. ObservableWrapper;
  9042. return {
  9043. setters: [function($__m) {
  9044. int = $__m.int;
  9045. global = $__m.global;
  9046. isPresent = $__m.isPresent;
  9047. }, function($__m) {
  9048. List = $__m.List;
  9049. }, function($__m) {
  9050. Rx = $__m.default;
  9051. }],
  9052. execute: function() {
  9053. Promise = $__export("Promise", global.Promise);
  9054. PromiseWrapper = $__export("PromiseWrapper", (function() {
  9055. var PromiseWrapper = function PromiseWrapper() {
  9056. ;
  9057. };
  9058. return ($traceurRuntime.createClass)(PromiseWrapper, {}, {
  9059. resolve: function(obj) {
  9060. return Promise.resolve(obj);
  9061. },
  9062. reject: function(obj) {
  9063. return Promise.reject(obj);
  9064. },
  9065. catchError: function(promise, onError) {
  9066. return promise.catch(onError);
  9067. },
  9068. all: function(promises) {
  9069. if (promises.length == 0)
  9070. return Promise.resolve([]);
  9071. return Promise.all(promises);
  9072. },
  9073. then: function(promise, success, rejection) {
  9074. return promise.then(success, rejection);
  9075. },
  9076. completer: function() {
  9077. var resolve;
  9078. var reject;
  9079. var p = new Promise(function(res, rej) {
  9080. resolve = res;
  9081. reject = rej;
  9082. });
  9083. return {
  9084. promise: p,
  9085. resolve: resolve,
  9086. reject: reject
  9087. };
  9088. },
  9089. setTimeout: function(fn, millis) {
  9090. global.setTimeout(fn, millis);
  9091. },
  9092. isPromise: function(maybePromise) {
  9093. return maybePromise instanceof Promise;
  9094. }
  9095. });
  9096. }()));
  9097. Object.defineProperty(PromiseWrapper.catchError, "parameters", {get: function() {
  9098. return [[Promise], [Function]];
  9099. }});
  9100. Object.defineProperty(PromiseWrapper.all, "parameters", {get: function() {
  9101. return [[List]];
  9102. }});
  9103. Object.defineProperty(PromiseWrapper.then, "parameters", {get: function() {
  9104. return [[Promise], [Function], [Function]];
  9105. }});
  9106. Object.defineProperty(PromiseWrapper.setTimeout, "parameters", {get: function() {
  9107. return [[Function], [int]];
  9108. }});
  9109. Observable = $__export("Observable", Rx.Observable);
  9110. ObservableController = $__export("ObservableController", Rx.Subject);
  9111. ObservableWrapper = $__export("ObservableWrapper", (function() {
  9112. var ObservableWrapper = function ObservableWrapper() {
  9113. ;
  9114. };
  9115. return ($traceurRuntime.createClass)(ObservableWrapper, {}, {
  9116. createController: function() {
  9117. return new Rx.Subject();
  9118. },
  9119. createObservable: function(subject) {
  9120. return subject;
  9121. },
  9122. subscribe: function(observable, generatorOrOnNext) {
  9123. var onThrow = arguments[2] !== (void 0) ? arguments[2] : null;
  9124. var onReturn = arguments[3] !== (void 0) ? arguments[3] : null;
  9125. if (isPresent(generatorOrOnNext.next)) {
  9126. return observable.observeOn(Rx.Scheduler.timeout).subscribe((function(value) {
  9127. return generatorOrOnNext.next(value);
  9128. }), (function(error) {
  9129. return generatorOrOnNext.throw(error);
  9130. }), (function() {
  9131. return generatorOrOnNext.return();
  9132. }));
  9133. } else {
  9134. return observable.observeOn(Rx.Scheduler.timeout).subscribe(generatorOrOnNext, onThrow, onReturn);
  9135. }
  9136. },
  9137. callNext: function(subject, value) {
  9138. subject.onNext(value);
  9139. },
  9140. callThrow: function(subject, error) {
  9141. subject.onError(error);
  9142. },
  9143. callReturn: function(subject) {
  9144. subject.onCompleted();
  9145. }
  9146. });
  9147. }()));
  9148. Object.defineProperty(ObservableWrapper.createObservable, "parameters", {get: function() {
  9149. return [[Rx.Subject]];
  9150. }});
  9151. Object.defineProperty(ObservableWrapper.subscribe, "parameters", {get: function() {
  9152. return [[Observable], [], [], []];
  9153. }});
  9154. Object.defineProperty(ObservableWrapper.callNext, "parameters", {get: function() {
  9155. return [[Rx.Subject], [assert.type.any]];
  9156. }});
  9157. Object.defineProperty(ObservableWrapper.callThrow, "parameters", {get: function() {
  9158. return [[Rx.Subject], [assert.type.any]];
  9159. }});
  9160. Object.defineProperty(ObservableWrapper.callReturn, "parameters", {get: function() {
  9161. return [[Rx.Subject]];
  9162. }});
  9163. }
  9164. };
  9165. });
  9166.  
  9167. System.register("angular2/src/reflection/reflection", ["angular2/src/facade/lang", "angular2/src/facade/collection", "angular2/src/reflection/reflector", "angular2/src/reflection/reflection_capabilities"], function($__export) {
  9168. "use strict";
  9169. var __moduleName = "angular2/src/reflection/reflection";
  9170. var Type,
  9171. isPresent,
  9172. List,
  9173. ListWrapper,
  9174. Reflector,
  9175. ReflectionCapabilities,
  9176. reflector;
  9177. return {
  9178. setters: [function($__m) {
  9179. Type = $__m.Type;
  9180. isPresent = $__m.isPresent;
  9181. }, function($__m) {
  9182. List = $__m.List;
  9183. ListWrapper = $__m.ListWrapper;
  9184. }, function($__m) {
  9185. Reflector = $__m.Reflector;
  9186. $__export("Reflector", $__m.Reflector);
  9187. }, function($__m) {
  9188. ReflectionCapabilities = $__m.ReflectionCapabilities;
  9189. }],
  9190. execute: function() {
  9191. reflector = $__export("reflector", new Reflector(new ReflectionCapabilities()));
  9192. }
  9193. };
  9194. });
  9195.  
  9196. System.register("angular2/src/di/binding", ["angular2/src/facade/lang", "angular2/src/facade/collection", "angular2/src/reflection/reflection", "angular2/src/di/key", "angular2/src/di/annotations", "angular2/src/di/exceptions"], function($__export) {
  9197. "use strict";
  9198. var __moduleName = "angular2/src/di/binding";
  9199. var Type,
  9200. isBlank,
  9201. isPresent,
  9202. List,
  9203. MapWrapper,
  9204. ListWrapper,
  9205. reflector,
  9206. Key,
  9207. Inject,
  9208. InjectLazy,
  9209. InjectPromise,
  9210. Optional,
  9211. DependencyAnnotation,
  9212. NoAnnotationError,
  9213. Dependency,
  9214. Binding,
  9215. BindingBuilder;
  9216. function bind(token) {
  9217. return new BindingBuilder(token);
  9218. }
  9219. function _dependenciesFor(typeOrFunc) {
  9220. var params = reflector.parameters(typeOrFunc);
  9221. if (isBlank(params))
  9222. return [];
  9223. if (ListWrapper.any(params, (function(p) {
  9224. return isBlank(p);
  9225. })))
  9226. throw new NoAnnotationError(typeOrFunc);
  9227. return ListWrapper.map(params, (function(p) {
  9228. return _extractToken(typeOrFunc, p);
  9229. }));
  9230. }
  9231. function _extractToken(typeOrFunc, annotations) {
  9232. var depProps = [];
  9233. var token = null;
  9234. var optional = false;
  9235. var lazy = false;
  9236. var asPromise = false;
  9237. for (var i = 0; i < annotations.length; ++i) {
  9238. var paramAnnotation = annotations[i];
  9239. if (paramAnnotation instanceof Type) {
  9240. token = paramAnnotation;
  9241. } else if (paramAnnotation instanceof Inject) {
  9242. token = paramAnnotation.token;
  9243. } else if (paramAnnotation instanceof InjectPromise) {
  9244. token = paramAnnotation.token;
  9245. asPromise = true;
  9246. } else if (paramAnnotation instanceof InjectLazy) {
  9247. token = paramAnnotation.token;
  9248. lazy = true;
  9249. } else if (paramAnnotation instanceof Optional) {
  9250. optional = true;
  9251. } else if (paramAnnotation instanceof DependencyAnnotation) {
  9252. if (isPresent(paramAnnotation.token)) {
  9253. token = paramAnnotation.token;
  9254. }
  9255. ListWrapper.push(depProps, paramAnnotation);
  9256. }
  9257. }
  9258. if (isPresent(token)) {
  9259. return _createDependency(token, asPromise, lazy, optional, depProps);
  9260. } else {
  9261. throw new NoAnnotationError(typeOrFunc);
  9262. }
  9263. }
  9264. function _createDependency(token, asPromise, lazy, optional, depProps) {
  9265. return new Dependency(Key.get(token), asPromise, lazy, optional, depProps);
  9266. }
  9267. $__export("bind", bind);
  9268. return {
  9269. setters: [function($__m) {
  9270. Type = $__m.Type;
  9271. isBlank = $__m.isBlank;
  9272. isPresent = $__m.isPresent;
  9273. }, function($__m) {
  9274. List = $__m.List;
  9275. MapWrapper = $__m.MapWrapper;
  9276. ListWrapper = $__m.ListWrapper;
  9277. }, function($__m) {
  9278. reflector = $__m.reflector;
  9279. }, function($__m) {
  9280. Key = $__m.Key;
  9281. }, function($__m) {
  9282. Inject = $__m.Inject;
  9283. InjectLazy = $__m.InjectLazy;
  9284. InjectPromise = $__m.InjectPromise;
  9285. Optional = $__m.Optional;
  9286. DependencyAnnotation = $__m.DependencyAnnotation;
  9287. }, function($__m) {
  9288. NoAnnotationError = $__m.NoAnnotationError;
  9289. }],
  9290. execute: function() {
  9291. Dependency = $__export("Dependency", (function() {
  9292. var Dependency = function Dependency(key, asPromise, lazy, optional, properties) {
  9293. this.key = key;
  9294. this.asPromise = asPromise;
  9295. this.lazy = lazy;
  9296. this.optional = optional;
  9297. this.properties = properties;
  9298. };
  9299. return ($traceurRuntime.createClass)(Dependency, {}, {fromKey: function(key) {
  9300. return new Dependency(key, false, false, false, []);
  9301. }});
  9302. }()));
  9303. Object.defineProperty(Dependency, "parameters", {get: function() {
  9304. return [[Key], [assert.type.boolean], [assert.type.boolean], [assert.type.boolean], [List]];
  9305. }});
  9306. Object.defineProperty(Dependency.fromKey, "parameters", {get: function() {
  9307. return [[Key]];
  9308. }});
  9309. Binding = $__export("Binding", (function() {
  9310. var Binding = function Binding(key, factory, dependencies, providedAsPromise) {
  9311. this.key = key;
  9312. this.factory = factory;
  9313. this.dependencies = dependencies;
  9314. this.providedAsPromise = providedAsPromise;
  9315. };
  9316. return ($traceurRuntime.createClass)(Binding, {}, {});
  9317. }()));
  9318. Object.defineProperty(Binding, "parameters", {get: function() {
  9319. return [[Key], [Function], [List], [assert.type.boolean]];
  9320. }});
  9321. BindingBuilder = $__export("BindingBuilder", (function() {
  9322. var BindingBuilder = function BindingBuilder(token) {
  9323. this.token = token;
  9324. };
  9325. return ($traceurRuntime.createClass)(BindingBuilder, {
  9326. toClass: function(type) {
  9327. return new Binding(Key.get(this.token), reflector.factory(type), _dependenciesFor(type), false);
  9328. },
  9329. toValue: function(value) {
  9330. return new Binding(Key.get(this.token), (function() {
  9331. return value;
  9332. }), [], false);
  9333. },
  9334. toAlias: function(aliasToken) {
  9335. return new Binding(Key.get(this.token), (function(aliasInstance) {
  9336. return aliasInstance;
  9337. }), [Dependency.fromKey(Key.get(aliasToken))], false);
  9338. },
  9339. toFactory: function(factoryFunction) {
  9340. var dependencies = arguments[1] !== (void 0) ? arguments[1] : null;
  9341. return new Binding(Key.get(this.token), factoryFunction, this._constructDependencies(factoryFunction, dependencies), false);
  9342. },
  9343. toAsyncFactory: function(factoryFunction) {
  9344. var dependencies = arguments[1] !== (void 0) ? arguments[1] : null;
  9345. return new Binding(Key.get(this.token), factoryFunction, this._constructDependencies(factoryFunction, dependencies), true);
  9346. },
  9347. _constructDependencies: function(factoryFunction, dependencies) {
  9348. return isBlank(dependencies) ? _dependenciesFor(factoryFunction) : ListWrapper.map(dependencies, (function(t) {
  9349. return Dependency.fromKey(Key.get(t));
  9350. }));
  9351. }
  9352. }, {});
  9353. }()));
  9354. Object.defineProperty(BindingBuilder.prototype.toClass, "parameters", {get: function() {
  9355. return [[Type]];
  9356. }});
  9357. Object.defineProperty(BindingBuilder.prototype.toFactory, "parameters", {get: function() {
  9358. return [[Function], [List]];
  9359. }});
  9360. Object.defineProperty(BindingBuilder.prototype.toAsyncFactory, "parameters", {get: function() {
  9361. return [[Function], [List]];
  9362. }});
  9363. Object.defineProperty(BindingBuilder.prototype._constructDependencies, "parameters", {get: function() {
  9364. return [[Function], [List]];
  9365. }});
  9366. }
  9367. };
  9368. });
  9369.  
  9370. System.register("angular2/src/di/injector", ["angular2/src/facade/collection", "angular2/src/di/binding", "angular2/src/di/exceptions", "angular2/src/facade/lang", "angular2/src/facade/async", "angular2/src/di/key"], function($__export) {
  9371. "use strict";
  9372. var __moduleName = "angular2/src/di/injector";
  9373. var Map,
  9374. List,
  9375. MapWrapper,
  9376. ListWrapper,
  9377. Binding,
  9378. BindingBuilder,
  9379. bind,
  9380. ProviderError,
  9381. NoProviderError,
  9382. InvalidBindingError,
  9383. AsyncBindingError,
  9384. CyclicDependencyError,
  9385. InstantiationError,
  9386. FunctionWrapper,
  9387. Type,
  9388. isPresent,
  9389. isBlank,
  9390. Promise,
  9391. PromiseWrapper,
  9392. Key,
  9393. _constructing,
  9394. _notFound,
  9395. _Waiting,
  9396. Injector,
  9397. _SyncInjectorStrategy,
  9398. _AsyncInjectorStrategy;
  9399. function _isWaiting(obj) {
  9400. return obj instanceof _Waiting;
  9401. }
  9402. function _flattenBindings(bindings, res) {
  9403. ListWrapper.forEach(bindings, function(b) {
  9404. if (b instanceof Binding) {
  9405. MapWrapper.set(res, b.key.id, b);
  9406. } else if (b instanceof Type) {
  9407. var s = bind(b).toClass(b);
  9408. MapWrapper.set(res, s.key.id, s);
  9409. } else if (b instanceof List) {
  9410. _flattenBindings(b, res);
  9411. } else if (b instanceof BindingBuilder) {
  9412. throw new InvalidBindingError(b.token);
  9413. } else {
  9414. throw new InvalidBindingError(b);
  9415. }
  9416. });
  9417. return res;
  9418. }
  9419. return {
  9420. setters: [function($__m) {
  9421. Map = $__m.Map;
  9422. List = $__m.List;
  9423. MapWrapper = $__m.MapWrapper;
  9424. ListWrapper = $__m.ListWrapper;
  9425. }, function($__m) {
  9426. Binding = $__m.Binding;
  9427. BindingBuilder = $__m.BindingBuilder;
  9428. bind = $__m.bind;
  9429. }, function($__m) {
  9430. ProviderError = $__m.ProviderError;
  9431. NoProviderError = $__m.NoProviderError;
  9432. InvalidBindingError = $__m.InvalidBindingError;
  9433. AsyncBindingError = $__m.AsyncBindingError;
  9434. CyclicDependencyError = $__m.CyclicDependencyError;
  9435. InstantiationError = $__m.InstantiationError;
  9436. }, function($__m) {
  9437. FunctionWrapper = $__m.FunctionWrapper;
  9438. Type = $__m.Type;
  9439. isPresent = $__m.isPresent;
  9440. isBlank = $__m.isBlank;
  9441. }, function($__m) {
  9442. Promise = $__m.Promise;
  9443. PromiseWrapper = $__m.PromiseWrapper;
  9444. }, function($__m) {
  9445. Key = $__m.Key;
  9446. }],
  9447. execute: function() {
  9448. _constructing = new Object();
  9449. _notFound = new Object();
  9450. _Waiting = (function() {
  9451. var _Waiting = function _Waiting(promise) {
  9452. this.promise = promise;
  9453. };
  9454. return ($traceurRuntime.createClass)(_Waiting, {}, {});
  9455. }());
  9456. Object.defineProperty(_Waiting, "parameters", {get: function() {
  9457. return [[Promise]];
  9458. }});
  9459. Injector = $__export("Injector", (function() {
  9460. var Injector = function Injector(bindings) {
  9461. var $__3,
  9462. $__4;
  9463. var $__2 = arguments[1] !== (void 0) ? arguments[1] : {},
  9464. parent = ($__3 = $__2.parent) === void 0 ? null : $__3,
  9465. defaultBindings = ($__4 = $__2.defaultBindings) === void 0 ? false : $__4;
  9466. var flatten = _flattenBindings(bindings, MapWrapper.create());
  9467. this._bindings = this._createListOfBindings(flatten);
  9468. this._instances = this._createInstances();
  9469. this._parent = parent;
  9470. this._defaultBindings = defaultBindings;
  9471. this._asyncStrategy = new _AsyncInjectorStrategy(this);
  9472. this._syncStrategy = new _SyncInjectorStrategy(this);
  9473. };
  9474. return ($traceurRuntime.createClass)(Injector, {
  9475. get: function(token) {
  9476. return this._getByKey(Key.get(token), false, false, false);
  9477. },
  9478. getOptional: function(token) {
  9479. return this._getByKey(Key.get(token), false, false, true);
  9480. },
  9481. asyncGet: function(token) {
  9482. return this._getByKey(Key.get(token), true, false, false);
  9483. },
  9484. createChild: function(bindings) {
  9485. return new Injector(bindings, {parent: this});
  9486. },
  9487. _createListOfBindings: function(flattenBindings) {
  9488. var bindings = ListWrapper.createFixedSize(Key.numberOfKeys + 1);
  9489. MapWrapper.forEach(flattenBindings, (function(v, keyId) {
  9490. return bindings[keyId] = v;
  9491. }));
  9492. return bindings;
  9493. },
  9494. _createInstances: function() {
  9495. return ListWrapper.createFixedSize(Key.numberOfKeys + 1);
  9496. },
  9497. _getByKey: function(key, returnPromise, returnLazy, optional) {
  9498. var $__0 = this;
  9499. if (returnLazy) {
  9500. return (function() {
  9501. return $__0._getByKey(key, returnPromise, false, optional);
  9502. });
  9503. }
  9504. var strategy = returnPromise ? this._asyncStrategy : this._syncStrategy;
  9505. var instance = strategy.readFromCache(key);
  9506. if (instance !== _notFound)
  9507. return instance;
  9508. instance = strategy.instantiate(key);
  9509. if (instance !== _notFound)
  9510. return instance;
  9511. if (isPresent(this._parent)) {
  9512. return this._parent._getByKey(key, returnPromise, returnLazy, optional);
  9513. }
  9514. if (optional) {
  9515. return null;
  9516. } else {
  9517. throw new NoProviderError(key);
  9518. }
  9519. },
  9520. _resolveDependencies: function(key, binding, forceAsync) {
  9521. var $__0 = this;
  9522. try {
  9523. var getDependency = (function(d) {
  9524. return $__0._getByKey(d.key, forceAsync || d.asPromise, d.lazy, d.optional);
  9525. });
  9526. return ListWrapper.map(binding.dependencies, getDependency);
  9527. } catch (e) {
  9528. this._clear(key);
  9529. if (e instanceof ProviderError)
  9530. e.addKey(key);
  9531. throw e;
  9532. }
  9533. },
  9534. _getInstance: function(key) {
  9535. if (this._instances.length <= key.id)
  9536. return null;
  9537. return ListWrapper.get(this._instances, key.id);
  9538. },
  9539. _setInstance: function(key, obj) {
  9540. ListWrapper.set(this._instances, key.id, obj);
  9541. },
  9542. _getBinding: function(key) {
  9543. var binding = this._bindings.length <= key.id ? null : ListWrapper.get(this._bindings, key.id);
  9544. if (isBlank(binding) && this._defaultBindings) {
  9545. return bind(key.token).toClass(key.token);
  9546. } else {
  9547. return binding;
  9548. }
  9549. },
  9550. _markAsConstructing: function(key) {
  9551. this._setInstance(key, _constructing);
  9552. },
  9553. _clear: function(key) {
  9554. this._setInstance(key, null);
  9555. }
  9556. }, {});
  9557. }()));
  9558. Object.defineProperty(Injector, "parameters", {get: function() {
  9559. return [[List], []];
  9560. }});
  9561. Object.defineProperty(Injector.prototype.createChild, "parameters", {get: function() {
  9562. return [[List]];
  9563. }});
  9564. Object.defineProperty(Injector.prototype._getByKey, "parameters", {get: function() {
  9565. return [[Key], [assert.type.boolean], [assert.type.boolean], [assert.type.boolean]];
  9566. }});
  9567. Object.defineProperty(Injector.prototype._resolveDependencies, "parameters", {get: function() {
  9568. return [[Key], [Binding], [assert.type.boolean]];
  9569. }});
  9570. Object.defineProperty(Injector.prototype._getInstance, "parameters", {get: function() {
  9571. return [[Key]];
  9572. }});
  9573. Object.defineProperty(Injector.prototype._setInstance, "parameters", {get: function() {
  9574. return [[Key], []];
  9575. }});
  9576. Object.defineProperty(Injector.prototype._getBinding, "parameters", {get: function() {
  9577. return [[Key]];
  9578. }});
  9579. Object.defineProperty(Injector.prototype._markAsConstructing, "parameters", {get: function() {
  9580. return [[Key]];
  9581. }});
  9582. Object.defineProperty(Injector.prototype._clear, "parameters", {get: function() {
  9583. return [[Key]];
  9584. }});
  9585. _SyncInjectorStrategy = (function() {
  9586. var _SyncInjectorStrategy = function _SyncInjectorStrategy(injector) {
  9587. this.injector = injector;
  9588. };
  9589. return ($traceurRuntime.createClass)(_SyncInjectorStrategy, {
  9590. readFromCache: function(key) {
  9591. if (key.token === Injector) {
  9592. return this.injector;
  9593. }
  9594. var instance = this.injector._getInstance(key);
  9595. if (instance === _constructing) {
  9596. throw new CyclicDependencyError(key);
  9597. } else if (isPresent(instance) && !_isWaiting(instance)) {
  9598. return instance;
  9599. } else {
  9600. return _notFound;
  9601. }
  9602. },
  9603. instantiate: function(key) {
  9604. var binding = this.injector._getBinding(key);
  9605. if (isBlank(binding))
  9606. return _notFound;
  9607. if (binding.providedAsPromise)
  9608. throw new AsyncBindingError(key);
  9609. this.injector._markAsConstructing(key);
  9610. var deps = this.injector._resolveDependencies(key, binding, false);
  9611. return this._createInstance(key, binding, deps);
  9612. },
  9613. _createInstance: function(key, binding, deps) {
  9614. try {
  9615. var instance = FunctionWrapper.apply(binding.factory, deps);
  9616. this.injector._setInstance(key, instance);
  9617. return instance;
  9618. } catch (e) {
  9619. this.injector._clear(key);
  9620. throw new InstantiationError(e, key);
  9621. }
  9622. }
  9623. }, {});
  9624. }());
  9625. Object.defineProperty(_SyncInjectorStrategy, "parameters", {get: function() {
  9626. return [[Injector]];
  9627. }});
  9628. Object.defineProperty(_SyncInjectorStrategy.prototype.readFromCache, "parameters", {get: function() {
  9629. return [[Key]];
  9630. }});
  9631. Object.defineProperty(_SyncInjectorStrategy.prototype.instantiate, "parameters", {get: function() {
  9632. return [[Key]];
  9633. }});
  9634. Object.defineProperty(_SyncInjectorStrategy.prototype._createInstance, "parameters", {get: function() {
  9635. return [[Key], [Binding], [List]];
  9636. }});
  9637. _AsyncInjectorStrategy = (function() {
  9638. var _AsyncInjectorStrategy = function _AsyncInjectorStrategy(injector) {
  9639. this.injector = injector;
  9640. };
  9641. return ($traceurRuntime.createClass)(_AsyncInjectorStrategy, {
  9642. readFromCache: function(key) {
  9643. if (key.token === Injector) {
  9644. return PromiseWrapper.resolve(this.injector);
  9645. }
  9646. var instance = this.injector._getInstance(key);
  9647. if (instance === _constructing) {
  9648. throw new CyclicDependencyError(key);
  9649. } else if (_isWaiting(instance)) {
  9650. return instance.promise;
  9651. } else if (isPresent(instance)) {
  9652. return PromiseWrapper.resolve(instance);
  9653. } else {
  9654. return _notFound;
  9655. }
  9656. },
  9657. instantiate: function(key) {
  9658. var $__0 = this;
  9659. var binding = this.injector._getBinding(key);
  9660. if (isBlank(binding))
  9661. return _notFound;
  9662. this.injector._markAsConstructing(key);
  9663. var deps = this.injector._resolveDependencies(key, binding, true);
  9664. var depsPromise = PromiseWrapper.all(deps);
  9665. var promise = PromiseWrapper.then(depsPromise, null, (function(e) {
  9666. return $__0._errorHandler(key, e);
  9667. })).then((function(deps) {
  9668. return $__0._findOrCreate(key, binding, deps);
  9669. })).then((function(instance) {
  9670. return $__0._cacheInstance(key, instance);
  9671. }));
  9672. this.injector._setInstance(key, new _Waiting(promise));
  9673. return promise;
  9674. },
  9675. _errorHandler: function(key, e) {
  9676. if (e instanceof ProviderError)
  9677. e.addKey(key);
  9678. return PromiseWrapper.reject(e);
  9679. },
  9680. _findOrCreate: function(key, binding, deps) {
  9681. try {
  9682. var instance = this.injector._getInstance(key);
  9683. if (!_isWaiting(instance))
  9684. return instance;
  9685. return FunctionWrapper.apply(binding.factory, deps);
  9686. } catch (e) {
  9687. this.injector._clear(key);
  9688. throw new InstantiationError(e, key);
  9689. }
  9690. },
  9691. _cacheInstance: function(key, instance) {
  9692. this.injector._setInstance(key, instance);
  9693. return instance;
  9694. }
  9695. }, {});
  9696. }());
  9697. Object.defineProperty(_AsyncInjectorStrategy, "parameters", {get: function() {
  9698. return [[Injector]];
  9699. }});
  9700. Object.defineProperty(_AsyncInjectorStrategy.prototype.readFromCache, "parameters", {get: function() {
  9701. return [[Key]];
  9702. }});
  9703. Object.defineProperty(_AsyncInjectorStrategy.prototype.instantiate, "parameters", {get: function() {
  9704. return [[Key]];
  9705. }});
  9706. Object.defineProperty(_AsyncInjectorStrategy.prototype._errorHandler, "parameters", {get: function() {
  9707. return [[Key], []];
  9708. }});
  9709. Object.defineProperty(_AsyncInjectorStrategy.prototype._findOrCreate, "parameters", {get: function() {
  9710. return [[Key], [Binding], [List]];
  9711. }});
  9712. Object.defineProperty(_flattenBindings, "parameters", {get: function() {
  9713. return [[List], [Map]];
  9714. }});
  9715. }
  9716. };
  9717. });
  9718.  
  9719. System.register("angular2/di", ["angular2/src/di/annotations", "angular2/src/di/injector", "angular2/src/di/binding", "angular2/src/di/key", "angular2/src/di/exceptions", "angular2/src/di/opaque_token"], function($__export) {
  9720. "use strict";
  9721. var __moduleName = "angular2/di";
  9722. return {
  9723. setters: [function($__m) {
  9724. $__export("Inject", $__m.Inject);
  9725. $__export("InjectPromise", $__m.InjectPromise);
  9726. $__export("InjectLazy", $__m.InjectLazy);
  9727. $__export("Injectable", $__m.Injectable);
  9728. $__export("Optional", $__m.Optional);
  9729. $__export("DependencyAnnotation", $__m.DependencyAnnotation);
  9730. }, function($__m) {
  9731. $__export("Injector", $__m.Injector);
  9732. }, function($__m) {
  9733. $__export("Binding", $__m.Binding);
  9734. $__export("Dependency", $__m.Dependency);
  9735. $__export("bind", $__m.bind);
  9736. }, function($__m) {
  9737. $__export("Key", $__m.Key);
  9738. $__export("KeyRegistry", $__m.KeyRegistry);
  9739. }, function($__m) {
  9740. $__export("KeyMetadataError", $__m.KeyMetadataError);
  9741. $__export("NoProviderError", $__m.NoProviderError);
  9742. $__export("ProviderError", $__m.ProviderError);
  9743. $__export("AsyncBindingError", $__m.AsyncBindingError);
  9744. $__export("CyclicDependencyError", $__m.CyclicDependencyError);
  9745. $__export("InstantiationError", $__m.InstantiationError);
  9746. $__export("InvalidBindingError", $__m.InvalidBindingError);
  9747. $__export("NoAnnotationError", $__m.NoAnnotationError);
  9748. }, function($__m) {
  9749. $__export("OpaqueToken", $__m.OpaqueToken);
  9750. }],
  9751. execute: function() {}
  9752. };
  9753. });
  9754.  
  9755. //# sourceMappingURL=angular2.di.js.map
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement