Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "format register";
- System.register("rx/dist/rx.all", [], true, function(require, exports, module) {
- var global = System.global,
- __define = global.define;
- global.define = undefined;
- ;
- (function(undefined) {
- var objectTypes = {
- 'boolean': false,
- 'function': true,
- 'object': true,
- 'number': false,
- 'string': false,
- 'undefined': false
- };
- var root = (objectTypes[typeof window] && window) || this,
- freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,
- freeModule = objectTypes[typeof module] && module && !module.nodeType && module,
- moduleExports = freeModule && freeModule.exports === freeExports && freeExports,
- freeGlobal = objectTypes[typeof global] && global;
- if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
- root = freeGlobal;
- }
- var Rx = {
- internals: {},
- config: {Promise: root.Promise},
- helpers: {}
- };
- var noop = Rx.helpers.noop = function() {},
- notDefined = Rx.helpers.notDefined = function(x) {
- return typeof x === 'undefined';
- },
- isScheduler = Rx.helpers.isScheduler = function(x) {
- return x instanceof Rx.Scheduler;
- },
- identity = Rx.helpers.identity = function(x) {
- return x;
- },
- pluck = Rx.helpers.pluck = function(property) {
- return function(x) {
- return x[property];
- };
- },
- just = Rx.helpers.just = function(value) {
- return function() {
- return value;
- };
- },
- defaultNow = Rx.helpers.defaultNow = Date.now,
- defaultComparer = Rx.helpers.defaultComparer = function(x, y) {
- return isEqual(x, y);
- },
- defaultSubComparer = Rx.helpers.defaultSubComparer = function(x, y) {
- return x > y ? 1 : (x < y ? -1 : 0);
- },
- defaultKeySerializer = Rx.helpers.defaultKeySerializer = function(x) {
- return x.toString();
- },
- defaultError = Rx.helpers.defaultError = function(err) {
- throw err;
- },
- isPromise = Rx.helpers.isPromise = function(p) {
- return !!p && typeof p.then === 'function';
- },
- asArray = Rx.helpers.asArray = function() {
- return Array.prototype.slice.call(arguments);
- },
- not = Rx.helpers.not = function(a) {
- return !a;
- },
- isFunction = Rx.helpers.isFunction = (function() {
- var isFn = function(value) {
- return typeof value == 'function' || false;
- };
- if (isFn(/x/)) {
- isFn = function(value) {
- return typeof value == 'function' && toString.call(value) == '[object Function]';
- };
- }
- return isFn;
- }());
- function cloneArray(arr) {
- for (var a = [],
- i = 0,
- len = arr.length; i < len; i++) {
- a.push(arr[i]);
- }
- return a;
- }
- Rx.config.longStackSupport = false;
- var hasStacks = false;
- try {
- throw new Error();
- } catch (e) {
- hasStacks = !!e.stack;
- }
- var rStartingLine = captureLine(),
- rFileName;
- var STACK_JUMP_SEPARATOR = "From previous event:";
- function makeStackTraceLong(error, observable) {
- if (hasStacks && observable.stack && typeof error === "object" && error !== null && error.stack && error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1) {
- var stacks = [];
- for (var o = observable; !!o; o = o.source) {
- if (o.stack) {
- stacks.unshift(o.stack);
- }
- }
- stacks.unshift(error.stack);
- var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
- error.stack = filterStackString(concatedStacks);
- }
- }
- function filterStackString(stackString) {
- var lines = stackString.split("\n"),
- desiredLines = [];
- for (var i = 0,
- len = lines.length; i < len; i++) {
- var line = lines[i];
- if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
- desiredLines.push(line);
- }
- }
- return desiredLines.join("\n");
- }
- function isInternalFrame(stackLine) {
- var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
- if (!fileNameAndLineNumber) {
- return false;
- }
- var fileName = fileNameAndLineNumber[0],
- lineNumber = fileNameAndLineNumber[1];
- return fileName === rFileName && lineNumber >= rStartingLine && lineNumber <= rEndingLine;
- }
- function isNodeFrame(stackLine) {
- return stackLine.indexOf("(module.js:") !== -1 || stackLine.indexOf("(node.js:") !== -1;
- }
- function captureLine() {
- if (!hasStacks) {
- return ;
- }
- try {
- throw new Error();
- } catch (e) {
- var lines = e.stack.split("\n");
- var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
- var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
- if (!fileNameAndLineNumber) {
- return ;
- }
- rFileName = fileNameAndLineNumber[0];
- return fileNameAndLineNumber[1];
- }
- }
- function getFileNameAndLineNumber(stackLine) {
- var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
- if (attempt1) {
- return [attempt1[1], Number(attempt1[2])];
- }
- var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
- if (attempt2) {
- return [attempt2[1], Number(attempt2[2])];
- }
- var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
- if (attempt3) {
- return [attempt3[1], Number(attempt3[2])];
- }
- }
- var EmptyError = Rx.EmptyError = function() {
- this.message = 'Sequence contains no elements.';
- Error.call(this);
- };
- EmptyError.prototype = Error.prototype;
- var ObjectDisposedError = Rx.ObjectDisposedError = function() {
- this.message = 'Object has been disposed';
- Error.call(this);
- };
- ObjectDisposedError.prototype = Error.prototype;
- var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function() {
- this.message = 'Argument out of range';
- Error.call(this);
- };
- ArgumentOutOfRangeError.prototype = Error.prototype;
- var NotSupportedError = Rx.NotSupportedError = function(message) {
- this.message = message || 'This operation is not supported';
- Error.call(this);
- };
- NotSupportedError.prototype = Error.prototype;
- var NotImplementedError = Rx.NotImplementedError = function(message) {
- this.message = message || 'This operation is not implemented';
- Error.call(this);
- };
- NotImplementedError.prototype = Error.prototype;
- var notImplemented = Rx.helpers.notImplemented = function() {
- throw new NotImplementedError();
- };
- var notSupported = Rx.helpers.notSupported = function() {
- throw new NotSupportedError();
- };
- var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) || '_es6shim_iterator_';
- if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {
- $iterator$ = '@@iterator';
- }
- var doneEnumerator = Rx.doneEnumerator = {
- done: true,
- value: undefined
- };
- var isIterable = Rx.helpers.isIterable = function(o) {
- return o[$iterator$] !== undefined;
- };
- var isArrayLike = Rx.helpers.isArrayLike = function(o) {
- return o && o.length !== undefined;
- };
- Rx.helpers.iterator = $iterator$;
- var bindCallback = Rx.internals.bindCallback = function(func, thisArg, argCount) {
- if (typeof thisArg === 'undefined') {
- return func;
- }
- switch (argCount) {
- case 0:
- return function() {
- return func.call(thisArg);
- };
- case 1:
- return function(arg) {
- return func.call(thisArg, arg);
- };
- case 2:
- return function(value, index) {
- return func.call(thisArg, value, index);
- };
- case 3:
- return function(value, index, collection) {
- return func.call(thisArg, value, index, collection);
- };
- }
- return function() {
- return func.apply(thisArg, arguments);
- };
- };
- var dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],
- dontEnumsLength = dontEnums.length;
- var argsClass = '[object Arguments]',
- arrayClass = '[object Array]',
- boolClass = '[object Boolean]',
- dateClass = '[object Date]',
- errorClass = '[object Error]',
- funcClass = '[object Function]',
- numberClass = '[object Number]',
- objectClass = '[object Object]',
- regexpClass = '[object RegExp]',
- stringClass = '[object String]';
- var toString = Object.prototype.toString,
- hasOwnProperty = Object.prototype.hasOwnProperty,
- supportsArgsClass = toString.call(arguments) == argsClass,
- supportNodeClass,
- errorProto = Error.prototype,
- objectProto = Object.prototype,
- stringProto = String.prototype,
- propertyIsEnumerable = objectProto.propertyIsEnumerable;
- try {
- supportNodeClass = !(toString.call(document) == objectClass && !({'toString': 0} + ''));
- } catch (e) {
- supportNodeClass = true;
- }
- var nonEnumProps = {};
- nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = {
- 'constructor': true,
- 'toLocaleString': true,
- 'toString': true,
- 'valueOf': true
- };
- nonEnumProps[boolClass] = nonEnumProps[stringClass] = {
- 'constructor': true,
- 'toString': true,
- 'valueOf': true
- };
- nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = {
- 'constructor': true,
- 'toString': true
- };
- nonEnumProps[objectClass] = {'constructor': true};
- var support = {};
- (function() {
- var ctor = function() {
- this.x = 1;
- },
- props = [];
- ctor.prototype = {
- 'valueOf': 1,
- 'y': 1
- };
- for (var key in new ctor) {
- props.push(key);
- }
- for (key in arguments) {}
- support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');
- support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');
- support.nonEnumArgs = key != 0;
- support.nonEnumShadows = !/valueOf/.test(props);
- }(1));
- var isObject = Rx.internals.isObject = function(value) {
- var type = typeof value;
- return value && (type == 'function' || type == 'object') || false;
- };
- function keysIn(object) {
- var result = [];
- if (!isObject(object)) {
- return result;
- }
- if (support.nonEnumArgs && object.length && isArguments(object)) {
- object = slice.call(object);
- }
- var skipProto = support.enumPrototypes && typeof object == 'function',
- skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error);
- for (var key in object) {
- if (!(skipProto && key == 'prototype') && !(skipErrorProps && (key == 'message' || key == 'name'))) {
- result.push(key);
- }
- }
- if (support.nonEnumShadows && object !== objectProto) {
- var ctor = object.constructor,
- index = -1,
- length = dontEnumsLength;
- if (object === (ctor && ctor.prototype)) {
- var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),
- nonEnum = nonEnumProps[className];
- }
- while (++index < length) {
- key = dontEnums[index];
- if (!(nonEnum && nonEnum[key]) && hasOwnProperty.call(object, key)) {
- result.push(key);
- }
- }
- }
- return result;
- }
- function internalFor(object, callback, keysFunc) {
- var index = -1,
- props = keysFunc(object),
- length = props.length;
- while (++index < length) {
- var key = props[index];
- if (callback(object[key], key, object) === false) {
- break;
- }
- }
- return object;
- }
- function internalForIn(object, callback) {
- return internalFor(object, callback, keysIn);
- }
- function isNode(value) {
- return typeof value.toString != 'function' && typeof(value + '') == 'string';
- }
- var isArguments = function(value) {
- return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;
- };
- if (!supportsArgsClass) {
- isArguments = function(value) {
- return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;
- };
- }
- var isEqual = Rx.internals.isEqual = function(x, y) {
- return deepEquals(x, y, [], []);
- };
- function deepEquals(a, b, stackA, stackB) {
- if (a === b) {
- return a !== 0 || (1 / a == 1 / b);
- }
- var type = typeof a,
- otherType = typeof b;
- if (a === a && (a == null || b == null || (type != 'function' && type != 'object' && otherType != 'function' && otherType != 'object'))) {
- return false;
- }
- var className = toString.call(a),
- otherClass = toString.call(b);
- if (className == argsClass) {
- className = objectClass;
- }
- if (otherClass == argsClass) {
- otherClass = objectClass;
- }
- if (className != otherClass) {
- return false;
- }
- switch (className) {
- case boolClass:
- case dateClass:
- return +a == +b;
- case numberClass:
- return (a != +a) ? b != +b : (a == 0 ? (1 / a == 1 / b) : a == +b);
- case regexpClass:
- case stringClass:
- return a == String(b);
- }
- var isArr = className == arrayClass;
- if (!isArr) {
- if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {
- return false;
- }
- var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,
- ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;
- 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)) {
- return false;
- }
- }
- var initedStack = !stackA;
- stackA || (stackA = []);
- stackB || (stackB = []);
- var length = stackA.length;
- while (length--) {
- if (stackA[length] == a) {
- return stackB[length] == b;
- }
- }
- var size = 0;
- var result = true;
- stackA.push(a);
- stackB.push(b);
- if (isArr) {
- length = a.length;
- size = b.length;
- result = size == length;
- if (result) {
- while (size--) {
- var index = length,
- value = b[size];
- if (!(result = deepEquals(a[size], value, stackA, stackB))) {
- break;
- }
- }
- }
- } else {
- internalForIn(b, function(value, key, b) {
- if (hasOwnProperty.call(b, key)) {
- size++;
- return (result = hasOwnProperty.call(a, key) && deepEquals(a[key], value, stackA, stackB));
- }
- });
- if (result) {
- internalForIn(a, function(value, key, a) {
- if (hasOwnProperty.call(a, key)) {
- return (result = --size > -1);
- }
- });
- }
- }
- stackA.pop();
- stackB.pop();
- return result;
- }
- var hasProp = {}.hasOwnProperty,
- slice = Array.prototype.slice;
- var inherits = this.inherits = Rx.internals.inherits = function(child, parent) {
- function __() {
- this.constructor = child;
- }
- __.prototype = parent.prototype;
- child.prototype = new __();
- };
- var addProperties = Rx.internals.addProperties = function(obj) {
- for (var sources = [],
- i = 1,
- len = arguments.length; i < len; i++) {
- sources.push(arguments[i]);
- }
- for (var idx = 0,
- ln = sources.length; idx < ln; idx++) {
- var source = sources[idx];
- for (var prop in source) {
- obj[prop] = source[prop];
- }
- }
- };
- var addRef = Rx.internals.addRef = function(xs, r) {
- return new AnonymousObservable(function(observer) {
- return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer));
- });
- };
- function arrayInitialize(count, factory) {
- var a = new Array(count);
- for (var i = 0; i < count; i++) {
- a[i] = factory();
- }
- return a;
- }
- var errorObj = {e: {}};
- var tryCatchTarget;
- function tryCatcher() {
- try {
- return tryCatchTarget.apply(this, arguments);
- } catch (e) {
- errorObj.e = e;
- return errorObj;
- }
- }
- function tryCatch(fn) {
- if (!isFunction(fn)) {
- throw new TypeError('fn must be a function');
- }
- tryCatchTarget = fn;
- return tryCatcher;
- }
- function thrower(e) {
- throw e;
- }
- function IndexedItem(id, value) {
- this.id = id;
- this.value = value;
- }
- IndexedItem.prototype.compareTo = function(other) {
- var c = this.value.compareTo(other.value);
- c === 0 && (c = this.id - other.id);
- return c;
- };
- var PriorityQueue = Rx.internals.PriorityQueue = function(capacity) {
- this.items = new Array(capacity);
- this.length = 0;
- };
- var priorityProto = PriorityQueue.prototype;
- priorityProto.isHigherPriority = function(left, right) {
- return this.items[left].compareTo(this.items[right]) < 0;
- };
- priorityProto.percolate = function(index) {
- if (index >= this.length || index < 0) {
- return ;
- }
- var parent = index - 1 >> 1;
- if (parent < 0 || parent === index) {
- return ;
- }
- if (this.isHigherPriority(index, parent)) {
- var temp = this.items[index];
- this.items[index] = this.items[parent];
- this.items[parent] = temp;
- this.percolate(parent);
- }
- };
- priorityProto.heapify = function(index) {
- +index || (index = 0);
- if (index >= this.length || index < 0) {
- return ;
- }
- var left = 2 * index + 1,
- right = 2 * index + 2,
- first = index;
- if (left < this.length && this.isHigherPriority(left, first)) {
- first = left;
- }
- if (right < this.length && this.isHigherPriority(right, first)) {
- first = right;
- }
- if (first !== index) {
- var temp = this.items[index];
- this.items[index] = this.items[first];
- this.items[first] = temp;
- this.heapify(first);
- }
- };
- priorityProto.peek = function() {
- return this.items[0].value;
- };
- priorityProto.removeAt = function(index) {
- this.items[index] = this.items[--this.length];
- this.items[this.length] = undefined;
- this.heapify();
- };
- priorityProto.dequeue = function() {
- var result = this.peek();
- this.removeAt(0);
- return result;
- };
- priorityProto.enqueue = function(item) {
- var index = this.length++;
- this.items[index] = new IndexedItem(PriorityQueue.count++, item);
- this.percolate(index);
- };
- priorityProto.remove = function(item) {
- for (var i = 0; i < this.length; i++) {
- if (this.items[i].value === item) {
- this.removeAt(i);
- return true;
- }
- }
- return false;
- };
- PriorityQueue.count = 0;
- var CompositeDisposable = Rx.CompositeDisposable = function() {
- var args = [],
- i,
- len;
- if (Array.isArray(arguments[0])) {
- args = arguments[0];
- len = args.length;
- } else {
- len = arguments.length;
- args = new Array(len);
- for (i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- }
- for (i = 0; i < len; i++) {
- if (!isDisposable(args[i])) {
- throw new TypeError('Not a disposable');
- }
- }
- this.disposables = args;
- this.isDisposed = false;
- this.length = args.length;
- };
- var CompositeDisposablePrototype = CompositeDisposable.prototype;
- CompositeDisposablePrototype.add = function(item) {
- if (this.isDisposed) {
- item.dispose();
- } else {
- this.disposables.push(item);
- this.length++;
- }
- };
- CompositeDisposablePrototype.remove = function(item) {
- var shouldDispose = false;
- if (!this.isDisposed) {
- var idx = this.disposables.indexOf(item);
- if (idx !== -1) {
- shouldDispose = true;
- this.disposables.splice(idx, 1);
- this.length--;
- item.dispose();
- }
- }
- return shouldDispose;
- };
- CompositeDisposablePrototype.dispose = function() {
- if (!this.isDisposed) {
- this.isDisposed = true;
- var len = this.disposables.length,
- currentDisposables = new Array(len);
- for (var i = 0; i < len; i++) {
- currentDisposables[i] = this.disposables[i];
- }
- this.disposables = [];
- this.length = 0;
- for (i = 0; i < len; i++) {
- currentDisposables[i].dispose();
- }
- }
- };
- var Disposable = Rx.Disposable = function(action) {
- this.isDisposed = false;
- this.action = action || noop;
- };
- Disposable.prototype.dispose = function() {
- if (!this.isDisposed) {
- this.action();
- this.isDisposed = true;
- }
- };
- var disposableCreate = Disposable.create = function(action) {
- return new Disposable(action);
- };
- var disposableEmpty = Disposable.empty = {dispose: noop};
- var isDisposable = Disposable.isDisposable = function(d) {
- return d && isFunction(d.dispose);
- };
- var checkDisposed = Disposable.checkDisposed = function(disposable) {
- if (disposable.isDisposed) {
- throw new ObjectDisposedError();
- }
- };
- var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function() {
- function BooleanDisposable() {
- this.isDisposed = false;
- this.current = null;
- }
- var booleanDisposablePrototype = BooleanDisposable.prototype;
- booleanDisposablePrototype.getDisposable = function() {
- return this.current;
- };
- booleanDisposablePrototype.setDisposable = function(value) {
- var shouldDispose = this.isDisposed;
- if (!shouldDispose) {
- var old = this.current;
- this.current = value;
- }
- old && old.dispose();
- shouldDispose && value && value.dispose();
- };
- booleanDisposablePrototype.dispose = function() {
- if (!this.isDisposed) {
- this.isDisposed = true;
- var old = this.current;
- this.current = null;
- }
- old && old.dispose();
- };
- return BooleanDisposable;
- }());
- var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;
- var RefCountDisposable = Rx.RefCountDisposable = (function() {
- function InnerDisposable(disposable) {
- this.disposable = disposable;
- this.disposable.count++;
- this.isInnerDisposed = false;
- }
- InnerDisposable.prototype.dispose = function() {
- if (!this.disposable.isDisposed && !this.isInnerDisposed) {
- this.isInnerDisposed = true;
- this.disposable.count--;
- if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {
- this.disposable.isDisposed = true;
- this.disposable.underlyingDisposable.dispose();
- }
- }
- };
- function RefCountDisposable(disposable) {
- this.underlyingDisposable = disposable;
- this.isDisposed = false;
- this.isPrimaryDisposed = false;
- this.count = 0;
- }
- RefCountDisposable.prototype.dispose = function() {
- if (!this.isDisposed && !this.isPrimaryDisposed) {
- this.isPrimaryDisposed = true;
- if (this.count === 0) {
- this.isDisposed = true;
- this.underlyingDisposable.dispose();
- }
- }
- };
- RefCountDisposable.prototype.getDisposable = function() {
- return this.isDisposed ? disposableEmpty : new InnerDisposable(this);
- };
- return RefCountDisposable;
- })();
- function ScheduledDisposable(scheduler, disposable) {
- this.scheduler = scheduler;
- this.disposable = disposable;
- this.isDisposed = false;
- }
- function scheduleItem(s, self) {
- if (!self.isDisposed) {
- self.isDisposed = true;
- self.disposable.dispose();
- }
- }
- ScheduledDisposable.prototype.dispose = function() {
- this.scheduler.scheduleWithState(this, scheduleItem);
- };
- var ScheduledItem = Rx.internals.ScheduledItem = function(scheduler, state, action, dueTime, comparer) {
- this.scheduler = scheduler;
- this.state = state;
- this.action = action;
- this.dueTime = dueTime;
- this.comparer = comparer || defaultSubComparer;
- this.disposable = new SingleAssignmentDisposable();
- };
- ScheduledItem.prototype.invoke = function() {
- this.disposable.setDisposable(this.invokeCore());
- };
- ScheduledItem.prototype.compareTo = function(other) {
- return this.comparer(this.dueTime, other.dueTime);
- };
- ScheduledItem.prototype.isCancelled = function() {
- return this.disposable.isDisposed;
- };
- ScheduledItem.prototype.invokeCore = function() {
- return this.action(this.scheduler, this.state);
- };
- var Scheduler = Rx.Scheduler = (function() {
- function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) {
- this.now = now;
- this._schedule = schedule;
- this._scheduleRelative = scheduleRelative;
- this._scheduleAbsolute = scheduleAbsolute;
- }
- function invokeAction(scheduler, action) {
- action();
- return disposableEmpty;
- }
- var schedulerProto = Scheduler.prototype;
- schedulerProto.schedule = function(action) {
- return this._schedule(action, invokeAction);
- };
- schedulerProto.scheduleWithState = function(state, action) {
- return this._schedule(state, action);
- };
- schedulerProto.scheduleWithRelative = function(dueTime, action) {
- return this._scheduleRelative(action, dueTime, invokeAction);
- };
- schedulerProto.scheduleWithRelativeAndState = function(state, dueTime, action) {
- return this._scheduleRelative(state, dueTime, action);
- };
- schedulerProto.scheduleWithAbsolute = function(dueTime, action) {
- return this._scheduleAbsolute(action, dueTime, invokeAction);
- };
- schedulerProto.scheduleWithAbsoluteAndState = function(state, dueTime, action) {
- return this._scheduleAbsolute(state, dueTime, action);
- };
- Scheduler.now = defaultNow;
- Scheduler.normalize = function(timeSpan) {
- timeSpan < 0 && (timeSpan = 0);
- return timeSpan;
- };
- return Scheduler;
- }());
- var normalizeTime = Scheduler.normalize;
- (function(schedulerProto) {
- function invokeRecImmediate(scheduler, pair) {
- var state = pair[0],
- action = pair[1],
- group = new CompositeDisposable();
- function recursiveAction(state1) {
- action(state1, function(state2) {
- var isAdded = false,
- isDone = false,
- d = scheduler.scheduleWithState(state2, function(scheduler1, state3) {
- if (isAdded) {
- group.remove(d);
- } else {
- isDone = true;
- }
- recursiveAction(state3);
- return disposableEmpty;
- });
- if (!isDone) {
- group.add(d);
- isAdded = true;
- }
- });
- }
- recursiveAction(state);
- return group;
- }
- function invokeRecDate(scheduler, pair, method) {
- var state = pair[0],
- action = pair[1],
- group = new CompositeDisposable();
- function recursiveAction(state1) {
- action(state1, function(state2, dueTime1) {
- var isAdded = false,
- isDone = false,
- d = scheduler[method](state2, dueTime1, function(scheduler1, state3) {
- if (isAdded) {
- group.remove(d);
- } else {
- isDone = true;
- }
- recursiveAction(state3);
- return disposableEmpty;
- });
- if (!isDone) {
- group.add(d);
- isAdded = true;
- }
- });
- }
- ;
- recursiveAction(state);
- return group;
- }
- function scheduleInnerRecursive(action, self) {
- action(function(dt) {
- self(action, dt);
- });
- }
- schedulerProto.scheduleRecursive = function(action) {
- return this.scheduleRecursiveWithState(action, function(_action, self) {
- _action(function() {
- self(_action);
- });
- });
- };
- schedulerProto.scheduleRecursiveWithState = function(state, action) {
- return this.scheduleWithState([state, action], invokeRecImmediate);
- };
- schedulerProto.scheduleRecursiveWithRelative = function(dueTime, action) {
- return this.scheduleRecursiveWithRelativeAndState(action, dueTime, scheduleInnerRecursive);
- };
- schedulerProto.scheduleRecursiveWithRelativeAndState = function(state, dueTime, action) {
- return this._scheduleRelative([state, action], dueTime, function(s, p) {
- return invokeRecDate(s, p, 'scheduleWithRelativeAndState');
- });
- };
- schedulerProto.scheduleRecursiveWithAbsolute = function(dueTime, action) {
- return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, scheduleInnerRecursive);
- };
- schedulerProto.scheduleRecursiveWithAbsoluteAndState = function(state, dueTime, action) {
- return this._scheduleAbsolute([state, action], dueTime, function(s, p) {
- return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState');
- });
- };
- }(Scheduler.prototype));
- (function(schedulerProto) {
- Scheduler.prototype.schedulePeriodic = function(period, action) {
- return this.schedulePeriodicWithState(null, period, action);
- };
- Scheduler.prototype.schedulePeriodicWithState = function(state, period, action) {
- if (typeof root.setInterval === 'undefined') {
- throw new NotSupportedError();
- }
- period = normalizeTime(period);
- var s = state,
- id = root.setInterval(function() {
- s = action(s);
- }, period);
- return disposableCreate(function() {
- root.clearInterval(id);
- });
- };
- }(Scheduler.prototype));
- (function(schedulerProto) {
- schedulerProto.catchError = schedulerProto['catch'] = function(handler) {
- return new CatchScheduler(this, handler);
- };
- }(Scheduler.prototype));
- var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function() {
- function tick(command, recurse) {
- recurse(0, this._period);
- try {
- this._state = this._action(this._state);
- } catch (e) {
- this._cancel.dispose();
- throw e;
- }
- }
- function SchedulePeriodicRecursive(scheduler, state, period, action) {
- this._scheduler = scheduler;
- this._state = state;
- this._period = period;
- this._action = action;
- }
- SchedulePeriodicRecursive.prototype.start = function() {
- var d = new SingleAssignmentDisposable();
- this._cancel = d;
- d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this)));
- return d;
- };
- return SchedulePeriodicRecursive;
- }());
- var immediateScheduler = Scheduler.immediate = (function() {
- function scheduleNow(state, action) {
- return action(this, state);
- }
- return new Scheduler(defaultNow, scheduleNow, notSupported, notSupported);
- }());
- var currentThreadScheduler = Scheduler.currentThread = (function() {
- var queue;
- function runTrampoline() {
- while (queue.length > 0) {
- var item = queue.dequeue();
- !item.isCancelled() && item.invoke();
- }
- }
- function scheduleNow(state, action) {
- var si = new ScheduledItem(this, state, action, this.now());
- if (!queue) {
- queue = new PriorityQueue(4);
- queue.enqueue(si);
- var result = tryCatch(runTrampoline)();
- queue = null;
- if (result === errorObj) {
- return thrower(result.e);
- }
- } else {
- queue.enqueue(si);
- }
- return si.disposable;
- }
- var currentScheduler = new Scheduler(defaultNow, scheduleNow, notSupported, notSupported);
- currentScheduler.scheduleRequired = function() {
- return !queue;
- };
- return currentScheduler;
- }());
- var scheduleMethod,
- clearMethod;
- var localTimer = (function() {
- var localSetTimeout,
- localClearTimeout = noop;
- if (!!root.WScript) {
- localSetTimeout = function(fn, time) {
- root.WScript.Sleep(time);
- fn();
- };
- } else if (!!root.setTimeout) {
- localSetTimeout = root.setTimeout;
- localClearTimeout = root.clearTimeout;
- } else {
- throw new NotSupportedError();
- }
- return {
- setTimeout: localSetTimeout,
- clearTimeout: localClearTimeout
- };
- }());
- var localSetTimeout = localTimer.setTimeout,
- localClearTimeout = localTimer.clearTimeout;
- (function() {
- var nextHandle = 1,
- tasksByHandle = {},
- currentlyRunning = false;
- clearMethod = function(handle) {
- delete tasksByHandle[handle];
- };
- function runTask(handle) {
- if (currentlyRunning) {
- localSetTimeout(function() {
- runTask(handle);
- }, 0);
- } else {
- var task = tasksByHandle[handle];
- if (task) {
- currentlyRunning = true;
- var result = tryCatch(task)();
- clearMethod(handle);
- currentlyRunning = false;
- if (result === errorObj) {
- return thrower(result.e);
- }
- }
- }
- }
- var reNative = RegExp('^' + String(toString).replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/toString| for [^\]]+/g, '.*?') + '$');
- var setImmediate = typeof(setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && !reNative.test(setImmediate) && setImmediate;
- function postMessageSupported() {
- if (!root.postMessage || root.importScripts) {
- return false;
- }
- var isAsync = false,
- oldHandler = root.onmessage;
- root.onmessage = function() {
- isAsync = true;
- };
- root.postMessage('', '*');
- root.onmessage = oldHandler;
- return isAsync;
- }
- if (isFunction(setImmediate)) {
- scheduleMethod = function(action) {
- var id = nextHandle++;
- tasksByHandle[id] = action;
- setImmediate(function() {
- runTask(id);
- });
- return id;
- };
- } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
- scheduleMethod = function(action) {
- var id = nextHandle++;
- tasksByHandle[id] = action;
- process.nextTick(function() {
- runTask(id);
- });
- return id;
- };
- } else if (postMessageSupported()) {
- var MSG_PREFIX = 'ms.rx.schedule' + Math.random();
- function onGlobalPostMessage(event) {
- if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {
- runTask(event.data.substring(MSG_PREFIX.length));
- }
- }
- if (root.addEventListener) {
- root.addEventListener('message', onGlobalPostMessage, false);
- } else {
- root.attachEvent('onmessage', onGlobalPostMessage, false);
- }
- scheduleMethod = function(action) {
- var id = nextHandle++;
- tasksByHandle[id] = action;
- root.postMessage(MSG_PREFIX + currentId, '*');
- return id;
- };
- } else if (!!root.MessageChannel) {
- var channel = new root.MessageChannel();
- channel.port1.onmessage = function(e) {
- runTask(e.data);
- };
- scheduleMethod = function(action) {
- var id = nextHandle++;
- tasksByHandle[id] = action;
- channel.port2.postMessage(id);
- return id;
- };
- } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {
- scheduleMethod = function(action) {
- var scriptElement = root.document.createElement('script');
- var id = nextHandle++;
- tasksByHandle[id] = action;
- scriptElement.onreadystatechange = function() {
- runTask(id);
- scriptElement.onreadystatechange = null;
- scriptElement.parentNode.removeChild(scriptElement);
- scriptElement = null;
- };
- root.document.documentElement.appendChild(scriptElement);
- return id;
- };
- } else {
- scheduleMethod = function(action) {
- var id = nextHandle++;
- tasksByHandle[id] = action;
- localSetTimeout(function() {
- runTask(id);
- }, 0);
- return id;
- };
- }
- }());
- var timeoutScheduler = Scheduler.timeout = Scheduler.default = (function() {
- function scheduleNow(state, action) {
- var scheduler = this,
- disposable = new SingleAssignmentDisposable();
- var id = scheduleMethod(function() {
- if (!disposable.isDisposed) {
- disposable.setDisposable(action(scheduler, state));
- }
- });
- return new CompositeDisposable(disposable, disposableCreate(function() {
- clearMethod(id);
- }));
- }
- function scheduleRelative(state, dueTime, action) {
- var scheduler = this,
- dt = Scheduler.normalize(dueTime);
- if (dt === 0) {
- return scheduler.scheduleWithState(state, action);
- }
- var disposable = new SingleAssignmentDisposable();
- var id = localSetTimeout(function() {
- if (!disposable.isDisposed) {
- disposable.setDisposable(action(scheduler, state));
- }
- }, dt);
- return new CompositeDisposable(disposable, disposableCreate(function() {
- localClearTimeout(id);
- }));
- }
- function scheduleAbsolute(state, dueTime, action) {
- return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);
- }
- return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);
- })();
- var CatchScheduler = (function(__super__) {
- function scheduleNow(state, action) {
- return this._scheduler.scheduleWithState(state, this._wrap(action));
- }
- function scheduleRelative(state, dueTime, action) {
- return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action));
- }
- function scheduleAbsolute(state, dueTime, action) {
- return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action));
- }
- inherits(CatchScheduler, __super__);
- function CatchScheduler(scheduler, handler) {
- this._scheduler = scheduler;
- this._handler = handler;
- this._recursiveOriginal = null;
- this._recursiveWrapper = null;
- __super__.call(this, this._scheduler.now.bind(this._scheduler), scheduleNow, scheduleRelative, scheduleAbsolute);
- }
- CatchScheduler.prototype._clone = function(scheduler) {
- return new CatchScheduler(scheduler, this._handler);
- };
- CatchScheduler.prototype._wrap = function(action) {
- var parent = this;
- return function(self, state) {
- try {
- return action(parent._getRecursiveWrapper(self), state);
- } catch (e) {
- if (!parent._handler(e)) {
- throw e;
- }
- return disposableEmpty;
- }
- };
- };
- CatchScheduler.prototype._getRecursiveWrapper = function(scheduler) {
- if (this._recursiveOriginal !== scheduler) {
- this._recursiveOriginal = scheduler;
- var wrapper = this._clone(scheduler);
- wrapper._recursiveOriginal = scheduler;
- wrapper._recursiveWrapper = wrapper;
- this._recursiveWrapper = wrapper;
- }
- return this._recursiveWrapper;
- };
- CatchScheduler.prototype.schedulePeriodicWithState = function(state, period, action) {
- var self = this,
- failed = false,
- d = new SingleAssignmentDisposable();
- d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function(state1) {
- if (failed) {
- return null;
- }
- try {
- return action(state1);
- } catch (e) {
- failed = true;
- if (!self._handler(e)) {
- throw e;
- }
- d.dispose();
- return null;
- }
- }));
- return d;
- };
- return CatchScheduler;
- }(Scheduler));
- var Notification = Rx.Notification = (function() {
- function Notification(kind, value, exception, accept, acceptObservable, toString) {
- this.kind = kind;
- this.value = value;
- this.exception = exception;
- this._accept = accept;
- this._acceptObservable = acceptObservable;
- this.toString = toString;
- }
- Notification.prototype.accept = function(observerOrOnNext, onError, onCompleted) {
- return observerOrOnNext && typeof observerOrOnNext === 'object' ? this._acceptObservable(observerOrOnNext) : this._accept(observerOrOnNext, onError, onCompleted);
- };
- Notification.prototype.toObservable = function(scheduler) {
- var self = this;
- isScheduler(scheduler) || (scheduler = immediateScheduler);
- return new AnonymousObservable(function(observer) {
- return scheduler.scheduleWithState(self, function(_, notification) {
- notification._acceptObservable(observer);
- notification.kind === 'N' && observer.onCompleted();
- });
- });
- };
- return Notification;
- })();
- var notificationCreateOnNext = Notification.createOnNext = (function() {
- function _accept(onNext) {
- return onNext(this.value);
- }
- function _acceptObservable(observer) {
- return observer.onNext(this.value);
- }
- function toString() {
- return 'OnNext(' + this.value + ')';
- }
- return function(value) {
- return new Notification('N', value, null, _accept, _acceptObservable, toString);
- };
- }());
- var notificationCreateOnError = Notification.createOnError = (function() {
- function _accept(onNext, onError) {
- return onError(this.exception);
- }
- function _acceptObservable(observer) {
- return observer.onError(this.exception);
- }
- function toString() {
- return 'OnError(' + this.exception + ')';
- }
- return function(e) {
- return new Notification('E', null, e, _accept, _acceptObservable, toString);
- };
- }());
- var notificationCreateOnCompleted = Notification.createOnCompleted = (function() {
- function _accept(onNext, onError, onCompleted) {
- return onCompleted();
- }
- function _acceptObservable(observer) {
- return observer.onCompleted();
- }
- function toString() {
- return 'OnCompleted()';
- }
- return function() {
- return new Notification('C', null, null, _accept, _acceptObservable, toString);
- };
- }());
- var Enumerator = Rx.internals.Enumerator = function(next) {
- this._next = next;
- };
- Enumerator.prototype.next = function() {
- return this._next();
- };
- Enumerator.prototype[$iterator$] = function() {
- return this;
- };
- var Enumerable = Rx.internals.Enumerable = function(iterator) {
- this._iterator = iterator;
- };
- Enumerable.prototype[$iterator$] = function() {
- return this._iterator();
- };
- Enumerable.prototype.concat = function() {
- var sources = this;
- return new AnonymousObservable(function(o) {
- var e = sources[$iterator$]();
- var isDisposed,
- subscription = new SerialDisposable();
- var cancelable = immediateScheduler.scheduleRecursive(function(self) {
- if (isDisposed) {
- return ;
- }
- try {
- var currentItem = e.next();
- } catch (ex) {
- return o.onError(ex);
- }
- if (currentItem.done) {
- return o.onCompleted();
- }
- var currentValue = currentItem.value;
- isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));
- var d = new SingleAssignmentDisposable();
- subscription.setDisposable(d);
- d.setDisposable(currentValue.subscribe(function(x) {
- o.onNext(x);
- }, function(err) {
- o.onError(err);
- }, self));
- });
- return new CompositeDisposable(subscription, cancelable, disposableCreate(function() {
- isDisposed = true;
- }));
- });
- };
- Enumerable.prototype.catchError = function() {
- var sources = this;
- return new AnonymousObservable(function(o) {
- var e = sources[$iterator$]();
- var isDisposed,
- subscription = new SerialDisposable();
- var cancelable = immediateScheduler.scheduleRecursiveWithState(null, function(lastException, self) {
- if (isDisposed) {
- return ;
- }
- try {
- var currentItem = e.next();
- } catch (ex) {
- return observer.onError(ex);
- }
- if (currentItem.done) {
- if (lastException !== null) {
- o.onError(lastException);
- } else {
- o.onCompleted();
- }
- return ;
- }
- var currentValue = currentItem.value;
- isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));
- var d = new SingleAssignmentDisposable();
- subscription.setDisposable(d);
- d.setDisposable(currentValue.subscribe(function(x) {
- o.onNext(x);
- }, self, function() {
- o.onCompleted();
- }));
- });
- return new CompositeDisposable(subscription, cancelable, disposableCreate(function() {
- isDisposed = true;
- }));
- });
- };
- Enumerable.prototype.catchErrorWhen = function(notificationHandler) {
- var sources = this;
- return new AnonymousObservable(function(o) {
- var exceptions = new Subject(),
- notifier = new Subject(),
- handled = notificationHandler(exceptions),
- notificationDisposable = handled.subscribe(notifier);
- var e = sources[$iterator$]();
- var isDisposed,
- lastException,
- subscription = new SerialDisposable();
- var cancelable = immediateScheduler.scheduleRecursive(function(self) {
- if (isDisposed) {
- return ;
- }
- try {
- var currentItem = e.next();
- } catch (ex) {
- return o.onError(ex);
- }
- if (currentItem.done) {
- if (lastException) {
- o.onError(lastException);
- } else {
- o.onCompleted();
- }
- return ;
- }
- var currentValue = currentItem.value;
- isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));
- var outer = new SingleAssignmentDisposable();
- var inner = new SingleAssignmentDisposable();
- subscription.setDisposable(new CompositeDisposable(inner, outer));
- outer.setDisposable(currentValue.subscribe(function(x) {
- o.onNext(x);
- }, function(exn) {
- inner.setDisposable(notifier.subscribe(self, function(ex) {
- o.onError(ex);
- }, function() {
- o.onCompleted();
- }));
- exceptions.onNext(exn);
- }, function() {
- o.onCompleted();
- }));
- });
- return new CompositeDisposable(notificationDisposable, subscription, cancelable, disposableCreate(function() {
- isDisposed = true;
- }));
- });
- };
- var enumerableRepeat = Enumerable.repeat = function(value, repeatCount) {
- if (repeatCount == null) {
- repeatCount = -1;
- }
- return new Enumerable(function() {
- var left = repeatCount;
- return new Enumerator(function() {
- if (left === 0) {
- return doneEnumerator;
- }
- if (left > 0) {
- left--;
- }
- return {
- done: false,
- value: value
- };
- });
- });
- };
- var enumerableOf = Enumerable.of = function(source, selector, thisArg) {
- if (selector) {
- var selectorFn = bindCallback(selector, thisArg, 3);
- }
- return new Enumerable(function() {
- var index = -1;
- return new Enumerator(function() {
- return ++index < source.length ? {
- done: false,
- value: !selector ? source[index] : selectorFn(source[index], index, source)
- } : doneEnumerator;
- });
- });
- };
- var Observer = Rx.Observer = function() {};
- Observer.prototype.toNotifier = function() {
- var observer = this;
- return function(n) {
- return n.accept(observer);
- };
- };
- Observer.prototype.asObserver = function() {
- return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this));
- };
- Observer.prototype.checked = function() {
- return new CheckedObserver(this);
- };
- var observerCreate = Observer.create = function(onNext, onError, onCompleted) {
- onNext || (onNext = noop);
- onError || (onError = defaultError);
- onCompleted || (onCompleted = noop);
- return new AnonymousObserver(onNext, onError, onCompleted);
- };
- Observer.fromNotifier = function(handler, thisArg) {
- return new AnonymousObserver(function(x) {
- return handler.call(thisArg, notificationCreateOnNext(x));
- }, function(e) {
- return handler.call(thisArg, notificationCreateOnError(e));
- }, function() {
- return handler.call(thisArg, notificationCreateOnCompleted());
- });
- };
- Observer.prototype.notifyOn = function(scheduler) {
- return new ObserveOnObserver(scheduler, this);
- };
- Observer.prototype.makeSafe = function(disposable) {
- return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);
- };
- var AbstractObserver = Rx.internals.AbstractObserver = (function(__super__) {
- inherits(AbstractObserver, __super__);
- function AbstractObserver() {
- this.isStopped = false;
- __super__.call(this);
- }
- AbstractObserver.prototype.next = notImplemented;
- AbstractObserver.prototype.error = notImplemented;
- AbstractObserver.prototype.completed = notImplemented;
- AbstractObserver.prototype.onNext = function(value) {
- if (!this.isStopped) {
- this.next(value);
- }
- };
- AbstractObserver.prototype.onError = function(error) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.error(error);
- }
- };
- AbstractObserver.prototype.onCompleted = function() {
- if (!this.isStopped) {
- this.isStopped = true;
- this.completed();
- }
- };
- AbstractObserver.prototype.dispose = function() {
- this.isStopped = true;
- };
- AbstractObserver.prototype.fail = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.error(e);
- return true;
- }
- return false;
- };
- return AbstractObserver;
- }(Observer));
- var AnonymousObserver = Rx.AnonymousObserver = (function(__super__) {
- inherits(AnonymousObserver, __super__);
- function AnonymousObserver(onNext, onError, onCompleted) {
- __super__.call(this);
- this._onNext = onNext;
- this._onError = onError;
- this._onCompleted = onCompleted;
- }
- AnonymousObserver.prototype.next = function(value) {
- this._onNext(value);
- };
- AnonymousObserver.prototype.error = function(error) {
- this._onError(error);
- };
- AnonymousObserver.prototype.completed = function() {
- this._onCompleted();
- };
- return AnonymousObserver;
- }(AbstractObserver));
- var CheckedObserver = (function(__super__) {
- inherits(CheckedObserver, __super__);
- function CheckedObserver(observer) {
- __super__.call(this);
- this._observer = observer;
- this._state = 0;
- }
- var CheckedObserverPrototype = CheckedObserver.prototype;
- CheckedObserverPrototype.onNext = function(value) {
- this.checkAccess();
- var res = tryCatch(this._observer.onNext).call(this._observer, value);
- this._state = 0;
- res === errorObj && thrower(res.e);
- };
- CheckedObserverPrototype.onError = function(err) {
- this.checkAccess();
- var res = tryCatch(this._observer.onError).call(this._observer, err);
- this._state = 2;
- res === errorObj && thrower(res.e);
- };
- CheckedObserverPrototype.onCompleted = function() {
- this.checkAccess();
- var res = tryCatch(this._observer.onCompleted).call(this._observer);
- this._state = 2;
- res === errorObj && thrower(res.e);
- };
- CheckedObserverPrototype.checkAccess = function() {
- if (this._state === 1) {
- throw new Error('Re-entrancy detected');
- }
- if (this._state === 2) {
- throw new Error('Observer completed');
- }
- if (this._state === 0) {
- this._state = 1;
- }
- };
- return CheckedObserver;
- }(Observer));
- var ScheduledObserver = Rx.internals.ScheduledObserver = (function(__super__) {
- inherits(ScheduledObserver, __super__);
- function ScheduledObserver(scheduler, observer) {
- __super__.call(this);
- this.scheduler = scheduler;
- this.observer = observer;
- this.isAcquired = false;
- this.hasFaulted = false;
- this.queue = [];
- this.disposable = new SerialDisposable();
- }
- ScheduledObserver.prototype.next = function(value) {
- var self = this;
- this.queue.push(function() {
- self.observer.onNext(value);
- });
- };
- ScheduledObserver.prototype.error = function(e) {
- var self = this;
- this.queue.push(function() {
- self.observer.onError(e);
- });
- };
- ScheduledObserver.prototype.completed = function() {
- var self = this;
- this.queue.push(function() {
- self.observer.onCompleted();
- });
- };
- ScheduledObserver.prototype.ensureActive = function() {
- var isOwner = false,
- parent = this;
- if (!this.hasFaulted && this.queue.length > 0) {
- isOwner = !this.isAcquired;
- this.isAcquired = true;
- }
- if (isOwner) {
- this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(self) {
- var work;
- if (parent.queue.length > 0) {
- work = parent.queue.shift();
- } else {
- parent.isAcquired = false;
- return ;
- }
- try {
- work();
- } catch (ex) {
- parent.queue = [];
- parent.hasFaulted = true;
- throw ex;
- }
- self();
- }));
- }
- };
- ScheduledObserver.prototype.dispose = function() {
- __super__.prototype.dispose.call(this);
- this.disposable.dispose();
- };
- return ScheduledObserver;
- }(AbstractObserver));
- var ObserveOnObserver = (function(__super__) {
- inherits(ObserveOnObserver, __super__);
- function ObserveOnObserver(scheduler, observer, cancel) {
- __super__.call(this, scheduler, observer);
- this._cancel = cancel;
- }
- ObserveOnObserver.prototype.next = function(value) {
- __super__.prototype.next.call(this, value);
- this.ensureActive();
- };
- ObserveOnObserver.prototype.error = function(e) {
- __super__.prototype.error.call(this, e);
- this.ensureActive();
- };
- ObserveOnObserver.prototype.completed = function() {
- __super__.prototype.completed.call(this);
- this.ensureActive();
- };
- ObserveOnObserver.prototype.dispose = function() {
- __super__.prototype.dispose.call(this);
- this._cancel && this._cancel.dispose();
- this._cancel = null;
- };
- return ObserveOnObserver;
- })(ScheduledObserver);
- var observableProto;
- var Observable = Rx.Observable = (function() {
- function Observable(subscribe) {
- if (Rx.config.longStackSupport && hasStacks) {
- try {
- throw new Error();
- } catch (e) {
- this.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
- }
- var self = this;
- this._subscribe = function(observer) {
- var oldOnError = observer.onError.bind(observer);
- observer.onError = function(err) {
- makeStackTraceLong(err, self);
- oldOnError(err);
- };
- return subscribe.call(self, observer);
- };
- } else {
- this._subscribe = subscribe;
- }
- }
- observableProto = Observable.prototype;
- observableProto.subscribe = observableProto.forEach = function(observerOrOnNext, onError, onCompleted) {
- return this._subscribe(typeof observerOrOnNext === 'object' ? observerOrOnNext : observerCreate(observerOrOnNext, onError, onCompleted));
- };
- observableProto.subscribeOnNext = function(onNext, thisArg) {
- return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) {
- onNext.call(thisArg, x);
- } : onNext));
- };
- observableProto.subscribeOnError = function(onError, thisArg) {
- return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) {
- onError.call(thisArg, e);
- } : onError));
- };
- observableProto.subscribeOnCompleted = function(onCompleted, thisArg) {
- return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() {
- onCompleted.call(thisArg);
- } : onCompleted));
- };
- return Observable;
- })();
- var ObservableBase = Rx.ObservableBase = (function(__super__) {
- inherits(ObservableBase, __super__);
- function fixSubscriber(subscriber) {
- return subscriber && isFunction(subscriber.dispose) ? subscriber : isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;
- }
- function setDisposable(s, state) {
- var ado = state[0],
- self = state[1];
- var sub = tryCatch(self.subscribeCore).call(self, ado);
- if (sub === errorObj) {
- if (!ado.fail(errorObj.e)) {
- return thrower(errorObj.e);
- }
- }
- ado.setDisposable(fixSubscriber(sub));
- }
- function subscribe(observer) {
- var ado = new AutoDetachObserver(observer),
- state = [ado, this];
- if (currentThreadScheduler.scheduleRequired()) {
- currentThreadScheduler.scheduleWithState(state, setDisposable);
- } else {
- setDisposable(null, state);
- }
- return ado;
- }
- function ObservableBase() {
- __super__.call(this, subscribe);
- }
- ObservableBase.prototype.subscribeCore = notImplemented;
- return ObservableBase;
- }(Observable));
- observableProto.observeOn = function(scheduler) {
- var source = this;
- return new AnonymousObservable(function(observer) {
- return source.subscribe(new ObserveOnObserver(scheduler, observer));
- }, source);
- };
- observableProto.subscribeOn = function(scheduler) {
- var source = this;
- return new AnonymousObservable(function(observer) {
- var m = new SingleAssignmentDisposable(),
- d = new SerialDisposable();
- d.setDisposable(m);
- m.setDisposable(scheduler.schedule(function() {
- d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer)));
- }));
- return d;
- }, source);
- };
- var observableFromPromise = Observable.fromPromise = function(promise) {
- return observableDefer(function() {
- var subject = new Rx.AsyncSubject();
- promise.then(function(value) {
- subject.onNext(value);
- subject.onCompleted();
- }, subject.onError.bind(subject));
- return subject;
- });
- };
- observableProto.toPromise = function(promiseCtor) {
- promiseCtor || (promiseCtor = Rx.config.Promise);
- if (!promiseCtor) {
- throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise');
- }
- var source = this;
- return new promiseCtor(function(resolve, reject) {
- var value,
- hasValue = false;
- source.subscribe(function(v) {
- value = v;
- hasValue = true;
- }, reject, function() {
- hasValue && resolve(value);
- });
- });
- };
- var ToArrayObservable = (function(__super__) {
- inherits(ToArrayObservable, __super__);
- function ToArrayObservable(source) {
- this.source = source;
- __super__.call(this);
- }
- ToArrayObservable.prototype.subscribeCore = function(observer) {
- return this.source.subscribe(new ToArrayObserver(observer));
- };
- return ToArrayObservable;
- }(ObservableBase));
- function ToArrayObserver(observer) {
- this.observer = observer;
- this.a = [];
- this.isStopped = false;
- }
- ToArrayObserver.prototype.onNext = function(x) {
- if (!this.isStopped) {
- this.a.push(x);
- }
- };
- ToArrayObserver.prototype.onError = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onError(e);
- }
- };
- ToArrayObserver.prototype.onCompleted = function() {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onNext(this.a);
- this.observer.onCompleted();
- }
- };
- ToArrayObserver.prototype.dispose = function() {
- this.isStopped = true;
- };
- ToArrayObserver.prototype.fail = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onError(e);
- return true;
- }
- return false;
- };
- observableProto.toArray = function() {
- return new ToArrayObservable(this);
- };
- Observable.create = Observable.createWithDisposable = function(subscribe, parent) {
- return new AnonymousObservable(subscribe, parent);
- };
- var observableDefer = Observable.defer = function(observableFactory) {
- return new AnonymousObservable(function(observer) {
- var result;
- try {
- result = observableFactory();
- } catch (e) {
- return observableThrow(e).subscribe(observer);
- }
- isPromise(result) && (result = observableFromPromise(result));
- return result.subscribe(observer);
- });
- };
- var observableEmpty = Observable.empty = function(scheduler) {
- isScheduler(scheduler) || (scheduler = immediateScheduler);
- return new AnonymousObservable(function(observer) {
- return scheduler.scheduleWithState(null, function() {
- observer.onCompleted();
- });
- });
- };
- var FromObservable = (function(__super__) {
- inherits(FromObservable, __super__);
- function FromObservable(iterable, mapper, scheduler) {
- this.iterable = iterable;
- this.mapper = mapper;
- this.scheduler = scheduler;
- __super__.call(this);
- }
- FromObservable.prototype.subscribeCore = function(observer) {
- var sink = new FromSink(observer, this);
- return sink.run();
- };
- return FromObservable;
- }(ObservableBase));
- var FromSink = (function() {
- function FromSink(observer, parent) {
- this.observer = observer;
- this.parent = parent;
- }
- FromSink.prototype.run = function() {
- var list = Object(this.parent.iterable),
- it = getIterable(list),
- observer = this.observer,
- mapper = this.parent.mapper;
- function loopRecursive(i, recurse) {
- try {
- var next = it.next();
- } catch (e) {
- return observer.onError(e);
- }
- if (next.done) {
- return observer.onCompleted();
- }
- var result = next.value;
- if (mapper) {
- try {
- result = mapper(result, i);
- } catch (e) {
- return observer.onError(e);
- }
- }
- observer.onNext(result);
- recurse(i + 1);
- }
- return this.parent.scheduler.scheduleRecursiveWithState(0, loopRecursive);
- };
- return FromSink;
- }());
- var maxSafeInteger = Math.pow(2, 53) - 1;
- function StringIterable(str) {
- this._s = s;
- }
- StringIterable.prototype[$iterator$] = function() {
- return new StringIterator(this._s);
- };
- function StringIterator(str) {
- this._s = s;
- this._l = s.length;
- this._i = 0;
- }
- StringIterator.prototype[$iterator$] = function() {
- return this;
- };
- StringIterator.prototype.next = function() {
- return this._i < this._l ? {
- done: false,
- value: this._s.charAt(this._i++)
- } : doneEnumerator;
- };
- function ArrayIterable(a) {
- this._a = a;
- }
- ArrayIterable.prototype[$iterator$] = function() {
- return new ArrayIterator(this._a);
- };
- function ArrayIterator(a) {
- this._a = a;
- this._l = toLength(a);
- this._i = 0;
- }
- ArrayIterator.prototype[$iterator$] = function() {
- return this;
- };
- ArrayIterator.prototype.next = function() {
- return this._i < this._l ? {
- done: false,
- value: this._a[this._i++]
- } : doneEnumerator;
- };
- function numberIsFinite(value) {
- return typeof value === 'number' && root.isFinite(value);
- }
- function isNan(n) {
- return n !== n;
- }
- function getIterable(o) {
- var i = o[$iterator$],
- it;
- if (!i && typeof o === 'string') {
- it = new StringIterable(o);
- return it[$iterator$]();
- }
- if (!i && o.length !== undefined) {
- it = new ArrayIterable(o);
- return it[$iterator$]();
- }
- if (!i) {
- throw new TypeError('Object is not iterable');
- }
- return o[$iterator$]();
- }
- function sign(value) {
- var number = +value;
- if (number === 0) {
- return number;
- }
- if (isNaN(number)) {
- return number;
- }
- return number < 0 ? -1 : 1;
- }
- function toLength(o) {
- var len = +o.length;
- if (isNaN(len)) {
- return 0;
- }
- if (len === 0 || !numberIsFinite(len)) {
- return len;
- }
- len = sign(len) * Math.floor(Math.abs(len));
- if (len <= 0) {
- return 0;
- }
- if (len > maxSafeInteger) {
- return maxSafeInteger;
- }
- return len;
- }
- var observableFrom = Observable.from = function(iterable, mapFn, thisArg, scheduler) {
- if (iterable == null) {
- throw new Error('iterable cannot be null.');
- }
- if (mapFn && !isFunction(mapFn)) {
- throw new Error('mapFn when provided must be a function');
- }
- if (mapFn) {
- var mapper = bindCallback(mapFn, thisArg, 2);
- }
- isScheduler(scheduler) || (scheduler = currentThreadScheduler);
- return new FromObservable(iterable, mapper, scheduler);
- };
- var FromArrayObservable = (function(__super__) {
- inherits(FromArrayObservable, __super__);
- function FromArrayObservable(args, scheduler) {
- this.args = args;
- this.scheduler = scheduler;
- __super__.call(this);
- }
- FromArrayObservable.prototype.subscribeCore = function(observer) {
- var sink = new FromArraySink(observer, this);
- return sink.run();
- };
- return FromArrayObservable;
- }(ObservableBase));
- function FromArraySink(observer, parent) {
- this.observer = observer;
- this.parent = parent;
- }
- FromArraySink.prototype.run = function() {
- var observer = this.observer,
- args = this.parent.args,
- len = args.length;
- function loopRecursive(i, recurse) {
- if (i < len) {
- observer.onNext(args[i]);
- recurse(i + 1);
- } else {
- observer.onCompleted();
- }
- }
- return this.parent.scheduler.scheduleRecursiveWithState(0, loopRecursive);
- };
- var observableFromArray = Observable.fromArray = function(array, scheduler) {
- isScheduler(scheduler) || (scheduler = currentThreadScheduler);
- return new FromArrayObservable(array, scheduler);
- };
- Observable.generate = function(initialState, condition, iterate, resultSelector, scheduler) {
- isScheduler(scheduler) || (scheduler = currentThreadScheduler);
- return new AnonymousObservable(function(o) {
- var first = true;
- return scheduler.scheduleRecursiveWithState(initialState, function(state, self) {
- var hasResult,
- result;
- try {
- if (first) {
- first = false;
- } else {
- state = iterate(state);
- }
- hasResult = condition(state);
- hasResult && (result = resultSelector(state));
- } catch (e) {
- return o.onError(e);
- }
- if (hasResult) {
- o.onNext(result);
- self(state);
- } else {
- o.onCompleted();
- }
- });
- });
- };
- function observableOf(scheduler, array) {
- isScheduler(scheduler) || (scheduler = currentThreadScheduler);
- return new FromArrayObservable(array, scheduler);
- }
- Observable.of = function() {
- var len = arguments.length,
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- return new FromArrayObservable(args, currentThreadScheduler);
- };
- Observable.ofWithScheduler = function(scheduler) {
- var len = arguments.length,
- args = new Array(len - 1);
- for (var i = 1; i < len; i++) {
- args[i - 1] = arguments[i];
- }
- return new FromArrayObservable(args, scheduler);
- };
- Observable.ofArrayChanges = function(array) {
- if (!Array.isArray(array)) {
- throw new TypeError('Array.observe only accepts arrays.');
- }
- if (typeof Array.observe !== 'function' && typeof Array.unobserve !== 'function') {
- throw new TypeError('Array.observe is not supported on your platform');
- }
- return new AnonymousObservable(function(observer) {
- function observerFn(changes) {
- for (var i = 0,
- len = changes.length; i < len; i++) {
- observer.onNext(changes[i]);
- }
- }
- Array.observe(array, observerFn);
- return function() {
- Array.unobserve(array, observerFn);
- };
- });
- };
- Observable.ofObjectChanges = function(obj) {
- if (obj == null) {
- throw new TypeError('object must not be null or undefined.');
- }
- if (typeof Object.observe !== 'function' && typeof Object.unobserve !== 'function') {
- throw new TypeError('Array.observe is not supported on your platform');
- }
- return new AnonymousObservable(function(observer) {
- function observerFn(changes) {
- for (var i = 0,
- len = changes.length; i < len; i++) {
- observer.onNext(changes[i]);
- }
- }
- Object.observe(obj, observerFn);
- return function() {
- Object.unobserve(obj, observerFn);
- };
- });
- };
- var observableNever = Observable.never = function() {
- return new AnonymousObservable(function() {
- return disposableEmpty;
- });
- };
- Observable.pairs = function(obj, scheduler) {
- scheduler || (scheduler = Rx.Scheduler.currentThread);
- return new AnonymousObservable(function(observer) {
- var keys = Object.keys(obj),
- len = keys.length;
- return scheduler.scheduleRecursiveWithState(0, function(idx, self) {
- if (idx < len) {
- var key = keys[idx];
- observer.onNext([key, obj[key]]);
- self(idx + 1);
- } else {
- observer.onCompleted();
- }
- });
- });
- };
- var RangeObservable = (function(__super__) {
- inherits(RangeObservable, __super__);
- function RangeObservable(start, count, scheduler) {
- this.start = start;
- this.count = count;
- this.scheduler = scheduler;
- __super__.call(this);
- }
- RangeObservable.prototype.subscribeCore = function(observer) {
- var sink = new RangeSink(observer, this);
- return sink.run();
- };
- return RangeObservable;
- }(ObservableBase));
- var RangeSink = (function() {
- function RangeSink(observer, parent) {
- this.observer = observer;
- this.parent = parent;
- }
- RangeSink.prototype.run = function() {
- var start = this.parent.start,
- count = this.parent.count,
- observer = this.observer;
- function loopRecursive(i, recurse) {
- if (i < count) {
- observer.onNext(start + i);
- recurse(i + 1);
- } else {
- observer.onCompleted();
- }
- }
- return this.parent.scheduler.scheduleRecursiveWithState(0, loopRecursive);
- };
- return RangeSink;
- }());
- Observable.range = function(start, count, scheduler) {
- isScheduler(scheduler) || (scheduler = currentThreadScheduler);
- return new RangeObservable(start, count, scheduler);
- };
- Observable.repeat = function(value, repeatCount, scheduler) {
- isScheduler(scheduler) || (scheduler = currentThreadScheduler);
- return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);
- };
- var observableReturn = Observable['return'] = Observable.just = Observable.returnValue = function(value, scheduler) {
- isScheduler(scheduler) || (scheduler = immediateScheduler);
- return new AnonymousObservable(function(o) {
- return scheduler.scheduleWithState(value, function(_, v) {
- o.onNext(v);
- o.onCompleted();
- });
- });
- };
- var observableThrow = Observable['throw'] = Observable.throwError = function(error, scheduler) {
- isScheduler(scheduler) || (scheduler = immediateScheduler);
- return new AnonymousObservable(function(observer) {
- return scheduler.schedule(function() {
- observer.onError(error);
- });
- });
- };
- Observable.throwException = function() {
- return Observable.throwError.apply(null, arguments);
- };
- Observable.using = function(resourceFactory, observableFactory) {
- return new AnonymousObservable(function(observer) {
- var disposable = disposableEmpty,
- resource,
- source;
- try {
- resource = resourceFactory();
- resource && (disposable = resource);
- source = observableFactory(resource);
- } catch (exception) {
- return new CompositeDisposable(observableThrow(exception).subscribe(observer), disposable);
- }
- return new CompositeDisposable(source.subscribe(observer), disposable);
- });
- };
- observableProto.amb = function(rightSource) {
- var leftSource = this;
- return new AnonymousObservable(function(observer) {
- var choice,
- leftChoice = 'L',
- rightChoice = 'R',
- leftSubscription = new SingleAssignmentDisposable(),
- rightSubscription = new SingleAssignmentDisposable();
- isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));
- function choiceL() {
- if (!choice) {
- choice = leftChoice;
- rightSubscription.dispose();
- }
- }
- function choiceR() {
- if (!choice) {
- choice = rightChoice;
- leftSubscription.dispose();
- }
- }
- leftSubscription.setDisposable(leftSource.subscribe(function(left) {
- choiceL();
- if (choice === leftChoice) {
- observer.onNext(left);
- }
- }, function(err) {
- choiceL();
- if (choice === leftChoice) {
- observer.onError(err);
- }
- }, function() {
- choiceL();
- if (choice === leftChoice) {
- observer.onCompleted();
- }
- }));
- rightSubscription.setDisposable(rightSource.subscribe(function(right) {
- choiceR();
- if (choice === rightChoice) {
- observer.onNext(right);
- }
- }, function(err) {
- choiceR();
- if (choice === rightChoice) {
- observer.onError(err);
- }
- }, function() {
- choiceR();
- if (choice === rightChoice) {
- observer.onCompleted();
- }
- }));
- return new CompositeDisposable(leftSubscription, rightSubscription);
- });
- };
- Observable.amb = function() {
- var acc = observableNever(),
- items = [];
- if (Array.isArray(arguments[0])) {
- items = arguments[0];
- } else {
- for (var i = 0,
- len = arguments.length; i < len; i++) {
- items.push(arguments[i]);
- }
- }
- function func(previous, current) {
- return previous.amb(current);
- }
- for (var i = 0,
- len = items.length; i < len; i++) {
- acc = func(acc, items[i]);
- }
- return acc;
- };
- function observableCatchHandler(source, handler) {
- return new AnonymousObservable(function(o) {
- var d1 = new SingleAssignmentDisposable(),
- subscription = new SerialDisposable();
- subscription.setDisposable(d1);
- d1.setDisposable(source.subscribe(function(x) {
- o.onNext(x);
- }, function(e) {
- try {
- var result = handler(e);
- } catch (ex) {
- return o.onError(ex);
- }
- isPromise(result) && (result = observableFromPromise(result));
- var d = new SingleAssignmentDisposable();
- subscription.setDisposable(d);
- d.setDisposable(result.subscribe(o));
- }, function(x) {
- o.onCompleted(x);
- }));
- return subscription;
- }, source);
- }
- observableProto['catch'] = observableProto.catchError = observableProto.catchException = function(handlerOrSecond) {
- return typeof handlerOrSecond === 'function' ? observableCatchHandler(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);
- };
- var observableCatch = Observable.catchError = Observable['catch'] = Observable.catchException = function() {
- var items = [];
- if (Array.isArray(arguments[0])) {
- items = arguments[0];
- } else {
- for (var i = 0,
- len = arguments.length; i < len; i++) {
- items.push(arguments[i]);
- }
- }
- return enumerableOf(items).catchError();
- };
- observableProto.combineLatest = function() {
- var len = arguments.length,
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- if (Array.isArray(args[0])) {
- args[0].unshift(this);
- } else {
- args.unshift(this);
- }
- return combineLatest.apply(this, args);
- };
- var combineLatest = Observable.combineLatest = function() {
- var len = arguments.length,
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- var resultSelector = args.pop();
- Array.isArray(args[0]) && (args = args[0]);
- return new AnonymousObservable(function(o) {
- var n = args.length,
- falseFactory = function() {
- return false;
- },
- hasValue = arrayInitialize(n, falseFactory),
- hasValueAll = false,
- isDone = arrayInitialize(n, falseFactory),
- values = new Array(n);
- function next(i) {
- hasValue[i] = true;
- if (hasValueAll || (hasValueAll = hasValue.every(identity))) {
- try {
- var res = resultSelector.apply(null, values);
- } catch (e) {
- return o.onError(e);
- }
- o.onNext(res);
- } else if (isDone.filter(function(x, j) {
- return j !== i;
- }).every(identity)) {
- o.onCompleted();
- }
- }
- function done(i) {
- isDone[i] = true;
- isDone.every(identity) && o.onCompleted();
- }
- var subscriptions = new Array(n);
- for (var idx = 0; idx < n; idx++) {
- (function(i) {
- var source = args[i],
- sad = new SingleAssignmentDisposable();
- isPromise(source) && (source = observableFromPromise(source));
- sad.setDisposable(source.subscribe(function(x) {
- values[i] = x;
- next(i);
- }, function(e) {
- o.onError(e);
- }, function() {
- done(i);
- }));
- subscriptions[i] = sad;
- }(idx));
- }
- return new CompositeDisposable(subscriptions);
- }, this);
- };
- observableProto.concat = function() {
- for (var args = [],
- i = 0,
- len = arguments.length; i < len; i++) {
- args.push(arguments[i]);
- }
- args.unshift(this);
- return observableConcat.apply(null, args);
- };
- var observableConcat = Observable.concat = function() {
- var args;
- if (Array.isArray(arguments[0])) {
- args = arguments[0];
- } else {
- args = new Array(arguments.length);
- for (var i = 0,
- len = arguments.length; i < len; i++) {
- args[i] = arguments[i];
- }
- }
- return enumerableOf(args).concat();
- };
- observableProto.concatAll = observableProto.concatObservable = function() {
- return this.merge(1);
- };
- var MergeObservable = (function(__super__) {
- inherits(MergeObservable, __super__);
- function MergeObservable(source, maxConcurrent) {
- this.source = source;
- this.maxConcurrent = maxConcurrent;
- __super__.call(this);
- }
- MergeObservable.prototype.subscribeCore = function(observer) {
- var g = new CompositeDisposable();
- g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));
- return g;
- };
- return MergeObservable;
- }(ObservableBase));
- var MergeObserver = (function() {
- function MergeObserver(o, max, g) {
- this.o = o;
- this.max = max;
- this.g = g;
- this.done = false;
- this.q = [];
- this.activeCount = 0;
- this.isStopped = false;
- }
- MergeObserver.prototype.handleSubscribe = function(xs) {
- var sad = new SingleAssignmentDisposable();
- this.g.add(sad);
- isPromise(xs) && (xs = observableFromPromise(xs));
- sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));
- };
- MergeObserver.prototype.onNext = function(innerSource) {
- if (this.isStopped) {
- return ;
- }
- if (this.activeCount < this.max) {
- this.activeCount++;
- this.handleSubscribe(innerSource);
- } else {
- this.q.push(innerSource);
- }
- };
- MergeObserver.prototype.onError = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.o.onError(e);
- }
- };
- MergeObserver.prototype.onCompleted = function() {
- if (!this.isStopped) {
- this.isStopped = true;
- this.done = true;
- this.activeCount === 0 && this.o.onCompleted();
- }
- };
- MergeObserver.prototype.dispose = function() {
- this.isStopped = true;
- };
- MergeObserver.prototype.fail = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.o.onError(e);
- return true;
- }
- return false;
- };
- function InnerObserver(parent, sad) {
- this.parent = parent;
- this.sad = sad;
- this.isStopped = false;
- }
- InnerObserver.prototype.onNext = function(x) {
- if (!this.isStopped) {
- this.parent.o.onNext(x);
- }
- };
- InnerObserver.prototype.onError = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.parent.o.onError(e);
- }
- };
- InnerObserver.prototype.onCompleted = function() {
- if (!this.isStopped) {
- this.isStopped = true;
- var parent = this.parent;
- parent.g.remove(this.sad);
- if (parent.q.length > 0) {
- parent.handleSubscribe(parent.q.shift());
- } else {
- parent.activeCount--;
- parent.done && parent.activeCount === 0 && parent.o.onCompleted();
- }
- }
- };
- InnerObserver.prototype.dispose = function() {
- this.isStopped = true;
- };
- InnerObserver.prototype.fail = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.parent.o.onError(e);
- return true;
- }
- return false;
- };
- return MergeObserver;
- }());
- observableProto.merge = function(maxConcurrentOrOther) {
- return typeof maxConcurrentOrOther !== 'number' ? observableMerge(this, maxConcurrentOrOther) : new MergeObservable(this, maxConcurrentOrOther);
- };
- var observableMerge = Observable.merge = function() {
- var scheduler,
- sources = [],
- i,
- len = arguments.length;
- if (!arguments[0]) {
- scheduler = immediateScheduler;
- for (i = 1; i < len; i++) {
- sources.push(arguments[i]);
- }
- } else if (isScheduler(arguments[0])) {
- scheduler = arguments[0];
- for (i = 1; i < len; i++) {
- sources.push(arguments[i]);
- }
- } else {
- scheduler = immediateScheduler;
- for (i = 0; i < len; i++) {
- sources.push(arguments[i]);
- }
- }
- if (Array.isArray(sources[0])) {
- sources = sources[0];
- }
- return observableOf(scheduler, sources).mergeAll();
- };
- var MergeAllObservable = (function(__super__) {
- inherits(MergeAllObservable, __super__);
- function MergeAllObservable(source) {
- this.source = source;
- __super__.call(this);
- }
- MergeAllObservable.prototype.subscribeCore = function(observer) {
- var g = new CompositeDisposable(),
- m = new SingleAssignmentDisposable();
- g.add(m);
- m.setDisposable(this.source.subscribe(new MergeAllObserver(observer, g)));
- return g;
- };
- return MergeAllObservable;
- }(ObservableBase));
- var MergeAllObserver = (function() {
- function MergeAllObserver(o, g) {
- this.o = o;
- this.g = g;
- this.isStopped = false;
- this.done = false;
- }
- MergeAllObserver.prototype.onNext = function(innerSource) {
- if (this.isStopped) {
- return ;
- }
- var sad = new SingleAssignmentDisposable();
- this.g.add(sad);
- isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
- sad.setDisposable(innerSource.subscribe(new InnerObserver(this, this.g, sad)));
- };
- MergeAllObserver.prototype.onError = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.o.onError(e);
- }
- };
- MergeAllObserver.prototype.onCompleted = function() {
- if (!this.isStopped) {
- this.isStopped = true;
- this.done = true;
- this.g.length === 1 && this.o.onCompleted();
- }
- };
- MergeAllObserver.prototype.dispose = function() {
- this.isStopped = true;
- };
- MergeAllObserver.prototype.fail = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.o.onError(e);
- return true;
- }
- return false;
- };
- function InnerObserver(parent, g, sad) {
- this.parent = parent;
- this.g = g;
- this.sad = sad;
- this.isStopped = false;
- }
- InnerObserver.prototype.onNext = function(x) {
- if (!this.isStopped) {
- this.parent.o.onNext(x);
- }
- };
- InnerObserver.prototype.onError = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.parent.o.onError(e);
- }
- };
- InnerObserver.prototype.onCompleted = function() {
- if (!this.isStopped) {
- var parent = this.parent;
- this.isStopped = true;
- parent.g.remove(this.sad);
- parent.done && parent.g.length === 1 && parent.o.onCompleted();
- }
- };
- InnerObserver.prototype.dispose = function() {
- this.isStopped = true;
- };
- InnerObserver.prototype.fail = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.parent.o.onError(e);
- return true;
- }
- return false;
- };
- return MergeAllObserver;
- }());
- observableProto.mergeAll = observableProto.mergeObservable = function() {
- return new MergeAllObservable(this);
- };
- var CompositeError = Rx.CompositeError = function(errors) {
- this.name = "NotImplementedError";
- this.innerErrors = errors;
- this.message = 'This contains multiple errors. Check the innerErrors';
- Error.call(this);
- };
- CompositeError.prototype = Error.prototype;
- Observable.mergeDelayError = function() {
- var args;
- if (Array.isArray(arguments[0])) {
- args = arguments[0];
- } else {
- var len = arguments.length;
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- }
- var source = observableOf(null, args);
- return new AnonymousObservable(function(o) {
- var group = new CompositeDisposable(),
- m = new SingleAssignmentDisposable(),
- isStopped = false,
- errors = [];
- function setCompletion() {
- if (errors.length === 0) {
- o.onCompleted();
- } else if (errors.length === 1) {
- o.onError(errors[0]);
- } else {
- o.onError(new CompositeError(errors));
- }
- }
- group.add(m);
- m.setDisposable(source.subscribe(function(innerSource) {
- var innerSubscription = new SingleAssignmentDisposable();
- group.add(innerSubscription);
- isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
- innerSubscription.setDisposable(innerSource.subscribe(function(x) {
- o.onNext(x);
- }, function(e) {
- errors.push(e);
- group.remove(innerSubscription);
- isStopped && group.length === 1 && setCompletion();
- }, function() {
- group.remove(innerSubscription);
- isStopped && group.length === 1 && setCompletion();
- }));
- }, function(e) {
- errors.push(e);
- isStopped = true;
- group.length === 1 && setCompletion();
- }, function() {
- isStopped = true;
- group.length === 1 && setCompletion();
- }));
- return group;
- });
- };
- observableProto.onErrorResumeNext = function(second) {
- if (!second) {
- throw new Error('Second observable is required');
- }
- return onErrorResumeNext([this, second]);
- };
- var onErrorResumeNext = Observable.onErrorResumeNext = function() {
- var sources = [];
- if (Array.isArray(arguments[0])) {
- sources = arguments[0];
- } else {
- for (var i = 0,
- len = arguments.length; i < len; i++) {
- sources.push(arguments[i]);
- }
- }
- return new AnonymousObservable(function(observer) {
- var pos = 0,
- subscription = new SerialDisposable(),
- cancelable = immediateScheduler.scheduleRecursive(function(self) {
- var current,
- d;
- if (pos < sources.length) {
- current = sources[pos++];
- isPromise(current) && (current = observableFromPromise(current));
- d = new SingleAssignmentDisposable();
- subscription.setDisposable(d);
- d.setDisposable(current.subscribe(observer.onNext.bind(observer), self, self));
- } else {
- observer.onCompleted();
- }
- });
- return new CompositeDisposable(subscription, cancelable);
- });
- };
- observableProto.skipUntil = function(other) {
- var source = this;
- return new AnonymousObservable(function(o) {
- var isOpen = false;
- var disposables = new CompositeDisposable(source.subscribe(function(left) {
- isOpen && o.onNext(left);
- }, function(e) {
- o.onError(e);
- }, function() {
- isOpen && o.onCompleted();
- }));
- isPromise(other) && (other = observableFromPromise(other));
- var rightSubscription = new SingleAssignmentDisposable();
- disposables.add(rightSubscription);
- rightSubscription.setDisposable(other.subscribe(function() {
- isOpen = true;
- rightSubscription.dispose();
- }, function(e) {
- o.onError(e);
- }, function() {
- rightSubscription.dispose();
- }));
- return disposables;
- }, source);
- };
- observableProto['switch'] = observableProto.switchLatest = function() {
- var sources = this;
- return new AnonymousObservable(function(observer) {
- var hasLatest = false,
- innerSubscription = new SerialDisposable(),
- isStopped = false,
- latest = 0,
- subscription = sources.subscribe(function(innerSource) {
- var d = new SingleAssignmentDisposable(),
- id = ++latest;
- hasLatest = true;
- innerSubscription.setDisposable(d);
- isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
- d.setDisposable(innerSource.subscribe(function(x) {
- latest === id && observer.onNext(x);
- }, function(e) {
- latest === id && observer.onError(e);
- }, function() {
- if (latest === id) {
- hasLatest = false;
- isStopped && observer.onCompleted();
- }
- }));
- }, function(e) {
- observer.onError(e);
- }, function() {
- isStopped = true;
- !hasLatest && observer.onCompleted();
- });
- return new CompositeDisposable(subscription, innerSubscription);
- }, sources);
- };
- observableProto.takeUntil = function(other) {
- var source = this;
- return new AnonymousObservable(function(o) {
- isPromise(other) && (other = observableFromPromise(other));
- return new CompositeDisposable(source.subscribe(o), other.subscribe(function() {
- o.onCompleted();
- }, function(e) {
- o.onError(e);
- }, noop));
- }, source);
- };
- observableProto.withLatestFrom = function() {
- var len = arguments.length,
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- var resultSelector = args.pop(),
- source = this;
- if (typeof source === 'undefined') {
- throw new Error('Source observable not found for withLatestFrom().');
- }
- if (typeof resultSelector !== 'function') {
- throw new Error('withLatestFrom() expects a resultSelector function.');
- }
- if (Array.isArray(args[0])) {
- args = args[0];
- }
- return new AnonymousObservable(function(observer) {
- var falseFactory = function() {
- return false;
- },
- n = args.length,
- hasValue = arrayInitialize(n, falseFactory),
- hasValueAll = false,
- values = new Array(n);
- var subscriptions = new Array(n + 1);
- for (var idx = 0; idx < n; idx++) {
- (function(i) {
- var other = args[i],
- sad = new SingleAssignmentDisposable();
- isPromise(other) && (other = observableFromPromise(other));
- sad.setDisposable(other.subscribe(function(x) {
- values[i] = x;
- hasValue[i] = true;
- hasValueAll = hasValue.every(identity);
- }, observer.onError.bind(observer), function() {}));
- subscriptions[i] = sad;
- }(idx));
- }
- var sad = new SingleAssignmentDisposable();
- sad.setDisposable(source.subscribe(function(x) {
- var res;
- var allValues = [x].concat(values);
- if (!hasValueAll)
- return ;
- try {
- res = resultSelector.apply(null, allValues);
- } catch (ex) {
- observer.onError(ex);
- return ;
- }
- observer.onNext(res);
- }, observer.onError.bind(observer), function() {
- observer.onCompleted();
- }));
- subscriptions[n] = sad;
- return new CompositeDisposable(subscriptions);
- }, this);
- };
- function zipArray(second, resultSelector) {
- var first = this;
- return new AnonymousObservable(function(observer) {
- var index = 0,
- len = second.length;
- return first.subscribe(function(left) {
- if (index < len) {
- var right = second[index++],
- result;
- try {
- result = resultSelector(left, right);
- } catch (e) {
- return observer.onError(e);
- }
- observer.onNext(result);
- } else {
- observer.onCompleted();
- }
- }, function(e) {
- observer.onError(e);
- }, function() {
- observer.onCompleted();
- });
- }, first);
- }
- function falseFactory() {
- return false;
- }
- function emptyArrayFactory() {
- return [];
- }
- observableProto.zip = function() {
- if (Array.isArray(arguments[0])) {
- return zipArray.apply(this, arguments);
- }
- var len = arguments.length,
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- var parent = this,
- resultSelector = args.pop();
- args.unshift(parent);
- return new AnonymousObservable(function(observer) {
- var n = args.length,
- queues = arrayInitialize(n, emptyArrayFactory),
- isDone = arrayInitialize(n, falseFactory);
- function next(i) {
- var res,
- queuedValues;
- if (queues.every(function(x) {
- return x.length > 0;
- })) {
- try {
- queuedValues = queues.map(function(x) {
- return x.shift();
- });
- res = resultSelector.apply(parent, queuedValues);
- } catch (ex) {
- observer.onError(ex);
- return ;
- }
- observer.onNext(res);
- } else if (isDone.filter(function(x, j) {
- return j !== i;
- }).every(identity)) {
- observer.onCompleted();
- }
- }
- ;
- function done(i) {
- isDone[i] = true;
- if (isDone.every(function(x) {
- return x;
- })) {
- observer.onCompleted();
- }
- }
- var subscriptions = new Array(n);
- for (var idx = 0; idx < n; idx++) {
- (function(i) {
- var source = args[i],
- sad = new SingleAssignmentDisposable();
- isPromise(source) && (source = observableFromPromise(source));
- sad.setDisposable(source.subscribe(function(x) {
- queues[i].push(x);
- next(i);
- }, function(e) {
- observer.onError(e);
- }, function() {
- done(i);
- }));
- subscriptions[i] = sad;
- })(idx);
- }
- return new CompositeDisposable(subscriptions);
- }, parent);
- };
- Observable.zip = function() {
- var len = arguments.length,
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- var first = args.shift();
- return first.zip.apply(first, args);
- };
- Observable.zipArray = function() {
- var sources;
- if (Array.isArray(arguments[0])) {
- sources = arguments[0];
- } else {
- var len = arguments.length;
- sources = new Array(len);
- for (var i = 0; i < len; i++) {
- sources[i] = arguments[i];
- }
- }
- return new AnonymousObservable(function(observer) {
- var n = sources.length,
- queues = arrayInitialize(n, function() {
- return [];
- }),
- isDone = arrayInitialize(n, function() {
- return false;
- });
- function next(i) {
- if (queues.every(function(x) {
- return x.length > 0;
- })) {
- var res = queues.map(function(x) {
- return x.shift();
- });
- observer.onNext(res);
- } else if (isDone.filter(function(x, j) {
- return j !== i;
- }).every(identity)) {
- observer.onCompleted();
- return ;
- }
- }
- ;
- function done(i) {
- isDone[i] = true;
- if (isDone.every(identity)) {
- observer.onCompleted();
- return ;
- }
- }
- var subscriptions = new Array(n);
- for (var idx = 0; idx < n; idx++) {
- (function(i) {
- subscriptions[i] = new SingleAssignmentDisposable();
- subscriptions[i].setDisposable(sources[i].subscribe(function(x) {
- queues[i].push(x);
- next(i);
- }, function(e) {
- observer.onError(e);
- }, function() {
- done(i);
- }));
- })(idx);
- }
- return new CompositeDisposable(subscriptions);
- });
- };
- observableProto.asObservable = function() {
- var source = this;
- return new AnonymousObservable(function(o) {
- return source.subscribe(o);
- }, this);
- };
- observableProto.bufferWithCount = function(count, skip) {
- if (typeof skip !== 'number') {
- skip = count;
- }
- return this.windowWithCount(count, skip).selectMany(function(x) {
- return x.toArray();
- }).where(function(x) {
- return x.length > 0;
- });
- };
- observableProto.dematerialize = function() {
- var source = this;
- return new AnonymousObservable(function(o) {
- return source.subscribe(function(x) {
- return x.accept(o);
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, this);
- };
- observableProto.distinctUntilChanged = function(keySelector, comparer) {
- var source = this;
- comparer || (comparer = defaultComparer);
- return new AnonymousObservable(function(o) {
- var hasCurrentKey = false,
- currentKey;
- return source.subscribe(function(value) {
- var key = value;
- if (keySelector) {
- try {
- key = keySelector(value);
- } catch (e) {
- o.onError(e);
- return ;
- }
- }
- if (hasCurrentKey) {
- try {
- var comparerEquals = comparer(currentKey, key);
- } catch (e) {
- o.onError(e);
- return ;
- }
- }
- if (!hasCurrentKey || !comparerEquals) {
- hasCurrentKey = true;
- currentKey = key;
- o.onNext(value);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, this);
- };
- observableProto['do'] = observableProto.tap = observableProto.doAction = function(observerOrOnNext, onError, onCompleted) {
- var source = this;
- return new AnonymousObservable(function(observer) {
- var tapObserver = !observerOrOnNext || isFunction(observerOrOnNext) ? observerCreate(observerOrOnNext || noop, onError || noop, onCompleted || noop) : observerOrOnNext;
- return source.subscribe(function(x) {
- try {
- tapObserver.onNext(x);
- } catch (e) {
- observer.onError(e);
- }
- observer.onNext(x);
- }, function(err) {
- try {
- tapObserver.onError(err);
- } catch (e) {
- observer.onError(e);
- }
- observer.onError(err);
- }, function() {
- try {
- tapObserver.onCompleted();
- } catch (e) {
- observer.onError(e);
- }
- observer.onCompleted();
- });
- }, this);
- };
- observableProto.doOnNext = observableProto.tapOnNext = function(onNext, thisArg) {
- return this.tap(typeof thisArg !== 'undefined' ? function(x) {
- onNext.call(thisArg, x);
- } : onNext);
- };
- observableProto.doOnError = observableProto.tapOnError = function(onError, thisArg) {
- return this.tap(noop, typeof thisArg !== 'undefined' ? function(e) {
- onError.call(thisArg, e);
- } : onError);
- };
- observableProto.doOnCompleted = observableProto.tapOnCompleted = function(onCompleted, thisArg) {
- return this.tap(noop, null, typeof thisArg !== 'undefined' ? function() {
- onCompleted.call(thisArg);
- } : onCompleted);
- };
- observableProto['finally'] = observableProto.ensure = function(action) {
- var source = this;
- return new AnonymousObservable(function(observer) {
- var subscription;
- try {
- subscription = source.subscribe(observer);
- } catch (e) {
- action();
- throw e;
- }
- return disposableCreate(function() {
- try {
- subscription.dispose();
- } catch (e) {
- throw e;
- } finally {
- action();
- }
- });
- }, this);
- };
- observableProto.finallyAction = function(action) {
- return this.ensure(action);
- };
- observableProto.ignoreElements = function() {
- var source = this;
- return new AnonymousObservable(function(o) {
- return source.subscribe(noop, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, source);
- };
- observableProto.materialize = function() {
- var source = this;
- return new AnonymousObservable(function(observer) {
- return source.subscribe(function(value) {
- observer.onNext(notificationCreateOnNext(value));
- }, function(e) {
- observer.onNext(notificationCreateOnError(e));
- observer.onCompleted();
- }, function() {
- observer.onNext(notificationCreateOnCompleted());
- observer.onCompleted();
- });
- }, source);
- };
- observableProto.repeat = function(repeatCount) {
- return enumerableRepeat(this, repeatCount).concat();
- };
- observableProto.retry = function(retryCount) {
- return enumerableRepeat(this, retryCount).catchError();
- };
- observableProto.retryWhen = function(notifier) {
- return enumerableRepeat(this).catchErrorWhen(notifier);
- };
- observableProto.scan = function() {
- var hasSeed = false,
- seed,
- accumulator,
- source = this;
- if (arguments.length === 2) {
- hasSeed = true;
- seed = arguments[0];
- accumulator = arguments[1];
- } else {
- accumulator = arguments[0];
- }
- return new AnonymousObservable(function(o) {
- var hasAccumulation,
- accumulation,
- hasValue;
- return source.subscribe(function(x) {
- !hasValue && (hasValue = true);
- try {
- if (hasAccumulation) {
- accumulation = accumulator(accumulation, x);
- } else {
- accumulation = hasSeed ? accumulator(seed, x) : x;
- hasAccumulation = true;
- }
- } catch (e) {
- o.onError(e);
- return ;
- }
- o.onNext(accumulation);
- }, function(e) {
- o.onError(e);
- }, function() {
- !hasValue && hasSeed && o.onNext(seed);
- o.onCompleted();
- });
- }, source);
- };
- observableProto.skipLast = function(count) {
- if (count < 0) {
- throw new ArgumentOutOfRangeError();
- }
- var source = this;
- return new AnonymousObservable(function(o) {
- var q = [];
- return source.subscribe(function(x) {
- q.push(x);
- q.length > count && o.onNext(q.shift());
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, source);
- };
- observableProto.startWith = function() {
- var values,
- scheduler,
- start = 0;
- if (!!arguments.length && isScheduler(arguments[0])) {
- scheduler = arguments[0];
- start = 1;
- } else {
- scheduler = immediateScheduler;
- }
- for (var args = [],
- i = start,
- len = arguments.length; i < len; i++) {
- args.push(arguments[i]);
- }
- return enumerableOf([observableFromArray(args, scheduler), this]).concat();
- };
- observableProto.takeLast = function(count) {
- if (count < 0) {
- throw new ArgumentOutOfRangeError();
- }
- var source = this;
- return new AnonymousObservable(function(o) {
- var q = [];
- return source.subscribe(function(x) {
- q.push(x);
- q.length > count && q.shift();
- }, function(e) {
- o.onError(e);
- }, function() {
- while (q.length > 0) {
- o.onNext(q.shift());
- }
- o.onCompleted();
- });
- }, source);
- };
- observableProto.takeLastBuffer = function(count) {
- var source = this;
- return new AnonymousObservable(function(o) {
- var q = [];
- return source.subscribe(function(x) {
- q.push(x);
- q.length > count && q.shift();
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onNext(q);
- o.onCompleted();
- });
- }, source);
- };
- observableProto.windowWithCount = function(count, skip) {
- var source = this;
- +count || (count = 0);
- Math.abs(count) === Infinity && (count = 0);
- if (count <= 0) {
- throw new ArgumentOutOfRangeError();
- }
- skip == null && (skip = count);
- +skip || (skip = 0);
- Math.abs(skip) === Infinity && (skip = 0);
- if (skip <= 0) {
- throw new ArgumentOutOfRangeError();
- }
- return new AnonymousObservable(function(observer) {
- var m = new SingleAssignmentDisposable(),
- refCountDisposable = new RefCountDisposable(m),
- n = 0,
- q = [];
- function createWindow() {
- var s = new Subject();
- q.push(s);
- observer.onNext(addRef(s, refCountDisposable));
- }
- createWindow();
- m.setDisposable(source.subscribe(function(x) {
- for (var i = 0,
- len = q.length; i < len; i++) {
- q[i].onNext(x);
- }
- var c = n - count + 1;
- c >= 0 && c % skip === 0 && q.shift().onCompleted();
- ++n % skip === 0 && createWindow();
- }, function(e) {
- while (q.length > 0) {
- q.shift().onError(e);
- }
- observer.onError(e);
- }, function() {
- while (q.length > 0) {
- q.shift().onCompleted();
- }
- observer.onCompleted();
- }));
- return refCountDisposable;
- }, source);
- };
- function concatMap(source, selector, thisArg) {
- var selectorFunc = bindCallback(selector, thisArg, 3);
- return source.map(function(x, i) {
- var result = selectorFunc(x, i, source);
- isPromise(result) && (result = observableFromPromise(result));
- (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));
- return result;
- }).concatAll();
- }
- observableProto.selectConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {
- if (isFunction(selector) && isFunction(resultSelector)) {
- return this.concatMap(function(x, i) {
- var selectorResult = selector(x, i);
- isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));
- (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));
- return selectorResult.map(function(y, i2) {
- return resultSelector(x, y, i, i2);
- });
- });
- }
- return isFunction(selector) ? concatMap(this, selector, thisArg) : concatMap(this, function() {
- return selector;
- });
- };
- observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {
- var source = this,
- onNextFunc = bindCallback(onNext, thisArg, 2),
- onErrorFunc = bindCallback(onError, thisArg, 1),
- onCompletedFunc = bindCallback(onCompleted, thisArg, 0);
- return new AnonymousObservable(function(observer) {
- var index = 0;
- return source.subscribe(function(x) {
- var result;
- try {
- result = onNextFunc(x, index++);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- isPromise(result) && (result = observableFromPromise(result));
- observer.onNext(result);
- }, function(err) {
- var result;
- try {
- result = onErrorFunc(err);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- isPromise(result) && (result = observableFromPromise(result));
- observer.onNext(result);
- observer.onCompleted();
- }, function() {
- var result;
- try {
- result = onCompletedFunc();
- } catch (e) {
- observer.onError(e);
- return ;
- }
- isPromise(result) && (result = observableFromPromise(result));
- observer.onNext(result);
- observer.onCompleted();
- });
- }, this).concatAll();
- };
- observableProto.defaultIfEmpty = function(defaultValue) {
- var source = this;
- defaultValue === undefined && (defaultValue = null);
- return new AnonymousObservable(function(observer) {
- var found = false;
- return source.subscribe(function(x) {
- found = true;
- observer.onNext(x);
- }, function(e) {
- observer.onError(e);
- }, function() {
- !found && observer.onNext(defaultValue);
- observer.onCompleted();
- });
- }, source);
- };
- function arrayIndexOfComparer(array, item, comparer) {
- for (var i = 0,
- len = array.length; i < len; i++) {
- if (comparer(array[i], item)) {
- return i;
- }
- }
- return -1;
- }
- function HashSet(comparer) {
- this.comparer = comparer;
- this.set = [];
- }
- HashSet.prototype.push = function(value) {
- var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;
- retValue && this.set.push(value);
- return retValue;
- };
- observableProto.distinct = function(keySelector, comparer) {
- var source = this;
- comparer || (comparer = defaultComparer);
- return new AnonymousObservable(function(o) {
- var hashSet = new HashSet(comparer);
- return source.subscribe(function(x) {
- var key = x;
- if (keySelector) {
- try {
- key = keySelector(x);
- } catch (e) {
- o.onError(e);
- return ;
- }
- }
- hashSet.push(key) && o.onNext(x);
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, this);
- };
- observableProto.groupBy = function(keySelector, elementSelector, comparer) {
- return this.groupByUntil(keySelector, elementSelector, observableNever, comparer);
- };
- observableProto.groupByUntil = function(keySelector, elementSelector, durationSelector, comparer) {
- var source = this;
- elementSelector || (elementSelector = identity);
- comparer || (comparer = defaultComparer);
- return new AnonymousObservable(function(observer) {
- function handleError(e) {
- return function(item) {
- item.onError(e);
- };
- }
- var map = new Dictionary(0, comparer),
- groupDisposable = new CompositeDisposable(),
- refCountDisposable = new RefCountDisposable(groupDisposable);
- groupDisposable.add(source.subscribe(function(x) {
- var key;
- try {
- key = keySelector(x);
- } catch (e) {
- map.getValues().forEach(handleError(e));
- observer.onError(e);
- return ;
- }
- var fireNewMapEntry = false,
- writer = map.tryGetValue(key);
- if (!writer) {
- writer = new Subject();
- map.set(key, writer);
- fireNewMapEntry = true;
- }
- if (fireNewMapEntry) {
- var group = new GroupedObservable(key, writer, refCountDisposable),
- durationGroup = new GroupedObservable(key, writer);
- try {
- duration = durationSelector(durationGroup);
- } catch (e) {
- map.getValues().forEach(handleError(e));
- observer.onError(e);
- return ;
- }
- observer.onNext(group);
- var md = new SingleAssignmentDisposable();
- groupDisposable.add(md);
- var expire = function() {
- map.remove(key) && writer.onCompleted();
- groupDisposable.remove(md);
- };
- md.setDisposable(duration.take(1).subscribe(noop, function(exn) {
- map.getValues().forEach(handleError(exn));
- observer.onError(exn);
- }, expire));
- }
- var element;
- try {
- element = elementSelector(x);
- } catch (e) {
- map.getValues().forEach(handleError(e));
- observer.onError(e);
- return ;
- }
- writer.onNext(element);
- }, function(ex) {
- map.getValues().forEach(handleError(ex));
- observer.onError(ex);
- }, function() {
- map.getValues().forEach(function(item) {
- item.onCompleted();
- });
- observer.onCompleted();
- }));
- return refCountDisposable;
- }, source);
- };
- var MapObservable = (function(__super__) {
- inherits(MapObservable, __super__);
- function MapObservable(source, selector, thisArg) {
- this.source = source;
- this.selector = bindCallback(selector, thisArg, 3);
- __super__.call(this);
- }
- MapObservable.prototype.internalMap = function(selector, thisArg) {
- var self = this;
- return new MapObservable(this.source, function(x, i, o) {
- return selector.call(this, self.selector(x, i, o), i, o);
- }, thisArg);
- };
- MapObservable.prototype.subscribeCore = function(observer) {
- return this.source.subscribe(new MapObserver(observer, this.selector, this));
- };
- return MapObservable;
- }(ObservableBase));
- function MapObserver(observer, selector, source) {
- this.observer = observer;
- this.selector = selector;
- this.source = source;
- this.i = 0;
- this.isStopped = false;
- }
- MapObserver.prototype.onNext = function(x) {
- if (this.isStopped) {
- return ;
- }
- var result = tryCatch(this.selector).call(this, x, this.i++, this.source);
- if (result === errorObj) {
- return this.observer.onError(result.e);
- }
- this.observer.onNext(result);
- };
- MapObserver.prototype.onError = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onError(e);
- }
- };
- MapObserver.prototype.onCompleted = function() {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onCompleted();
- }
- };
- MapObserver.prototype.dispose = function() {
- this.isStopped = true;
- };
- MapObserver.prototype.fail = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onError(e);
- return true;
- }
- return false;
- };
- observableProto.map = observableProto.select = function(selector, thisArg) {
- var selectorFn = typeof selector === 'function' ? selector : function() {
- return selector;
- };
- return this instanceof MapObservable ? this.internalMap(selectorFn, thisArg) : new MapObservable(this, selectorFn, thisArg);
- };
- observableProto.pluck = function() {
- var args = arguments,
- len = arguments.length;
- if (len === 0) {
- throw new Error('List of properties cannot be empty.');
- }
- return this.map(function(x) {
- var currentProp = x;
- for (var i = 0; i < len; i++) {
- var p = currentProp[args[i]];
- if (typeof p !== 'undefined') {
- currentProp = p;
- } else {
- return undefined;
- }
- }
- return currentProp;
- });
- };
- function flatMap(source, selector, thisArg) {
- var selectorFunc = bindCallback(selector, thisArg, 3);
- return source.map(function(x, i) {
- var result = selectorFunc(x, i, source);
- isPromise(result) && (result = observableFromPromise(result));
- (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));
- return result;
- }).mergeAll();
- }
- observableProto.selectMany = observableProto.flatMap = function(selector, resultSelector, thisArg) {
- if (isFunction(selector) && isFunction(resultSelector)) {
- return this.flatMap(function(x, i) {
- var selectorResult = selector(x, i);
- isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));
- (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));
- return selectorResult.map(function(y, i2) {
- return resultSelector(x, y, i, i2);
- });
- }, thisArg);
- }
- return isFunction(selector) ? flatMap(this, selector, thisArg) : flatMap(this, function() {
- return selector;
- });
- };
- observableProto.flatMapObserver = observableProto.selectManyObserver = function(onNext, onError, onCompleted, thisArg) {
- var source = this;
- return new AnonymousObservable(function(observer) {
- var index = 0;
- return source.subscribe(function(x) {
- var result;
- try {
- result = onNext.call(thisArg, x, index++);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- isPromise(result) && (result = observableFromPromise(result));
- observer.onNext(result);
- }, function(err) {
- var result;
- try {
- result = onError.call(thisArg, err);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- isPromise(result) && (result = observableFromPromise(result));
- observer.onNext(result);
- observer.onCompleted();
- }, function() {
- var result;
- try {
- result = onCompleted.call(thisArg);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- isPromise(result) && (result = observableFromPromise(result));
- observer.onNext(result);
- observer.onCompleted();
- });
- }, source).mergeAll();
- };
- observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function(selector, thisArg) {
- return this.select(selector, thisArg).switchLatest();
- };
- observableProto.skip = function(count) {
- if (count < 0) {
- throw new ArgumentOutOfRangeError();
- }
- var source = this;
- return new AnonymousObservable(function(o) {
- var remaining = count;
- return source.subscribe(function(x) {
- if (remaining <= 0) {
- o.onNext(x);
- } else {
- remaining--;
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, source);
- };
- observableProto.skipWhile = function(predicate, thisArg) {
- var source = this,
- callback = bindCallback(predicate, thisArg, 3);
- return new AnonymousObservable(function(o) {
- var i = 0,
- running = false;
- return source.subscribe(function(x) {
- if (!running) {
- try {
- running = !callback(x, i++, source);
- } catch (e) {
- o.onError(e);
- return ;
- }
- }
- running && o.onNext(x);
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, source);
- };
- observableProto.take = function(count, scheduler) {
- if (count < 0) {
- throw new ArgumentOutOfRangeError();
- }
- if (count === 0) {
- return observableEmpty(scheduler);
- }
- var source = this;
- return new AnonymousObservable(function(o) {
- var remaining = count;
- return source.subscribe(function(x) {
- if (remaining-- > 0) {
- o.onNext(x);
- remaining === 0 && o.onCompleted();
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, source);
- };
- observableProto.takeWhile = function(predicate, thisArg) {
- var source = this,
- callback = bindCallback(predicate, thisArg, 3);
- return new AnonymousObservable(function(o) {
- var i = 0,
- running = true;
- return source.subscribe(function(x) {
- if (running) {
- try {
- running = callback(x, i++, source);
- } catch (e) {
- o.onError(e);
- return ;
- }
- if (running) {
- o.onNext(x);
- } else {
- o.onCompleted();
- }
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, source);
- };
- var FilterObservable = (function(__super__) {
- inherits(FilterObservable, __super__);
- function FilterObservable(source, predicate, thisArg) {
- this.source = source;
- this.predicate = bindCallback(predicate, thisArg, 3);
- __super__.call(this);
- }
- FilterObservable.prototype.subscribeCore = function(observer) {
- return this.source.subscribe(new FilterObserver(observer, this.predicate, this));
- };
- FilterObservable.prototype.internalFilter = function(predicate, thisArg) {
- var self = this;
- return new FilterObservable(this.source, function(x, i, o) {
- return self.predicate(x, i, o) && predicate.call(this, x, i, o);
- }, thisArg);
- };
- return FilterObservable;
- }(ObservableBase));
- function FilterObserver(observer, predicate, source) {
- this.observer = observer;
- this.predicate = predicate;
- this.source = source;
- this.i = 0;
- this.isStopped = false;
- }
- FilterObserver.prototype.onNext = function(x) {
- if (this.isStopped) {
- return ;
- }
- var shouldYield = tryCatch(this.predicate).call(this, x, this.i++, this.source);
- if (shouldYield === errorObj) {
- return this.observer.onError(shouldYield.e);
- }
- shouldYield && this.observer.onNext(x);
- };
- FilterObserver.prototype.onError = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onError(e);
- }
- };
- FilterObserver.prototype.onCompleted = function() {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onCompleted();
- }
- };
- FilterObserver.prototype.dispose = function() {
- this.isStopped = true;
- };
- FilterObserver.prototype.fail = function(e) {
- if (!this.isStopped) {
- this.isStopped = true;
- this.observer.onError(e);
- return true;
- }
- return false;
- };
- observableProto.filter = observableProto.where = function(predicate, thisArg) {
- return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) : new FilterObservable(this, predicate, thisArg);
- };
- function extremaBy(source, keySelector, comparer) {
- return new AnonymousObservable(function(o) {
- var hasValue = false,
- lastKey = null,
- list = [];
- return source.subscribe(function(x) {
- var comparison,
- key;
- try {
- key = keySelector(x);
- } catch (ex) {
- o.onError(ex);
- return ;
- }
- comparison = 0;
- if (!hasValue) {
- hasValue = true;
- lastKey = key;
- } else {
- try {
- comparison = comparer(key, lastKey);
- } catch (ex1) {
- o.onError(ex1);
- return ;
- }
- }
- if (comparison > 0) {
- lastKey = key;
- list = [];
- }
- if (comparison >= 0) {
- list.push(x);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onNext(list);
- o.onCompleted();
- });
- }, source);
- }
- function firstOnly(x) {
- if (x.length === 0) {
- throw new EmptyError();
- }
- return x[0];
- }
- observableProto.aggregate = function() {
- var hasSeed = false,
- accumulator,
- seed,
- source = this;
- if (arguments.length === 2) {
- hasSeed = true;
- seed = arguments[0];
- accumulator = arguments[1];
- } else {
- accumulator = arguments[0];
- }
- return new AnonymousObservable(function(o) {
- var hasAccumulation,
- accumulation,
- hasValue;
- return source.subscribe(function(x) {
- !hasValue && (hasValue = true);
- try {
- if (hasAccumulation) {
- accumulation = accumulator(accumulation, x);
- } else {
- accumulation = hasSeed ? accumulator(seed, x) : x;
- hasAccumulation = true;
- }
- } catch (e) {
- return o.onError(e);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- hasValue && o.onNext(accumulation);
- !hasValue && hasSeed && o.onNext(seed);
- !hasValue && !hasSeed && o.onError(new EmptyError());
- o.onCompleted();
- });
- }, source);
- };
- observableProto.reduce = function(accumulator) {
- var hasSeed = false,
- seed,
- source = this;
- if (arguments.length === 2) {
- hasSeed = true;
- seed = arguments[1];
- }
- return new AnonymousObservable(function(o) {
- var hasAccumulation,
- accumulation,
- hasValue;
- return source.subscribe(function(x) {
- !hasValue && (hasValue = true);
- try {
- if (hasAccumulation) {
- accumulation = accumulator(accumulation, x);
- } else {
- accumulation = hasSeed ? accumulator(seed, x) : x;
- hasAccumulation = true;
- }
- } catch (e) {
- return o.onError(e);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- hasValue && o.onNext(accumulation);
- !hasValue && hasSeed && o.onNext(seed);
- !hasValue && !hasSeed && o.onError(new EmptyError());
- o.onCompleted();
- });
- }, source);
- };
- observableProto.some = function(predicate, thisArg) {
- var source = this;
- return predicate ? source.filter(predicate, thisArg).some() : new AnonymousObservable(function(observer) {
- return source.subscribe(function() {
- observer.onNext(true);
- observer.onCompleted();
- }, function(e) {
- observer.onError(e);
- }, function() {
- observer.onNext(false);
- observer.onCompleted();
- });
- }, source);
- };
- observableProto.any = function() {
- return this.some.apply(this, arguments);
- };
- observableProto.isEmpty = function() {
- return this.any().map(not);
- };
- observableProto.every = function(predicate, thisArg) {
- return this.filter(function(v) {
- return !predicate(v);
- }, thisArg).some().map(not);
- };
- observableProto.all = function() {
- return this.every.apply(this, arguments);
- };
- observableProto.includes = function(searchElement, fromIndex) {
- var source = this;
- function comparer(a, b) {
- return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));
- }
- return new AnonymousObservable(function(o) {
- var i = 0,
- n = +fromIndex || 0;
- Math.abs(n) === Infinity && (n = 0);
- if (n < 0) {
- o.onNext(false);
- o.onCompleted();
- return disposableEmpty;
- }
- return source.subscribe(function(x) {
- if (i++ >= n && comparer(x, searchElement)) {
- o.onNext(true);
- o.onCompleted();
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onNext(false);
- o.onCompleted();
- });
- }, this);
- };
- observableProto.contains = function(searchElement, fromIndex) {
- observableProto.includes(searchElement, fromIndex);
- };
- observableProto.count = function(predicate, thisArg) {
- return predicate ? this.filter(predicate, thisArg).count() : this.reduce(function(count) {
- return count + 1;
- }, 0);
- };
- observableProto.indexOf = function(searchElement, fromIndex) {
- var source = this;
- return new AnonymousObservable(function(o) {
- var i = 0,
- n = +fromIndex || 0;
- Math.abs(n) === Infinity && (n = 0);
- if (n < 0) {
- o.onNext(-1);
- o.onCompleted();
- return disposableEmpty;
- }
- return source.subscribe(function(x) {
- if (i >= n && x === searchElement) {
- o.onNext(i);
- o.onCompleted();
- }
- i++;
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onNext(-1);
- o.onCompleted();
- });
- }, source);
- };
- observableProto.sum = function(keySelector, thisArg) {
- return keySelector && isFunction(keySelector) ? this.map(keySelector, thisArg).sum() : this.reduce(function(prev, curr) {
- return prev + curr;
- }, 0);
- };
- observableProto.minBy = function(keySelector, comparer) {
- comparer || (comparer = defaultSubComparer);
- return extremaBy(this, keySelector, function(x, y) {
- return comparer(x, y) * -1;
- });
- };
- observableProto.min = function(comparer) {
- return this.minBy(identity, comparer).map(function(x) {
- return firstOnly(x);
- });
- };
- observableProto.maxBy = function(keySelector, comparer) {
- comparer || (comparer = defaultSubComparer);
- return extremaBy(this, keySelector, comparer);
- };
- observableProto.max = function(comparer) {
- return this.maxBy(identity, comparer).map(function(x) {
- return firstOnly(x);
- });
- };
- observableProto.average = function(keySelector, thisArg) {
- return keySelector && isFunction(keySelector) ? this.map(keySelector, thisArg).average() : this.reduce(function(prev, cur) {
- return {
- sum: prev.sum + cur,
- count: prev.count + 1
- };
- }, {
- sum: 0,
- count: 0
- }).map(function(s) {
- if (s.count === 0) {
- throw new EmptyError();
- }
- return s.sum / s.count;
- });
- };
- observableProto.sequenceEqual = function(second, comparer) {
- var first = this;
- comparer || (comparer = defaultComparer);
- return new AnonymousObservable(function(o) {
- var donel = false,
- doner = false,
- ql = [],
- qr = [];
- var subscription1 = first.subscribe(function(x) {
- var equal,
- v;
- if (qr.length > 0) {
- v = qr.shift();
- try {
- equal = comparer(v, x);
- } catch (e) {
- o.onError(e);
- return ;
- }
- if (!equal) {
- o.onNext(false);
- o.onCompleted();
- }
- } else if (doner) {
- o.onNext(false);
- o.onCompleted();
- } else {
- ql.push(x);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- donel = true;
- if (ql.length === 0) {
- if (qr.length > 0) {
- o.onNext(false);
- o.onCompleted();
- } else if (doner) {
- o.onNext(true);
- o.onCompleted();
- }
- }
- });
- (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));
- isPromise(second) && (second = observableFromPromise(second));
- var subscription2 = second.subscribe(function(x) {
- var equal;
- if (ql.length > 0) {
- var v = ql.shift();
- try {
- equal = comparer(v, x);
- } catch (exception) {
- o.onError(exception);
- return ;
- }
- if (!equal) {
- o.onNext(false);
- o.onCompleted();
- }
- } else if (donel) {
- o.onNext(false);
- o.onCompleted();
- } else {
- qr.push(x);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- doner = true;
- if (qr.length === 0) {
- if (ql.length > 0) {
- o.onNext(false);
- o.onCompleted();
- } else if (donel) {
- o.onNext(true);
- o.onCompleted();
- }
- }
- });
- return new CompositeDisposable(subscription1, subscription2);
- }, first);
- };
- function elementAtOrDefault(source, index, hasDefault, defaultValue) {
- if (index < 0) {
- throw new ArgumentOutOfRangeError();
- }
- return new AnonymousObservable(function(o) {
- var i = index;
- return source.subscribe(function(x) {
- if (i-- === 0) {
- o.onNext(x);
- o.onCompleted();
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- if (!hasDefault) {
- o.onError(new ArgumentOutOfRangeError());
- } else {
- o.onNext(defaultValue);
- o.onCompleted();
- }
- });
- }, source);
- }
- observableProto.elementAt = function(index) {
- return elementAtOrDefault(this, index, false);
- };
- observableProto.elementAtOrDefault = function(index, defaultValue) {
- return elementAtOrDefault(this, index, true, defaultValue);
- };
- function singleOrDefaultAsync(source, hasDefault, defaultValue) {
- return new AnonymousObservable(function(o) {
- var value = defaultValue,
- seenValue = false;
- return source.subscribe(function(x) {
- if (seenValue) {
- o.onError(new Error('Sequence contains more than one element'));
- } else {
- value = x;
- seenValue = true;
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- if (!seenValue && !hasDefault) {
- o.onError(new EmptyError());
- } else {
- o.onNext(value);
- o.onCompleted();
- }
- });
- }, source);
- }
- observableProto.single = function(predicate, thisArg) {
- return predicate && isFunction(predicate) ? this.where(predicate, thisArg).single() : singleOrDefaultAsync(this, false);
- };
- observableProto.singleOrDefault = function(predicate, defaultValue, thisArg) {
- return predicate && isFunction(predicate) ? this.filter(predicate, thisArg).singleOrDefault(null, defaultValue) : singleOrDefaultAsync(this, true, defaultValue);
- };
- function firstOrDefaultAsync(source, hasDefault, defaultValue) {
- return new AnonymousObservable(function(o) {
- return source.subscribe(function(x) {
- o.onNext(x);
- o.onCompleted();
- }, function(e) {
- o.onError(e);
- }, function() {
- if (!hasDefault) {
- o.onError(new EmptyError());
- } else {
- o.onNext(defaultValue);
- o.onCompleted();
- }
- });
- }, source);
- }
- observableProto.first = function(predicate, thisArg) {
- return predicate ? this.where(predicate, thisArg).first() : firstOrDefaultAsync(this, false);
- };
- observableProto.firstOrDefault = function(predicate, defaultValue, thisArg) {
- return predicate ? this.where(predicate).firstOrDefault(null, defaultValue) : firstOrDefaultAsync(this, true, defaultValue);
- };
- function lastOrDefaultAsync(source, hasDefault, defaultValue) {
- return new AnonymousObservable(function(o) {
- var value = defaultValue,
- seenValue = false;
- return source.subscribe(function(x) {
- value = x;
- seenValue = true;
- }, function(e) {
- o.onError(e);
- }, function() {
- if (!seenValue && !hasDefault) {
- o.onError(new EmptyError());
- } else {
- o.onNext(value);
- o.onCompleted();
- }
- });
- }, source);
- }
- observableProto.last = function(predicate, thisArg) {
- return predicate ? this.where(predicate, thisArg).last() : lastOrDefaultAsync(this, false);
- };
- observableProto.lastOrDefault = function(predicate, defaultValue, thisArg) {
- return predicate ? this.where(predicate, thisArg).lastOrDefault(null, defaultValue) : lastOrDefaultAsync(this, true, defaultValue);
- };
- function findValue(source, predicate, thisArg, yieldIndex) {
- var callback = bindCallback(predicate, thisArg, 3);
- return new AnonymousObservable(function(o) {
- var i = 0;
- return source.subscribe(function(x) {
- var shouldRun;
- try {
- shouldRun = callback(x, i, source);
- } catch (e) {
- o.onError(e);
- return ;
- }
- if (shouldRun) {
- o.onNext(yieldIndex ? i : x);
- o.onCompleted();
- } else {
- i++;
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onNext(yieldIndex ? -1 : undefined);
- o.onCompleted();
- });
- }, source);
- }
- observableProto.find = function(predicate, thisArg) {
- return findValue(this, predicate, thisArg, false);
- };
- observableProto.findIndex = function(predicate, thisArg) {
- return findValue(this, predicate, thisArg, true);
- };
- observableProto.toSet = function() {
- if (typeof root.Set === 'undefined') {
- throw new TypeError();
- }
- var source = this;
- return new AnonymousObservable(function(o) {
- var s = new root.Set();
- return source.subscribe(function(x) {
- s.add(x);
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onNext(s);
- o.onCompleted();
- });
- }, source);
- };
- observableProto.toMap = function(keySelector, elementSelector) {
- if (typeof root.Map === 'undefined') {
- throw new TypeError();
- }
- var source = this;
- return new AnonymousObservable(function(o) {
- var m = new root.Map();
- return source.subscribe(function(x) {
- var key;
- try {
- key = keySelector(x);
- } catch (e) {
- o.onError(e);
- return ;
- }
- var element = x;
- if (elementSelector) {
- try {
- element = elementSelector(x);
- } catch (e) {
- o.onError(e);
- return ;
- }
- }
- m.set(key, element);
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onNext(m);
- o.onCompleted();
- });
- }, source);
- };
- var fnString = 'function',
- throwString = 'throw',
- isObject = Rx.internals.isObject;
- function toThunk(obj, ctx) {
- if (Array.isArray(obj)) {
- return objectToThunk.call(ctx, obj);
- }
- if (isGeneratorFunction(obj)) {
- return observableSpawn(obj.call(ctx));
- }
- if (isGenerator(obj)) {
- return observableSpawn(obj);
- }
- if (isObservable(obj)) {
- return observableToThunk(obj);
- }
- if (isPromise(obj)) {
- return promiseToThunk(obj);
- }
- if (typeof obj === fnString) {
- return obj;
- }
- if (isObject(obj) || Array.isArray(obj)) {
- return objectToThunk.call(ctx, obj);
- }
- return obj;
- }
- function objectToThunk(obj) {
- var ctx = this;
- return function(done) {
- var keys = Object.keys(obj),
- pending = keys.length,
- results = new obj.constructor(),
- finished;
- if (!pending) {
- timeoutScheduler.schedule(function() {
- done(null, results);
- });
- return ;
- }
- for (var i = 0,
- len = keys.length; i < len; i++) {
- run(obj[keys[i]], keys[i]);
- }
- function run(fn, key) {
- if (finished) {
- return ;
- }
- try {
- fn = toThunk(fn, ctx);
- if (typeof fn !== fnString) {
- results[key] = fn;
- return --pending || done(null, results);
- }
- fn.call(ctx, function(err, res) {
- if (finished) {
- return ;
- }
- if (err) {
- finished = true;
- return done(err);
- }
- results[key] = res;
- --pending || done(null, results);
- });
- } catch (e) {
- finished = true;
- done(e);
- }
- }
- };
- }
- function observableToThunk(observable) {
- return function(fn) {
- var value,
- hasValue = false;
- observable.subscribe(function(v) {
- value = v;
- hasValue = true;
- }, fn, function() {
- hasValue && fn(null, value);
- });
- };
- }
- function promiseToThunk(promise) {
- return function(fn) {
- promise.then(function(res) {
- fn(null, res);
- }, fn);
- };
- }
- function isObservable(obj) {
- return obj && typeof obj.subscribe === fnString;
- }
- function isGeneratorFunction(obj) {
- return obj && obj.constructor && obj.constructor.name === 'GeneratorFunction';
- }
- function isGenerator(obj) {
- return obj && typeof obj.next === fnString && typeof obj[throwString] === fnString;
- }
- var observableSpawn = Rx.spawn = function(fn) {
- var isGenFun = isGeneratorFunction(fn);
- return function(done) {
- var ctx = this,
- gen = fn;
- if (isGenFun) {
- for (var args = [],
- i = 0,
- len = arguments.length; i < len; i++) {
- args.push(arguments[i]);
- }
- var len = args.length,
- hasCallback = len && typeof args[len - 1] === fnString;
- done = hasCallback ? args.pop() : handleError;
- gen = fn.apply(this, args);
- } else {
- done = done || handleError;
- }
- next();
- function exit(err, res) {
- timeoutScheduler.schedule(done.bind(ctx, err, res));
- }
- function next(err, res) {
- var ret;
- if (arguments.length > 2) {
- for (var res = [],
- i = 1,
- len = arguments.length; i < len; i++) {
- res.push(arguments[i]);
- }
- }
- if (err) {
- try {
- ret = gen[throwString](err);
- } catch (e) {
- return exit(e);
- }
- }
- if (!err) {
- try {
- ret = gen.next(res);
- } catch (e) {
- return exit(e);
- }
- }
- if (ret.done) {
- return exit(null, ret.value);
- }
- ret.value = toThunk(ret.value, ctx);
- if (typeof ret.value === fnString) {
- var called = false;
- try {
- ret.value.call(ctx, function() {
- if (called) {
- return ;
- }
- called = true;
- next.apply(ctx, arguments);
- });
- } catch (e) {
- timeoutScheduler.schedule(function() {
- if (called) {
- return ;
- }
- called = true;
- next.call(ctx, e);
- });
- }
- return ;
- }
- next(new TypeError('Rx.spawn only supports a function, Promise, Observable, Object or Array.'));
- }
- };
- };
- function handleError(err) {
- if (!err) {
- return ;
- }
- timeoutScheduler.schedule(function() {
- throw err;
- });
- }
- Observable.start = function(func, context, scheduler) {
- return observableToAsync(func, context, scheduler)();
- };
- var observableToAsync = Observable.toAsync = function(func, context, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return function() {
- var args = arguments,
- subject = new AsyncSubject();
- scheduler.schedule(function() {
- var result;
- try {
- result = func.apply(context, args);
- } catch (e) {
- subject.onError(e);
- return ;
- }
- subject.onNext(result);
- subject.onCompleted();
- });
- return subject.asObservable();
- };
- };
- Observable.fromCallback = function(func, context, selector) {
- return function() {
- var len = arguments.length,
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- return new AnonymousObservable(function(observer) {
- function handler() {
- var len = arguments.length,
- results = new Array(len);
- for (var i = 0; i < len; i++) {
- results[i] = arguments[i];
- }
- if (selector) {
- try {
- results = selector.apply(context, results);
- } catch (e) {
- return observer.onError(e);
- }
- observer.onNext(results);
- } else {
- if (results.length <= 1) {
- observer.onNext.apply(observer, results);
- } else {
- observer.onNext(results);
- }
- }
- observer.onCompleted();
- }
- args.push(handler);
- func.apply(context, args);
- }).publishLast().refCount();
- };
- };
- Observable.fromNodeCallback = function(func, context, selector) {
- return function() {
- var len = arguments.length,
- args = new Array(len);
- for (var i = 0; i < len; i++) {
- args[i] = arguments[i];
- }
- return new AnonymousObservable(function(observer) {
- function handler(err) {
- if (err) {
- observer.onError(err);
- return ;
- }
- var len = arguments.length,
- results = [];
- for (var i = 1; i < len; i++) {
- results[i - 1] = arguments[i];
- }
- if (selector) {
- try {
- results = selector.apply(context, results);
- } catch (e) {
- return observer.onError(e);
- }
- observer.onNext(results);
- } else {
- if (results.length <= 1) {
- observer.onNext.apply(observer, results);
- } else {
- observer.onNext(results);
- }
- }
- observer.onCompleted();
- }
- args.push(handler);
- func.apply(context, args);
- }).publishLast().refCount();
- };
- };
- function createListener(element, name, handler) {
- if (element.addEventListener) {
- element.addEventListener(name, handler, false);
- return disposableCreate(function() {
- element.removeEventListener(name, handler, false);
- });
- }
- throw new Error('No listener found');
- }
- function createEventListener(el, eventName, handler) {
- var disposables = new CompositeDisposable();
- if (Object.prototype.toString.call(el) === '[object NodeList]') {
- for (var i = 0,
- len = el.length; i < len; i++) {
- disposables.add(createEventListener(el.item(i), eventName, handler));
- }
- } else if (el) {
- disposables.add(createListener(el, eventName, handler));
- }
- return disposables;
- }
- Rx.config.useNativeEvents = false;
- Observable.fromEvent = function(element, eventName, selector) {
- if (element.addListener) {
- return fromEventPattern(function(h) {
- element.addListener(eventName, h);
- }, function(h) {
- element.removeListener(eventName, h);
- }, selector);
- }
- if (!Rx.config.useNativeEvents) {
- if (typeof element.on === 'function' && typeof element.off === 'function') {
- return fromEventPattern(function(h) {
- element.on(eventName, h);
- }, function(h) {
- element.off(eventName, h);
- }, selector);
- }
- }
- return new AnonymousObservable(function(observer) {
- return createEventListener(element, eventName, function handler(e) {
- var results = e;
- if (selector) {
- try {
- results = selector(arguments);
- } catch (err) {
- return observer.onError(err);
- }
- }
- observer.onNext(results);
- });
- }).publish().refCount();
- };
- var fromEventPattern = Observable.fromEventPattern = function(addHandler, removeHandler, selector) {
- return new AnonymousObservable(function(observer) {
- function innerHandler(e) {
- var result = e;
- if (selector) {
- try {
- result = selector(arguments);
- } catch (err) {
- return observer.onError(err);
- }
- }
- observer.onNext(result);
- }
- var returnValue = addHandler(innerHandler);
- return disposableCreate(function() {
- if (removeHandler) {
- removeHandler(innerHandler, returnValue);
- }
- });
- }).publish().refCount();
- };
- Observable.startAsync = function(functionAsync) {
- var promise;
- try {
- promise = functionAsync();
- } catch (e) {
- return observableThrow(e);
- }
- return observableFromPromise(promise);
- };
- var PausableObservable = (function(__super__) {
- inherits(PausableObservable, __super__);
- function subscribe(observer) {
- var conn = this.source.publish(),
- subscription = conn.subscribe(observer),
- connection = disposableEmpty;
- var pausable = this.pauser.distinctUntilChanged().subscribe(function(b) {
- if (b) {
- connection = conn.connect();
- } else {
- connection.dispose();
- connection = disposableEmpty;
- }
- });
- return new CompositeDisposable(subscription, connection, pausable);
- }
- function PausableObservable(source, pauser) {
- this.source = source;
- this.controller = new Subject();
- if (pauser && pauser.subscribe) {
- this.pauser = this.controller.merge(pauser);
- } else {
- this.pauser = this.controller;
- }
- __super__.call(this, subscribe, source);
- }
- PausableObservable.prototype.pause = function() {
- this.controller.onNext(false);
- };
- PausableObservable.prototype.resume = function() {
- this.controller.onNext(true);
- };
- return PausableObservable;
- }(Observable));
- observableProto.pausable = function(pauser) {
- return new PausableObservable(this, pauser);
- };
- function combineLatestSource(source, subject, resultSelector) {
- return new AnonymousObservable(function(o) {
- var hasValue = [false, false],
- hasValueAll = false,
- isDone = false,
- values = new Array(2),
- err;
- function next(x, i) {
- values[i] = x;
- var res;
- hasValue[i] = true;
- if (hasValueAll || (hasValueAll = hasValue.every(identity))) {
- if (err) {
- o.onError(err);
- return ;
- }
- try {
- res = resultSelector.apply(null, values);
- } catch (ex) {
- o.onError(ex);
- return ;
- }
- o.onNext(res);
- }
- if (isDone && values[1]) {
- o.onCompleted();
- }
- }
- return new CompositeDisposable(source.subscribe(function(x) {
- next(x, 0);
- }, function(e) {
- if (values[1]) {
- o.onError(e);
- } else {
- err = e;
- }
- }, function() {
- isDone = true;
- values[1] && o.onCompleted();
- }), subject.subscribe(function(x) {
- next(x, 1);
- }, function(e) {
- o.onError(e);
- }, function() {
- isDone = true;
- next(true, 1);
- }));
- }, source);
- }
- var PausableBufferedObservable = (function(__super__) {
- inherits(PausableBufferedObservable, __super__);
- function subscribe(o) {
- var q = [],
- previousShouldFire;
- var subscription = combineLatestSource(this.source, this.pauser.distinctUntilChanged().startWith(false), function(data, shouldFire) {
- return {
- data: data,
- shouldFire: shouldFire
- };
- }).subscribe(function(results) {
- if (previousShouldFire !== undefined && results.shouldFire != previousShouldFire) {
- previousShouldFire = results.shouldFire;
- if (results.shouldFire) {
- while (q.length > 0) {
- o.onNext(q.shift());
- }
- }
- } else {
- previousShouldFire = results.shouldFire;
- if (results.shouldFire) {
- o.onNext(results.data);
- } else {
- q.push(results.data);
- }
- }
- }, function(err) {
- while (q.length > 0) {
- o.onNext(q.shift());
- }
- o.onError(err);
- }, function() {
- while (q.length > 0) {
- o.onNext(q.shift());
- }
- o.onCompleted();
- });
- return subscription;
- }
- function PausableBufferedObservable(source, pauser) {
- this.source = source;
- this.controller = new Subject();
- if (pauser && pauser.subscribe) {
- this.pauser = this.controller.merge(pauser);
- } else {
- this.pauser = this.controller;
- }
- __super__.call(this, subscribe, source);
- }
- PausableBufferedObservable.prototype.pause = function() {
- this.controller.onNext(false);
- };
- PausableBufferedObservable.prototype.resume = function() {
- this.controller.onNext(true);
- };
- return PausableBufferedObservable;
- }(Observable));
- observableProto.pausableBuffered = function(subject) {
- return new PausableBufferedObservable(this, subject);
- };
- var ControlledObservable = (function(__super__) {
- inherits(ControlledObservable, __super__);
- function subscribe(observer) {
- return this.source.subscribe(observer);
- }
- function ControlledObservable(source, enableQueue) {
- __super__.call(this, subscribe, source);
- this.subject = new ControlledSubject(enableQueue);
- this.source = source.multicast(this.subject).refCount();
- }
- ControlledObservable.prototype.request = function(numberOfItems) {
- if (numberOfItems == null) {
- numberOfItems = -1;
- }
- return this.subject.request(numberOfItems);
- };
- return ControlledObservable;
- }(Observable));
- var ControlledSubject = (function(__super__) {
- function subscribe(observer) {
- return this.subject.subscribe(observer);
- }
- inherits(ControlledSubject, __super__);
- function ControlledSubject(enableQueue) {
- enableQueue == null && (enableQueue = true);
- __super__.call(this, subscribe);
- this.subject = new Subject();
- this.enableQueue = enableQueue;
- this.queue = enableQueue ? [] : null;
- this.requestedCount = 0;
- this.requestedDisposable = disposableEmpty;
- this.error = null;
- this.hasFailed = false;
- this.hasCompleted = false;
- }
- addProperties(ControlledSubject.prototype, Observer, {
- onCompleted: function() {
- this.hasCompleted = true;
- if (!this.enableQueue || this.queue.length === 0)
- this.subject.onCompleted();
- else
- this.queue.push(Rx.Notification.createOnCompleted());
- },
- onError: function(error) {
- this.hasFailed = true;
- this.error = error;
- if (!this.enableQueue || this.queue.length === 0)
- this.subject.onError(error);
- else
- this.queue.push(Rx.Notification.createOnError(error));
- },
- onNext: function(value) {
- var hasRequested = false;
- if (this.requestedCount === 0) {
- this.enableQueue && this.queue.push(Rx.Notification.createOnNext(value));
- } else {
- (this.requestedCount !== -1 && this.requestedCount-- === 0) && this.disposeCurrentRequest();
- hasRequested = true;
- }
- hasRequested && this.subject.onNext(value);
- },
- _processRequest: function(numberOfItems) {
- if (this.enableQueue) {
- while ((this.queue.length >= numberOfItems && numberOfItems > 0) || (this.queue.length > 0 && this.queue[0].kind !== 'N')) {
- var first = this.queue.shift();
- first.accept(this.subject);
- if (first.kind === 'N')
- numberOfItems--;
- else {
- this.disposeCurrentRequest();
- this.queue = [];
- }
- }
- return {
- numberOfItems: numberOfItems,
- returnValue: this.queue.length !== 0
- };
- }
- return {
- numberOfItems: numberOfItems,
- returnValue: false
- };
- },
- request: function(number) {
- this.disposeCurrentRequest();
- var self = this,
- r = this._processRequest(number);
- var number = r.numberOfItems;
- if (!r.returnValue) {
- this.requestedCount = number;
- this.requestedDisposable = disposableCreate(function() {
- self.requestedCount = 0;
- });
- return this.requestedDisposable;
- } else {
- return disposableEmpty;
- }
- },
- disposeCurrentRequest: function() {
- this.requestedDisposable.dispose();
- this.requestedDisposable = disposableEmpty;
- }
- });
- return ControlledSubject;
- }(Observable));
- observableProto.controlled = function(enableQueue) {
- if (enableQueue == null) {
- enableQueue = true;
- }
- return new ControlledObservable(this, enableQueue);
- };
- var StopAndWaitObservable = (function(__super__) {
- function subscribe(observer) {
- this.subscription = this.source.subscribe(new StopAndWaitObserver(observer, this, this.subscription));
- var self = this;
- timeoutScheduler.schedule(function() {
- self.source.request(1);
- });
- return this.subscription;
- }
- inherits(StopAndWaitObservable, __super__);
- function StopAndWaitObservable(source) {
- __super__.call(this, subscribe, source);
- this.source = source;
- }
- var StopAndWaitObserver = (function(__sub__) {
- inherits(StopAndWaitObserver, __sub__);
- function StopAndWaitObserver(observer, observable, cancel) {
- __sub__.call(this);
- this.observer = observer;
- this.observable = observable;
- this.cancel = cancel;
- }
- var stopAndWaitObserverProto = StopAndWaitObserver.prototype;
- stopAndWaitObserverProto.completed = function() {
- this.observer.onCompleted();
- this.dispose();
- };
- stopAndWaitObserverProto.error = function(error) {
- this.observer.onError(error);
- this.dispose();
- };
- stopAndWaitObserverProto.next = function(value) {
- this.observer.onNext(value);
- var self = this;
- timeoutScheduler.schedule(function() {
- self.observable.source.request(1);
- });
- };
- stopAndWaitObserverProto.dispose = function() {
- this.observer = null;
- if (this.cancel) {
- this.cancel.dispose();
- this.cancel = null;
- }
- __sub__.prototype.dispose.call(this);
- };
- return StopAndWaitObserver;
- }(AbstractObserver));
- return StopAndWaitObservable;
- }(Observable));
- ControlledObservable.prototype.stopAndWait = function() {
- return new StopAndWaitObservable(this);
- };
- var WindowedObservable = (function(__super__) {
- function subscribe(observer) {
- this.subscription = this.source.subscribe(new WindowedObserver(observer, this, this.subscription));
- var self = this;
- timeoutScheduler.schedule(function() {
- self.source.request(self.windowSize);
- });
- return this.subscription;
- }
- inherits(WindowedObservable, __super__);
- function WindowedObservable(source, windowSize) {
- __super__.call(this, subscribe, source);
- this.source = source;
- this.windowSize = windowSize;
- }
- var WindowedObserver = (function(__sub__) {
- inherits(WindowedObserver, __sub__);
- function WindowedObserver(observer, observable, cancel) {
- this.observer = observer;
- this.observable = observable;
- this.cancel = cancel;
- this.received = 0;
- }
- var windowedObserverPrototype = WindowedObserver.prototype;
- windowedObserverPrototype.completed = function() {
- this.observer.onCompleted();
- this.dispose();
- };
- windowedObserverPrototype.error = function(error) {
- this.observer.onError(error);
- this.dispose();
- };
- windowedObserverPrototype.next = function(value) {
- this.observer.onNext(value);
- this.received = ++this.received % this.observable.windowSize;
- if (this.received === 0) {
- var self = this;
- timeoutScheduler.schedule(function() {
- self.observable.source.request(self.observable.windowSize);
- });
- }
- };
- windowedObserverPrototype.dispose = function() {
- this.observer = null;
- if (this.cancel) {
- this.cancel.dispose();
- this.cancel = null;
- }
- __sub__.prototype.dispose.call(this);
- };
- return WindowedObserver;
- }(AbstractObserver));
- return WindowedObservable;
- }(Observable));
- ControlledObservable.prototype.windowed = function(windowSize) {
- return new WindowedObservable(this, windowSize);
- };
- observableProto.pipe = function(dest) {
- var source = this.pausableBuffered();
- function onDrain() {
- source.resume();
- }
- dest.addListener('drain', onDrain);
- source.subscribe(function(x) {
- !dest.write(String(x)) && source.pause();
- }, function(err) {
- dest.emit('error', err);
- }, function() {
- !dest._isStdio && dest.end();
- dest.removeListener('drain', onDrain);
- });
- source.resume();
- return dest;
- };
- observableProto.multicast = function(subjectOrSubjectSelector, selector) {
- var source = this;
- return typeof subjectOrSubjectSelector === 'function' ? new AnonymousObservable(function(observer) {
- var connectable = source.multicast(subjectOrSubjectSelector());
- return new CompositeDisposable(selector(connectable).subscribe(observer), connectable.connect());
- }, source) : new ConnectableObservable(source, subjectOrSubjectSelector);
- };
- observableProto.publish = function(selector) {
- return selector && isFunction(selector) ? this.multicast(function() {
- return new Subject();
- }, selector) : this.multicast(new Subject());
- };
- observableProto.share = function() {
- return this.publish().refCount();
- };
- observableProto.publishLast = function(selector) {
- return selector && isFunction(selector) ? this.multicast(function() {
- return new AsyncSubject();
- }, selector) : this.multicast(new AsyncSubject());
- };
- observableProto.publishValue = function(initialValueOrSelector, initialValue) {
- return arguments.length === 2 ? this.multicast(function() {
- return new BehaviorSubject(initialValue);
- }, initialValueOrSelector) : this.multicast(new BehaviorSubject(initialValueOrSelector));
- };
- observableProto.shareValue = function(initialValue) {
- return this.publishValue(initialValue).refCount();
- };
- observableProto.replay = function(selector, bufferSize, windowSize, scheduler) {
- return selector && isFunction(selector) ? this.multicast(function() {
- return new ReplaySubject(bufferSize, windowSize, scheduler);
- }, selector) : this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));
- };
- observableProto.shareReplay = function(bufferSize, windowSize, scheduler) {
- return this.replay(null, bufferSize, windowSize, scheduler).refCount();
- };
- var InnerSubscription = function(subject, observer) {
- this.subject = subject;
- this.observer = observer;
- };
- InnerSubscription.prototype.dispose = function() {
- if (!this.subject.isDisposed && this.observer !== null) {
- var idx = this.subject.observers.indexOf(this.observer);
- this.subject.observers.splice(idx, 1);
- this.observer = null;
- }
- };
- var BehaviorSubject = Rx.BehaviorSubject = (function(__super__) {
- function subscribe(observer) {
- checkDisposed(this);
- if (!this.isStopped) {
- this.observers.push(observer);
- observer.onNext(this.value);
- return new InnerSubscription(this, observer);
- }
- if (this.hasError) {
- observer.onError(this.error);
- } else {
- observer.onCompleted();
- }
- return disposableEmpty;
- }
- inherits(BehaviorSubject, __super__);
- function BehaviorSubject(value) {
- __super__.call(this, subscribe);
- this.value = value, this.observers = [], this.isDisposed = false, this.isStopped = false, this.hasError = false;
- }
- addProperties(BehaviorSubject.prototype, Observer, {
- getValue: function() {
- checkDisposed(this);
- if (this.hasError) {
- throw this.error;
- }
- return this.value;
- },
- hasObservers: function() {
- return this.observers.length > 0;
- },
- onCompleted: function() {
- checkDisposed(this);
- if (this.isStopped) {
- return ;
- }
- this.isStopped = true;
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- os[i].onCompleted();
- }
- this.observers.length = 0;
- },
- onError: function(error) {
- checkDisposed(this);
- if (this.isStopped) {
- return ;
- }
- this.isStopped = true;
- this.hasError = true;
- this.error = error;
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- os[i].onError(error);
- }
- this.observers.length = 0;
- },
- onNext: function(value) {
- checkDisposed(this);
- if (this.isStopped) {
- return ;
- }
- this.value = value;
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- os[i].onNext(value);
- }
- },
- dispose: function() {
- this.isDisposed = true;
- this.observers = null;
- this.value = null;
- this.exception = null;
- }
- });
- return BehaviorSubject;
- }(Observable));
- var ReplaySubject = Rx.ReplaySubject = (function(__super__) {
- var maxSafeInteger = Math.pow(2, 53) - 1;
- function createRemovableDisposable(subject, observer) {
- return disposableCreate(function() {
- observer.dispose();
- !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);
- });
- }
- function subscribe(observer) {
- var so = new ScheduledObserver(this.scheduler, observer),
- subscription = createRemovableDisposable(this, so);
- checkDisposed(this);
- this._trim(this.scheduler.now());
- this.observers.push(so);
- for (var i = 0,
- len = this.q.length; i < len; i++) {
- so.onNext(this.q[i].value);
- }
- if (this.hasError) {
- so.onError(this.error);
- } else if (this.isStopped) {
- so.onCompleted();
- }
- so.ensureActive();
- return subscription;
- }
- inherits(ReplaySubject, __super__);
- function ReplaySubject(bufferSize, windowSize, scheduler) {
- this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;
- this.windowSize = windowSize == null ? maxSafeInteger : windowSize;
- this.scheduler = scheduler || currentThreadScheduler;
- this.q = [];
- this.observers = [];
- this.isStopped = false;
- this.isDisposed = false;
- this.hasError = false;
- this.error = null;
- __super__.call(this, subscribe);
- }
- addProperties(ReplaySubject.prototype, Observer.prototype, {
- hasObservers: function() {
- return this.observers.length > 0;
- },
- _trim: function(now) {
- while (this.q.length > this.bufferSize) {
- this.q.shift();
- }
- while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {
- this.q.shift();
- }
- },
- onNext: function(value) {
- checkDisposed(this);
- if (this.isStopped) {
- return ;
- }
- var now = this.scheduler.now();
- this.q.push({
- interval: now,
- value: value
- });
- this._trim(now);
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- var observer = os[i];
- observer.onNext(value);
- observer.ensureActive();
- }
- },
- onError: function(error) {
- checkDisposed(this);
- if (this.isStopped) {
- return ;
- }
- this.isStopped = true;
- this.error = error;
- this.hasError = true;
- var now = this.scheduler.now();
- this._trim(now);
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- var observer = os[i];
- observer.onError(error);
- observer.ensureActive();
- }
- this.observers.length = 0;
- },
- onCompleted: function() {
- checkDisposed(this);
- if (this.isStopped) {
- return ;
- }
- this.isStopped = true;
- var now = this.scheduler.now();
- this._trim(now);
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- var observer = os[i];
- observer.onCompleted();
- observer.ensureActive();
- }
- this.observers.length = 0;
- },
- dispose: function() {
- this.isDisposed = true;
- this.observers = null;
- }
- });
- return ReplaySubject;
- }(Observable));
- var ConnectableObservable = Rx.ConnectableObservable = (function(__super__) {
- inherits(ConnectableObservable, __super__);
- function ConnectableObservable(source, subject) {
- var hasSubscription = false,
- subscription,
- sourceObservable = source.asObservable();
- this.connect = function() {
- if (!hasSubscription) {
- hasSubscription = true;
- subscription = new CompositeDisposable(sourceObservable.subscribe(subject), disposableCreate(function() {
- hasSubscription = false;
- }));
- }
- return subscription;
- };
- __super__.call(this, function(o) {
- return subject.subscribe(o);
- });
- }
- ConnectableObservable.prototype.refCount = function() {
- var connectableSubscription,
- count = 0,
- source = this;
- return new AnonymousObservable(function(observer) {
- var shouldConnect = ++count === 1,
- subscription = source.subscribe(observer);
- shouldConnect && (connectableSubscription = source.connect());
- return function() {
- subscription.dispose();
- --count === 0 && connectableSubscription.dispose();
- };
- });
- };
- return ConnectableObservable;
- }(Observable));
- var Dictionary = (function() {
- 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],
- noSuchkey = "no such key",
- duplicatekey = "duplicate key";
- function isPrime(candidate) {
- if ((candidate & 1) === 0) {
- return candidate === 2;
- }
- var num1 = Math.sqrt(candidate),
- num2 = 3;
- while (num2 <= num1) {
- if (candidate % num2 === 0) {
- return false;
- }
- num2 += 2;
- }
- return true;
- }
- function getPrime(min) {
- var index,
- num,
- candidate;
- for (index = 0; index < primes.length; ++index) {
- num = primes[index];
- if (num >= min) {
- return num;
- }
- }
- candidate = min | 1;
- while (candidate < primes[primes.length - 1]) {
- if (isPrime(candidate)) {
- return candidate;
- }
- candidate += 2;
- }
- return min;
- }
- function stringHashFn(str) {
- var hash = 757602046;
- if (!str.length) {
- return hash;
- }
- for (var i = 0,
- len = str.length; i < len; i++) {
- var character = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + character;
- hash = hash & hash;
- }
- return hash;
- }
- function numberHashFn(key) {
- var c2 = 0x27d4eb2d;
- key = (key ^ 61) ^ (key >>> 16);
- key = key + (key << 3);
- key = key ^ (key >>> 4);
- key = key * c2;
- key = key ^ (key >>> 15);
- return key;
- }
- var getHashCode = (function() {
- var uniqueIdCounter = 0;
- return function(obj) {
- if (obj == null) {
- throw new Error(noSuchkey);
- }
- if (typeof obj === 'string') {
- return stringHashFn(obj);
- }
- if (typeof obj === 'number') {
- return numberHashFn(obj);
- }
- if (typeof obj === 'boolean') {
- return obj === true ? 1 : 0;
- }
- if (obj instanceof Date) {
- return numberHashFn(obj.valueOf());
- }
- if (obj instanceof RegExp) {
- return stringHashFn(obj.toString());
- }
- if (typeof obj.valueOf === 'function') {
- var valueOf = obj.valueOf();
- if (typeof valueOf === 'number') {
- return numberHashFn(valueOf);
- }
- if (typeof valueOf === 'string') {
- return stringHashFn(valueOf);
- }
- }
- if (obj.hashCode) {
- return obj.hashCode();
- }
- var id = 17 * uniqueIdCounter++;
- obj.hashCode = function() {
- return id;
- };
- return id;
- };
- }());
- function newEntry() {
- return {
- key: null,
- value: null,
- next: 0,
- hashCode: 0
- };
- }
- function Dictionary(capacity, comparer) {
- if (capacity < 0) {
- throw new ArgumentOutOfRangeError();
- }
- if (capacity > 0) {
- this._initialize(capacity);
- }
- this.comparer = comparer || defaultComparer;
- this.freeCount = 0;
- this.size = 0;
- this.freeList = -1;
- }
- var dictionaryProto = Dictionary.prototype;
- dictionaryProto._initialize = function(capacity) {
- var prime = getPrime(capacity),
- i;
- this.buckets = new Array(prime);
- this.entries = new Array(prime);
- for (i = 0; i < prime; i++) {
- this.buckets[i] = -1;
- this.entries[i] = newEntry();
- }
- this.freeList = -1;
- };
- dictionaryProto.add = function(key, value) {
- this._insert(key, value, true);
- };
- dictionaryProto._insert = function(key, value, add) {
- if (!this.buckets) {
- this._initialize(0);
- }
- var index3,
- num = getHashCode(key) & 2147483647,
- index1 = num % this.buckets.length;
- for (var index2 = this.buckets[index1]; index2 >= 0; index2 = this.entries[index2].next) {
- if (this.entries[index2].hashCode === num && this.comparer(this.entries[index2].key, key)) {
- if (add) {
- throw new Error(duplicatekey);
- }
- this.entries[index2].value = value;
- return ;
- }
- }
- if (this.freeCount > 0) {
- index3 = this.freeList;
- this.freeList = this.entries[index3].next;
- --this.freeCount;
- } else {
- if (this.size === this.entries.length) {
- this._resize();
- index1 = num % this.buckets.length;
- }
- index3 = this.size;
- ++this.size;
- }
- this.entries[index3].hashCode = num;
- this.entries[index3].next = this.buckets[index1];
- this.entries[index3].key = key;
- this.entries[index3].value = value;
- this.buckets[index1] = index3;
- };
- dictionaryProto._resize = function() {
- var prime = getPrime(this.size * 2),
- numArray = new Array(prime);
- for (index = 0; index < numArray.length; ++index) {
- numArray[index] = -1;
- }
- var entryArray = new Array(prime);
- for (index = 0; index < this.size; ++index) {
- entryArray[index] = this.entries[index];
- }
- for (var index = this.size; index < prime; ++index) {
- entryArray[index] = newEntry();
- }
- for (var index1 = 0; index1 < this.size; ++index1) {
- var index2 = entryArray[index1].hashCode % prime;
- entryArray[index1].next = numArray[index2];
- numArray[index2] = index1;
- }
- this.buckets = numArray;
- this.entries = entryArray;
- };
- dictionaryProto.remove = function(key) {
- if (this.buckets) {
- var num = getHashCode(key) & 2147483647,
- index1 = num % this.buckets.length,
- index2 = -1;
- for (var index3 = this.buckets[index1]; index3 >= 0; index3 = this.entries[index3].next) {
- if (this.entries[index3].hashCode === num && this.comparer(this.entries[index3].key, key)) {
- if (index2 < 0) {
- this.buckets[index1] = this.entries[index3].next;
- } else {
- this.entries[index2].next = this.entries[index3].next;
- }
- this.entries[index3].hashCode = -1;
- this.entries[index3].next = this.freeList;
- this.entries[index3].key = null;
- this.entries[index3].value = null;
- this.freeList = index3;
- ++this.freeCount;
- return true;
- } else {
- index2 = index3;
- }
- }
- }
- return false;
- };
- dictionaryProto.clear = function() {
- var index,
- len;
- if (this.size <= 0) {
- return ;
- }
- for (index = 0, len = this.buckets.length; index < len; ++index) {
- this.buckets[index] = -1;
- }
- for (index = 0; index < this.size; ++index) {
- this.entries[index] = newEntry();
- }
- this.freeList = -1;
- this.size = 0;
- };
- dictionaryProto._findEntry = function(key) {
- if (this.buckets) {
- var num = getHashCode(key) & 2147483647;
- for (var index = this.buckets[num % this.buckets.length]; index >= 0; index = this.entries[index].next) {
- if (this.entries[index].hashCode === num && this.comparer(this.entries[index].key, key)) {
- return index;
- }
- }
- }
- return -1;
- };
- dictionaryProto.count = function() {
- return this.size - this.freeCount;
- };
- dictionaryProto.tryGetValue = function(key) {
- var entry = this._findEntry(key);
- return entry >= 0 ? this.entries[entry].value : undefined;
- };
- dictionaryProto.getValues = function() {
- var index = 0,
- results = [];
- if (this.entries) {
- for (var index1 = 0; index1 < this.size; index1++) {
- if (this.entries[index1].hashCode >= 0) {
- results[index++] = this.entries[index1].value;
- }
- }
- }
- return results;
- };
- dictionaryProto.get = function(key) {
- var entry = this._findEntry(key);
- if (entry >= 0) {
- return this.entries[entry].value;
- }
- throw new Error(noSuchkey);
- };
- dictionaryProto.set = function(key, value) {
- this._insert(key, value, false);
- };
- dictionaryProto.containskey = function(key) {
- return this._findEntry(key) >= 0;
- };
- return Dictionary;
- }());
- observableProto.join = function(right, leftDurationSelector, rightDurationSelector, resultSelector) {
- var left = this;
- return new AnonymousObservable(function(observer) {
- var group = new CompositeDisposable();
- var leftDone = false,
- rightDone = false;
- var leftId = 0,
- rightId = 0;
- var leftMap = new Dictionary(),
- rightMap = new Dictionary();
- group.add(left.subscribe(function(value) {
- var id = leftId++;
- var md = new SingleAssignmentDisposable();
- leftMap.add(id, value);
- group.add(md);
- var expire = function() {
- leftMap.remove(id) && leftMap.count() === 0 && leftDone && observer.onCompleted();
- group.remove(md);
- };
- var duration;
- try {
- duration = leftDurationSelector(value);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));
- rightMap.getValues().forEach(function(v) {
- var result;
- try {
- result = resultSelector(value, v);
- } catch (exn) {
- observer.onError(exn);
- return ;
- }
- observer.onNext(result);
- });
- }, observer.onError.bind(observer), function() {
- leftDone = true;
- (rightDone || leftMap.count() === 0) && observer.onCompleted();
- }));
- group.add(right.subscribe(function(value) {
- var id = rightId++;
- var md = new SingleAssignmentDisposable();
- rightMap.add(id, value);
- group.add(md);
- var expire = function() {
- rightMap.remove(id) && rightMap.count() === 0 && rightDone && observer.onCompleted();
- group.remove(md);
- };
- var duration;
- try {
- duration = rightDurationSelector(value);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));
- leftMap.getValues().forEach(function(v) {
- var result;
- try {
- result = resultSelector(v, value);
- } catch (exn) {
- observer.onError(exn);
- return ;
- }
- observer.onNext(result);
- });
- }, observer.onError.bind(observer), function() {
- rightDone = true;
- (leftDone || rightMap.count() === 0) && observer.onCompleted();
- }));
- return group;
- }, left);
- };
- observableProto.groupJoin = function(right, leftDurationSelector, rightDurationSelector, resultSelector) {
- var left = this;
- return new AnonymousObservable(function(observer) {
- var group = new CompositeDisposable();
- var r = new RefCountDisposable(group);
- var leftMap = new Dictionary(),
- rightMap = new Dictionary();
- var leftId = 0,
- rightId = 0;
- function handleError(e) {
- return function(v) {
- v.onError(e);
- };
- }
- ;
- group.add(left.subscribe(function(value) {
- var s = new Subject();
- var id = leftId++;
- leftMap.add(id, s);
- var result;
- try {
- result = resultSelector(value, addRef(s, r));
- } catch (e) {
- leftMap.getValues().forEach(handleError(e));
- observer.onError(e);
- return ;
- }
- observer.onNext(result);
- rightMap.getValues().forEach(function(v) {
- s.onNext(v);
- });
- var md = new SingleAssignmentDisposable();
- group.add(md);
- var expire = function() {
- leftMap.remove(id) && s.onCompleted();
- group.remove(md);
- };
- var duration;
- try {
- duration = leftDurationSelector(value);
- } catch (e) {
- leftMap.getValues().forEach(handleError(e));
- observer.onError(e);
- return ;
- }
- md.setDisposable(duration.take(1).subscribe(noop, function(e) {
- leftMap.getValues().forEach(handleError(e));
- observer.onError(e);
- }, expire));
- }, function(e) {
- leftMap.getValues().forEach(handleError(e));
- observer.onError(e);
- }, observer.onCompleted.bind(observer)));
- group.add(right.subscribe(function(value) {
- var id = rightId++;
- rightMap.add(id, value);
- var md = new SingleAssignmentDisposable();
- group.add(md);
- var expire = function() {
- rightMap.remove(id);
- group.remove(md);
- };
- var duration;
- try {
- duration = rightDurationSelector(value);
- } catch (e) {
- leftMap.getValues().forEach(handleError(e));
- observer.onError(e);
- return ;
- }
- md.setDisposable(duration.take(1).subscribe(noop, function(e) {
- leftMap.getValues().forEach(handleError(e));
- observer.onError(e);
- }, expire));
- leftMap.getValues().forEach(function(v) {
- v.onNext(value);
- });
- }, function(e) {
- leftMap.getValues().forEach(handleError(e));
- observer.onError(e);
- }));
- return r;
- }, left);
- };
- observableProto.buffer = function(bufferOpeningsOrClosingSelector, bufferClosingSelector) {
- return this.window.apply(this, arguments).selectMany(function(x) {
- return x.toArray();
- });
- };
- observableProto.window = function(windowOpeningsOrClosingSelector, windowClosingSelector) {
- if (arguments.length === 1 && typeof arguments[0] !== 'function') {
- return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);
- }
- return typeof windowOpeningsOrClosingSelector === 'function' ? observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) : observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);
- };
- function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {
- return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function(_, win) {
- return win;
- });
- }
- function observableWindowWithBoundaries(windowBoundaries) {
- var source = this;
- return new AnonymousObservable(function(observer) {
- var win = new Subject(),
- d = new CompositeDisposable(),
- r = new RefCountDisposable(d);
- observer.onNext(addRef(win, r));
- d.add(source.subscribe(function(x) {
- win.onNext(x);
- }, function(err) {
- win.onError(err);
- observer.onError(err);
- }, function() {
- win.onCompleted();
- observer.onCompleted();
- }));
- isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));
- d.add(windowBoundaries.subscribe(function(w) {
- win.onCompleted();
- win = new Subject();
- observer.onNext(addRef(win, r));
- }, function(err) {
- win.onError(err);
- observer.onError(err);
- }, function() {
- win.onCompleted();
- observer.onCompleted();
- }));
- return r;
- }, source);
- }
- function observableWindowWithClosingSelector(windowClosingSelector) {
- var source = this;
- return new AnonymousObservable(function(observer) {
- var m = new SerialDisposable(),
- d = new CompositeDisposable(m),
- r = new RefCountDisposable(d),
- win = new Subject();
- observer.onNext(addRef(win, r));
- d.add(source.subscribe(function(x) {
- win.onNext(x);
- }, function(err) {
- win.onError(err);
- observer.onError(err);
- }, function() {
- win.onCompleted();
- observer.onCompleted();
- }));
- function createWindowClose() {
- var windowClose;
- try {
- windowClose = windowClosingSelector();
- } catch (e) {
- observer.onError(e);
- return ;
- }
- isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));
- var m1 = new SingleAssignmentDisposable();
- m.setDisposable(m1);
- m1.setDisposable(windowClose.take(1).subscribe(noop, function(err) {
- win.onError(err);
- observer.onError(err);
- }, function() {
- win.onCompleted();
- win = new Subject();
- observer.onNext(addRef(win, r));
- createWindowClose();
- }));
- }
- createWindowClose();
- return r;
- }, source);
- }
- observableProto.pairwise = function() {
- var source = this;
- return new AnonymousObservable(function(observer) {
- var previous,
- hasPrevious = false;
- return source.subscribe(function(x) {
- if (hasPrevious) {
- observer.onNext([previous, x]);
- } else {
- hasPrevious = true;
- }
- previous = x;
- }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
- }, source);
- };
- observableProto.partition = function(predicate, thisArg) {
- return [this.filter(predicate, thisArg), this.filter(function(x, i, o) {
- return !predicate.call(thisArg, x, i, o);
- })];
- };
- function enumerableWhile(condition, source) {
- return new Enumerable(function() {
- return new Enumerator(function() {
- return condition() ? {
- done: false,
- value: source
- } : {
- done: true,
- value: undefined
- };
- });
- });
- }
- observableProto.letBind = observableProto['let'] = function(func) {
- return func(this);
- };
- Observable['if'] = Observable.ifThen = function(condition, thenSource, elseSourceOrScheduler) {
- return observableDefer(function() {
- elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());
- isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));
- isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));
- typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));
- return condition() ? thenSource : elseSourceOrScheduler;
- });
- };
- Observable['for'] = Observable.forIn = function(sources, resultSelector, thisArg) {
- return enumerableOf(sources, resultSelector, thisArg).concat();
- };
- var observableWhileDo = Observable['while'] = Observable.whileDo = function(condition, source) {
- isPromise(source) && (source = observableFromPromise(source));
- return enumerableWhile(condition, source).concat();
- };
- observableProto.doWhile = function(condition) {
- return observableConcat([this, observableWhileDo(condition, this)]);
- };
- Observable['case'] = Observable.switchCase = function(selector, sources, defaultSourceOrScheduler) {
- return observableDefer(function() {
- isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));
- defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());
- typeof defaultSourceOrScheduler.now === 'function' && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));
- var result = sources[selector()];
- isPromise(result) && (result = observableFromPromise(result));
- return result || defaultSourceOrScheduler;
- });
- };
- observableProto.expand = function(selector, scheduler) {
- isScheduler(scheduler) || (scheduler = immediateScheduler);
- var source = this;
- return new AnonymousObservable(function(observer) {
- var q = [],
- m = new SerialDisposable(),
- d = new CompositeDisposable(m),
- activeCount = 0,
- isAcquired = false;
- var ensureActive = function() {
- var isOwner = false;
- if (q.length > 0) {
- isOwner = !isAcquired;
- isAcquired = true;
- }
- if (isOwner) {
- m.setDisposable(scheduler.scheduleRecursive(function(self) {
- var work;
- if (q.length > 0) {
- work = q.shift();
- } else {
- isAcquired = false;
- return ;
- }
- var m1 = new SingleAssignmentDisposable();
- d.add(m1);
- m1.setDisposable(work.subscribe(function(x) {
- observer.onNext(x);
- var result = null;
- try {
- result = selector(x);
- } catch (e) {
- observer.onError(e);
- }
- q.push(result);
- activeCount++;
- ensureActive();
- }, observer.onError.bind(observer), function() {
- d.remove(m1);
- activeCount--;
- if (activeCount === 0) {
- observer.onCompleted();
- }
- }));
- self();
- }));
- }
- };
- q.push(source);
- activeCount++;
- ensureActive();
- return d;
- }, this);
- };
- Observable.forkJoin = function() {
- var allSources = [];
- if (Array.isArray(arguments[0])) {
- allSources = arguments[0];
- } else {
- for (var i = 0,
- len = arguments.length; i < len; i++) {
- allSources.push(arguments[i]);
- }
- }
- return new AnonymousObservable(function(subscriber) {
- var count = allSources.length;
- if (count === 0) {
- subscriber.onCompleted();
- return disposableEmpty;
- }
- var group = new CompositeDisposable(),
- finished = false,
- hasResults = new Array(count),
- hasCompleted = new Array(count),
- results = new Array(count);
- for (var idx = 0; idx < count; idx++) {
- (function(i) {
- var source = allSources[i];
- isPromise(source) && (source = observableFromPromise(source));
- group.add(source.subscribe(function(value) {
- if (!finished) {
- hasResults[i] = true;
- results[i] = value;
- }
- }, function(e) {
- finished = true;
- subscriber.onError(e);
- group.dispose();
- }, function() {
- if (!finished) {
- if (!hasResults[i]) {
- subscriber.onCompleted();
- return ;
- }
- hasCompleted[i] = true;
- for (var ix = 0; ix < count; ix++) {
- if (!hasCompleted[ix]) {
- return ;
- }
- }
- finished = true;
- subscriber.onNext(results);
- subscriber.onCompleted();
- }
- }));
- })(idx);
- }
- return group;
- });
- };
- observableProto.forkJoin = function(second, resultSelector) {
- var first = this;
- return new AnonymousObservable(function(observer) {
- var leftStopped = false,
- rightStopped = false,
- hasLeft = false,
- hasRight = false,
- lastLeft,
- lastRight,
- leftSubscription = new SingleAssignmentDisposable(),
- rightSubscription = new SingleAssignmentDisposable();
- isPromise(second) && (second = observableFromPromise(second));
- leftSubscription.setDisposable(first.subscribe(function(left) {
- hasLeft = true;
- lastLeft = left;
- }, function(err) {
- rightSubscription.dispose();
- observer.onError(err);
- }, function() {
- leftStopped = true;
- if (rightStopped) {
- if (!hasLeft) {
- observer.onCompleted();
- } else if (!hasRight) {
- observer.onCompleted();
- } else {
- var result;
- try {
- result = resultSelector(lastLeft, lastRight);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- observer.onNext(result);
- observer.onCompleted();
- }
- }
- }));
- rightSubscription.setDisposable(second.subscribe(function(right) {
- hasRight = true;
- lastRight = right;
- }, function(err) {
- leftSubscription.dispose();
- observer.onError(err);
- }, function() {
- rightStopped = true;
- if (leftStopped) {
- if (!hasLeft) {
- observer.onCompleted();
- } else if (!hasRight) {
- observer.onCompleted();
- } else {
- var result;
- try {
- result = resultSelector(lastLeft, lastRight);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- observer.onNext(result);
- observer.onCompleted();
- }
- }
- }));
- return new CompositeDisposable(leftSubscription, rightSubscription);
- }, first);
- };
- observableProto.manySelect = function(selector, scheduler) {
- isScheduler(scheduler) || (scheduler = immediateScheduler);
- var source = this;
- return observableDefer(function() {
- var chain;
- return source.map(function(x) {
- var curr = new ChainObservable(x);
- chain && chain.onNext(x);
- chain = curr;
- return curr;
- }).tap(noop, function(e) {
- chain && chain.onError(e);
- }, function() {
- chain && chain.onCompleted();
- }).observeOn(scheduler).map(selector);
- }, source);
- };
- var ChainObservable = (function(__super__) {
- function subscribe(observer) {
- var self = this,
- g = new CompositeDisposable();
- g.add(currentThreadScheduler.schedule(function() {
- observer.onNext(self.head);
- g.add(self.tail.mergeAll().subscribe(observer));
- }));
- return g;
- }
- inherits(ChainObservable, __super__);
- function ChainObservable(head) {
- __super__.call(this, subscribe);
- this.head = head;
- this.tail = new AsyncSubject();
- }
- addProperties(ChainObservable.prototype, Observer, {
- onCompleted: function() {
- this.onNext(Observable.empty());
- },
- onError: function(e) {
- this.onNext(Observable.throwError(e));
- },
- onNext: function(v) {
- this.tail.onNext(v);
- this.tail.onCompleted();
- }
- });
- return ChainObservable;
- }(Observable));
- var Map = root.Map || (function() {
- function Map() {
- this._keys = [];
- this._values = [];
- }
- Map.prototype.get = function(key) {
- var i = this._keys.indexOf(key);
- return i !== -1 ? this._values[i] : undefined;
- };
- Map.prototype.set = function(key, value) {
- var i = this._keys.indexOf(key);
- i !== -1 && (this._values[i] = value);
- this._values[this._keys.push(key) - 1] = value;
- };
- Map.prototype.forEach = function(callback, thisArg) {
- for (var i = 0,
- len = this._keys.length; i < len; i++) {
- callback.call(thisArg, this._values[i], this._keys[i]);
- }
- };
- return Map;
- }());
- function Pattern(patterns) {
- this.patterns = patterns;
- }
- Pattern.prototype.and = function(other) {
- return new Pattern(this.patterns.concat(other));
- };
- Pattern.prototype.thenDo = function(selector) {
- return new Plan(this, selector);
- };
- function Plan(expression, selector) {
- this.expression = expression;
- this.selector = selector;
- }
- Plan.prototype.activate = function(externalSubscriptions, observer, deactivate) {
- var self = this;
- var joinObservers = [];
- for (var i = 0,
- len = this.expression.patterns.length; i < len; i++) {
- joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], observer.onError.bind(observer)));
- }
- var activePlan = new ActivePlan(joinObservers, function() {
- var result;
- try {
- result = self.selector.apply(self, arguments);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- observer.onNext(result);
- }, function() {
- for (var j = 0,
- jlen = joinObservers.length; j < jlen; j++) {
- joinObservers[j].removeActivePlan(activePlan);
- }
- deactivate(activePlan);
- });
- for (i = 0, len = joinObservers.length; i < len; i++) {
- joinObservers[i].addActivePlan(activePlan);
- }
- return activePlan;
- };
- function planCreateObserver(externalSubscriptions, observable, onError) {
- var entry = externalSubscriptions.get(observable);
- if (!entry) {
- var observer = new JoinObserver(observable, onError);
- externalSubscriptions.set(observable, observer);
- return observer;
- }
- return entry;
- }
- function ActivePlan(joinObserverArray, onNext, onCompleted) {
- this.joinObserverArray = joinObserverArray;
- this.onNext = onNext;
- this.onCompleted = onCompleted;
- this.joinObservers = new Map();
- for (var i = 0,
- len = this.joinObserverArray.length; i < len; i++) {
- var joinObserver = this.joinObserverArray[i];
- this.joinObservers.set(joinObserver, joinObserver);
- }
- }
- ActivePlan.prototype.dequeue = function() {
- this.joinObservers.forEach(function(v) {
- v.queue.shift();
- });
- };
- ActivePlan.prototype.match = function() {
- var i,
- len,
- hasValues = true;
- for (i = 0, len = this.joinObserverArray.length; i < len; i++) {
- if (this.joinObserverArray[i].queue.length === 0) {
- hasValues = false;
- break;
- }
- }
- if (hasValues) {
- var firstValues = [],
- isCompleted = false;
- for (i = 0, len = this.joinObserverArray.length; i < len; i++) {
- firstValues.push(this.joinObserverArray[i].queue[0]);
- this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);
- }
- if (isCompleted) {
- this.onCompleted();
- } else {
- this.dequeue();
- var values = [];
- for (i = 0, len = firstValues.length; i < firstValues.length; i++) {
- values.push(firstValues[i].value);
- }
- this.onNext.apply(this, values);
- }
- }
- };
- var JoinObserver = (function(__super__) {
- inherits(JoinObserver, __super__);
- function JoinObserver(source, onError) {
- __super__.call(this);
- this.source = source;
- this.onError = onError;
- this.queue = [];
- this.activePlans = [];
- this.subscription = new SingleAssignmentDisposable();
- this.isDisposed = false;
- }
- var JoinObserverPrototype = JoinObserver.prototype;
- JoinObserverPrototype.next = function(notification) {
- if (!this.isDisposed) {
- if (notification.kind === 'E') {
- return this.onError(notification.exception);
- }
- this.queue.push(notification);
- var activePlans = this.activePlans.slice(0);
- for (var i = 0,
- len = activePlans.length; i < len; i++) {
- activePlans[i].match();
- }
- }
- };
- JoinObserverPrototype.error = noop;
- JoinObserverPrototype.completed = noop;
- JoinObserverPrototype.addActivePlan = function(activePlan) {
- this.activePlans.push(activePlan);
- };
- JoinObserverPrototype.subscribe = function() {
- this.subscription.setDisposable(this.source.materialize().subscribe(this));
- };
- JoinObserverPrototype.removeActivePlan = function(activePlan) {
- this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);
- this.activePlans.length === 0 && this.dispose();
- };
- JoinObserverPrototype.dispose = function() {
- __super__.prototype.dispose.call(this);
- if (!this.isDisposed) {
- this.isDisposed = true;
- this.subscription.dispose();
- }
- };
- return JoinObserver;
- }(AbstractObserver));
- observableProto.and = function(right) {
- return new Pattern([this, right]);
- };
- observableProto.thenDo = function(selector) {
- return new Pattern([this]).thenDo(selector);
- };
- Observable.when = function() {
- var len = arguments.length,
- plans;
- if (Array.isArray(arguments[0])) {
- plans = arguments[0];
- } else {
- plans = new Array(len);
- for (var i = 0; i < len; i++) {
- plans[i] = arguments[i];
- }
- }
- return new AnonymousObservable(function(o) {
- var activePlans = [],
- externalSubscriptions = new Map();
- var outObserver = observerCreate(function(x) {
- o.onNext(x);
- }, function(err) {
- externalSubscriptions.forEach(function(v) {
- v.onError(err);
- });
- o.onError(err);
- }, function(x) {
- o.onCompleted();
- });
- try {
- for (var i = 0,
- len = plans.length; i < len; i++) {
- activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function(activePlan) {
- var idx = activePlans.indexOf(activePlan);
- activePlans.splice(idx, 1);
- activePlans.length === 0 && o.onCompleted();
- }));
- }
- } catch (e) {
- observableThrow(e).subscribe(o);
- }
- var group = new CompositeDisposable();
- externalSubscriptions.forEach(function(joinObserver) {
- joinObserver.subscribe();
- group.add(joinObserver);
- });
- return group;
- });
- };
- function observableTimerDate(dueTime, scheduler) {
- return new AnonymousObservable(function(observer) {
- return scheduler.scheduleWithAbsolute(dueTime, function() {
- observer.onNext(0);
- observer.onCompleted();
- });
- });
- }
- function observableTimerDateAndPeriod(dueTime, period, scheduler) {
- return new AnonymousObservable(function(observer) {
- var d = dueTime,
- p = normalizeTime(period);
- return scheduler.scheduleRecursiveWithAbsoluteAndState(0, d, function(count, self) {
- if (p > 0) {
- var now = scheduler.now();
- d = d + p;
- d <= now && (d = now + p);
- }
- observer.onNext(count);
- self(count + 1, d);
- });
- });
- }
- function observableTimerTimeSpan(dueTime, scheduler) {
- return new AnonymousObservable(function(observer) {
- return scheduler.scheduleWithRelative(normalizeTime(dueTime), function() {
- observer.onNext(0);
- observer.onCompleted();
- });
- });
- }
- function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {
- return dueTime === period ? new AnonymousObservable(function(observer) {
- return scheduler.schedulePeriodicWithState(0, period, function(count) {
- observer.onNext(count);
- return count + 1;
- });
- }) : observableDefer(function() {
- return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler);
- });
- }
- var observableinterval = Observable.interval = function(period, scheduler) {
- return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : timeoutScheduler);
- };
- var observableTimer = Observable.timer = function(dueTime, periodOrScheduler, scheduler) {
- var period;
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') {
- period = periodOrScheduler;
- } else if (isScheduler(periodOrScheduler)) {
- scheduler = periodOrScheduler;
- }
- if (dueTime instanceof Date && period === undefined) {
- return observableTimerDate(dueTime.getTime(), scheduler);
- }
- if (dueTime instanceof Date && period !== undefined) {
- period = periodOrScheduler;
- return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler);
- }
- return period === undefined ? observableTimerTimeSpan(dueTime, scheduler) : observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);
- };
- function observableDelayTimeSpan(source, dueTime, scheduler) {
- return new AnonymousObservable(function(observer) {
- var active = false,
- cancelable = new SerialDisposable(),
- exception = null,
- q = [],
- running = false,
- subscription;
- subscription = source.materialize().timestamp(scheduler).subscribe(function(notification) {
- var d,
- shouldRun;
- if (notification.value.kind === 'E') {
- q = [];
- q.push(notification);
- exception = notification.value.exception;
- shouldRun = !running;
- } else {
- q.push({
- value: notification.value,
- timestamp: notification.timestamp + dueTime
- });
- shouldRun = !active;
- active = true;
- }
- if (shouldRun) {
- if (exception !== null) {
- observer.onError(exception);
- } else {
- d = new SingleAssignmentDisposable();
- cancelable.setDisposable(d);
- d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function(self) {
- var e,
- recurseDueTime,
- result,
- shouldRecurse;
- if (exception !== null) {
- return ;
- }
- running = true;
- do {
- result = null;
- if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {
- result = q.shift().value;
- }
- if (result !== null) {
- result.accept(observer);
- }
- } while (result !== null);
- shouldRecurse = false;
- recurseDueTime = 0;
- if (q.length > 0) {
- shouldRecurse = true;
- recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());
- } else {
- active = false;
- }
- e = exception;
- running = false;
- if (e !== null) {
- observer.onError(e);
- } else if (shouldRecurse) {
- self(recurseDueTime);
- }
- }));
- }
- }
- });
- return new CompositeDisposable(subscription, cancelable);
- }, source);
- }
- function observableDelayDate(source, dueTime, scheduler) {
- return observableDefer(function() {
- return observableDelayTimeSpan(source, dueTime - scheduler.now(), scheduler);
- });
- }
- observableProto.delay = function(dueTime, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return dueTime instanceof Date ? observableDelayDate(this, dueTime.getTime(), scheduler) : observableDelayTimeSpan(this, dueTime, scheduler);
- };
- observableProto.debounce = observableProto.throttleWithTimeout = function(dueTime, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- var source = this;
- return new AnonymousObservable(function(observer) {
- var cancelable = new SerialDisposable(),
- hasvalue = false,
- value,
- id = 0;
- var subscription = source.subscribe(function(x) {
- hasvalue = true;
- value = x;
- id++;
- var currentId = id,
- d = new SingleAssignmentDisposable();
- cancelable.setDisposable(d);
- d.setDisposable(scheduler.scheduleWithRelative(dueTime, function() {
- hasvalue && id === currentId && observer.onNext(value);
- hasvalue = false;
- }));
- }, function(e) {
- cancelable.dispose();
- observer.onError(e);
- hasvalue = false;
- id++;
- }, function() {
- cancelable.dispose();
- hasvalue && observer.onNext(value);
- observer.onCompleted();
- hasvalue = false;
- id++;
- });
- return new CompositeDisposable(subscription, cancelable);
- }, this);
- };
- observableProto.throttle = function(dueTime, scheduler) {
- return this.debounce(dueTime, scheduler);
- };
- observableProto.windowWithTime = function(timeSpan, timeShiftOrScheduler, scheduler) {
- var source = this,
- timeShift;
- timeShiftOrScheduler == null && (timeShift = timeSpan);
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- if (typeof timeShiftOrScheduler === 'number') {
- timeShift = timeShiftOrScheduler;
- } else if (isScheduler(timeShiftOrScheduler)) {
- timeShift = timeSpan;
- scheduler = timeShiftOrScheduler;
- }
- return new AnonymousObservable(function(observer) {
- var groupDisposable,
- nextShift = timeShift,
- nextSpan = timeSpan,
- q = [],
- refCountDisposable,
- timerD = new SerialDisposable(),
- totalTime = 0;
- groupDisposable = new CompositeDisposable(timerD), refCountDisposable = new RefCountDisposable(groupDisposable);
- function createTimer() {
- var m = new SingleAssignmentDisposable(),
- isSpan = false,
- isShift = false;
- timerD.setDisposable(m);
- if (nextSpan === nextShift) {
- isSpan = true;
- isShift = true;
- } else if (nextSpan < nextShift) {
- isSpan = true;
- } else {
- isShift = true;
- }
- var newTotalTime = isSpan ? nextSpan : nextShift,
- ts = newTotalTime - totalTime;
- totalTime = newTotalTime;
- if (isSpan) {
- nextSpan += timeShift;
- }
- if (isShift) {
- nextShift += timeShift;
- }
- m.setDisposable(scheduler.scheduleWithRelative(ts, function() {
- if (isShift) {
- var s = new Subject();
- q.push(s);
- observer.onNext(addRef(s, refCountDisposable));
- }
- isSpan && q.shift().onCompleted();
- createTimer();
- }));
- }
- ;
- q.push(new Subject());
- observer.onNext(addRef(q[0], refCountDisposable));
- createTimer();
- groupDisposable.add(source.subscribe(function(x) {
- for (var i = 0,
- len = q.length; i < len; i++) {
- q[i].onNext(x);
- }
- }, function(e) {
- for (var i = 0,
- len = q.length; i < len; i++) {
- q[i].onError(e);
- }
- observer.onError(e);
- }, function() {
- for (var i = 0,
- len = q.length; i < len; i++) {
- q[i].onCompleted();
- }
- observer.onCompleted();
- }));
- return refCountDisposable;
- }, source);
- };
- observableProto.windowWithTimeOrCount = function(timeSpan, count, scheduler) {
- var source = this;
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return new AnonymousObservable(function(observer) {
- var timerD = new SerialDisposable(),
- groupDisposable = new CompositeDisposable(timerD),
- refCountDisposable = new RefCountDisposable(groupDisposable),
- n = 0,
- windowId = 0,
- s = new Subject();
- function createTimer(id) {
- var m = new SingleAssignmentDisposable();
- timerD.setDisposable(m);
- m.setDisposable(scheduler.scheduleWithRelative(timeSpan, function() {
- if (id !== windowId) {
- return ;
- }
- n = 0;
- var newId = ++windowId;
- s.onCompleted();
- s = new Subject();
- observer.onNext(addRef(s, refCountDisposable));
- createTimer(newId);
- }));
- }
- observer.onNext(addRef(s, refCountDisposable));
- createTimer(0);
- groupDisposable.add(source.subscribe(function(x) {
- var newId = 0,
- newWindow = false;
- s.onNext(x);
- if (++n === count) {
- newWindow = true;
- n = 0;
- newId = ++windowId;
- s.onCompleted();
- s = new Subject();
- observer.onNext(addRef(s, refCountDisposable));
- }
- newWindow && createTimer(newId);
- }, function(e) {
- s.onError(e);
- observer.onError(e);
- }, function() {
- s.onCompleted();
- observer.onCompleted();
- }));
- return refCountDisposable;
- }, source);
- };
- observableProto.bufferWithTime = function(timeSpan, timeShiftOrScheduler, scheduler) {
- return this.windowWithTime.apply(this, arguments).selectMany(function(x) {
- return x.toArray();
- });
- };
- observableProto.bufferWithTimeOrCount = function(timeSpan, count, scheduler) {
- return this.windowWithTimeOrCount(timeSpan, count, scheduler).selectMany(function(x) {
- return x.toArray();
- });
- };
- observableProto.timeInterval = function(scheduler) {
- var source = this;
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return observableDefer(function() {
- var last = scheduler.now();
- return source.map(function(x) {
- var now = scheduler.now(),
- span = now - last;
- last = now;
- return {
- value: x,
- interval: span
- };
- });
- });
- };
- observableProto.timestamp = function(scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return this.map(function(x) {
- return {
- value: x,
- timestamp: scheduler.now()
- };
- });
- };
- function sampleObservable(source, sampler) {
- return new AnonymousObservable(function(observer) {
- var atEnd,
- value,
- hasValue;
- function sampleSubscribe() {
- if (hasValue) {
- hasValue = false;
- observer.onNext(value);
- }
- atEnd && observer.onCompleted();
- }
- return new CompositeDisposable(source.subscribe(function(newValue) {
- hasValue = true;
- value = newValue;
- }, observer.onError.bind(observer), function() {
- atEnd = true;
- }), sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe));
- }, source);
- }
- observableProto.sample = observableProto.throttleLatest = function(intervalOrSampler, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return typeof intervalOrSampler === 'number' ? sampleObservable(this, observableinterval(intervalOrSampler, scheduler)) : sampleObservable(this, intervalOrSampler);
- };
- observableProto.timeout = function(dueTime, other, scheduler) {
- (other == null || typeof other === 'string') && (other = observableThrow(new Error(other || 'Timeout')));
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- var source = this,
- schedulerMethod = dueTime instanceof Date ? 'scheduleWithAbsolute' : 'scheduleWithRelative';
- return new AnonymousObservable(function(observer) {
- var id = 0,
- original = new SingleAssignmentDisposable(),
- subscription = new SerialDisposable(),
- switched = false,
- timer = new SerialDisposable();
- subscription.setDisposable(original);
- function createTimer() {
- var myId = id;
- timer.setDisposable(scheduler[schedulerMethod](dueTime, function() {
- if (id === myId) {
- isPromise(other) && (other = observableFromPromise(other));
- subscription.setDisposable(other.subscribe(observer));
- }
- }));
- }
- createTimer();
- original.setDisposable(source.subscribe(function(x) {
- if (!switched) {
- id++;
- observer.onNext(x);
- createTimer();
- }
- }, function(e) {
- if (!switched) {
- id++;
- observer.onError(e);
- }
- }, function() {
- if (!switched) {
- id++;
- observer.onCompleted();
- }
- }));
- return new CompositeDisposable(subscription, timer);
- }, source);
- };
- Observable.generateWithAbsoluteTime = function(initialState, condition, iterate, resultSelector, timeSelector, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return new AnonymousObservable(function(observer) {
- var first = true,
- hasResult = false,
- result,
- state = initialState,
- time;
- return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(), function(self) {
- hasResult && observer.onNext(result);
- try {
- if (first) {
- first = false;
- } else {
- state = iterate(state);
- }
- hasResult = condition(state);
- if (hasResult) {
- result = resultSelector(state);
- time = timeSelector(state);
- }
- } catch (e) {
- observer.onError(e);
- return ;
- }
- if (hasResult) {
- self(time);
- } else {
- observer.onCompleted();
- }
- });
- });
- };
- Observable.generateWithRelativeTime = function(initialState, condition, iterate, resultSelector, timeSelector, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return new AnonymousObservable(function(observer) {
- var first = true,
- hasResult = false,
- result,
- state = initialState,
- time;
- return scheduler.scheduleRecursiveWithRelative(0, function(self) {
- hasResult && observer.onNext(result);
- try {
- if (first) {
- first = false;
- } else {
- state = iterate(state);
- }
- hasResult = condition(state);
- if (hasResult) {
- result = resultSelector(state);
- time = timeSelector(state);
- }
- } catch (e) {
- observer.onError(e);
- return ;
- }
- if (hasResult) {
- self(time);
- } else {
- observer.onCompleted();
- }
- });
- });
- };
- observableProto.delaySubscription = function(dueTime, scheduler) {
- return this.delayWithSelector(observableTimer(dueTime, isScheduler(scheduler) ? scheduler : timeoutScheduler), observableEmpty);
- };
- observableProto.delayWithSelector = function(subscriptionDelay, delayDurationSelector) {
- var source = this,
- subDelay,
- selector;
- if (typeof subscriptionDelay === 'function') {
- selector = subscriptionDelay;
- } else {
- subDelay = subscriptionDelay;
- selector = delayDurationSelector;
- }
- return new AnonymousObservable(function(observer) {
- var delays = new CompositeDisposable(),
- atEnd = false,
- done = function() {
- if (atEnd && delays.length === 0) {
- observer.onCompleted();
- }
- },
- subscription = new SerialDisposable(),
- start = function() {
- subscription.setDisposable(source.subscribe(function(x) {
- var delay;
- try {
- delay = selector(x);
- } catch (error) {
- observer.onError(error);
- return ;
- }
- var d = new SingleAssignmentDisposable();
- delays.add(d);
- d.setDisposable(delay.subscribe(function() {
- observer.onNext(x);
- delays.remove(d);
- done();
- }, observer.onError.bind(observer), function() {
- observer.onNext(x);
- delays.remove(d);
- done();
- }));
- }, observer.onError.bind(observer), function() {
- atEnd = true;
- subscription.dispose();
- done();
- }));
- };
- if (!subDelay) {
- start();
- } else {
- subscription.setDisposable(subDelay.subscribe(start, observer.onError.bind(observer), start));
- }
- return new CompositeDisposable(subscription, delays);
- }, this);
- };
- observableProto.timeoutWithSelector = function(firstTimeout, timeoutdurationSelector, other) {
- if (arguments.length === 1) {
- timeoutdurationSelector = firstTimeout;
- firstTimeout = observableNever();
- }
- other || (other = observableThrow(new Error('Timeout')));
- var source = this;
- return new AnonymousObservable(function(observer) {
- var subscription = new SerialDisposable(),
- timer = new SerialDisposable(),
- original = new SingleAssignmentDisposable();
- subscription.setDisposable(original);
- var id = 0,
- switched = false;
- function setTimer(timeout) {
- var myId = id;
- function timerWins() {
- return id === myId;
- }
- var d = new SingleAssignmentDisposable();
- timer.setDisposable(d);
- d.setDisposable(timeout.subscribe(function() {
- timerWins() && subscription.setDisposable(other.subscribe(observer));
- d.dispose();
- }, function(e) {
- timerWins() && observer.onError(e);
- }, function() {
- timerWins() && subscription.setDisposable(other.subscribe(observer));
- }));
- }
- ;
- setTimer(firstTimeout);
- function observerWins() {
- var res = !switched;
- if (res) {
- id++;
- }
- return res;
- }
- original.setDisposable(source.subscribe(function(x) {
- if (observerWins()) {
- observer.onNext(x);
- var timeout;
- try {
- timeout = timeoutdurationSelector(x);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);
- }
- }, function(e) {
- observerWins() && observer.onError(e);
- }, function() {
- observerWins() && observer.onCompleted();
- }));
- return new CompositeDisposable(subscription, timer);
- }, source);
- };
- observableProto.debounceWithSelector = function(durationSelector) {
- var source = this;
- return new AnonymousObservable(function(observer) {
- var value,
- hasValue = false,
- cancelable = new SerialDisposable(),
- id = 0;
- var subscription = source.subscribe(function(x) {
- var throttle;
- try {
- throttle = durationSelector(x);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- isPromise(throttle) && (throttle = observableFromPromise(throttle));
- hasValue = true;
- value = x;
- id++;
- var currentid = id,
- d = new SingleAssignmentDisposable();
- cancelable.setDisposable(d);
- d.setDisposable(throttle.subscribe(function() {
- hasValue && id === currentid && observer.onNext(value);
- hasValue = false;
- d.dispose();
- }, observer.onError.bind(observer), function() {
- hasValue && id === currentid && observer.onNext(value);
- hasValue = false;
- d.dispose();
- }));
- }, function(e) {
- cancelable.dispose();
- observer.onError(e);
- hasValue = false;
- id++;
- }, function() {
- cancelable.dispose();
- hasValue && observer.onNext(value);
- observer.onCompleted();
- hasValue = false;
- id++;
- });
- return new CompositeDisposable(subscription, cancelable);
- }, source);
- };
- observableProto.throttleWithSelector = function(durationSelector) {
- return this.debounceWithSelector(durationSelector);
- };
- observableProto.skipLastWithTime = function(duration, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- var source = this;
- return new AnonymousObservable(function(o) {
- var q = [];
- return source.subscribe(function(x) {
- var now = scheduler.now();
- q.push({
- interval: now,
- value: x
- });
- while (q.length > 0 && now - q[0].interval >= duration) {
- o.onNext(q.shift().value);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- var now = scheduler.now();
- while (q.length > 0 && now - q[0].interval >= duration) {
- o.onNext(q.shift().value);
- }
- o.onCompleted();
- });
- }, source);
- };
- observableProto.takeLastWithTime = function(duration, scheduler) {
- var source = this;
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return new AnonymousObservable(function(o) {
- var q = [];
- return source.subscribe(function(x) {
- var now = scheduler.now();
- q.push({
- interval: now,
- value: x
- });
- while (q.length > 0 && now - q[0].interval >= duration) {
- q.shift();
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- var now = scheduler.now();
- while (q.length > 0) {
- var next = q.shift();
- if (now - next.interval <= duration) {
- o.onNext(next.value);
- }
- }
- o.onCompleted();
- });
- }, source);
- };
- observableProto.takeLastBufferWithTime = function(duration, scheduler) {
- var source = this;
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return new AnonymousObservable(function(o) {
- var q = [];
- return source.subscribe(function(x) {
- var now = scheduler.now();
- q.push({
- interval: now,
- value: x
- });
- while (q.length > 0 && now - q[0].interval >= duration) {
- q.shift();
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- var now = scheduler.now(),
- res = [];
- while (q.length > 0) {
- var next = q.shift();
- now - next.interval <= duration && res.push(next.value);
- }
- o.onNext(res);
- o.onCompleted();
- });
- }, source);
- };
- observableProto.takeWithTime = function(duration, scheduler) {
- var source = this;
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return new AnonymousObservable(function(o) {
- return new CompositeDisposable(scheduler.scheduleWithRelative(duration, function() {
- o.onCompleted();
- }), source.subscribe(o));
- }, source);
- };
- observableProto.skipWithTime = function(duration, scheduler) {
- var source = this;
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- return new AnonymousObservable(function(observer) {
- var open = false;
- return new CompositeDisposable(scheduler.scheduleWithRelative(duration, function() {
- open = true;
- }), source.subscribe(function(x) {
- open && observer.onNext(x);
- }, observer.onError.bind(observer), observer.onCompleted.bind(observer)));
- }, source);
- };
- observableProto.skipUntilWithTime = function(startTime, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- var source = this,
- schedulerMethod = startTime instanceof Date ? 'scheduleWithAbsolute' : 'scheduleWithRelative';
- return new AnonymousObservable(function(o) {
- var open = false;
- return new CompositeDisposable(scheduler[schedulerMethod](startTime, function() {
- open = true;
- }), source.subscribe(function(x) {
- open && o.onNext(x);
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- }));
- }, source);
- };
- observableProto.takeUntilWithTime = function(endTime, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- var source = this,
- schedulerMethod = endTime instanceof Date ? 'scheduleWithAbsolute' : 'scheduleWithRelative';
- return new AnonymousObservable(function(o) {
- return new CompositeDisposable(scheduler[schedulerMethod](endTime, function() {
- o.onCompleted();
- }), source.subscribe(o));
- }, source);
- };
- observableProto.throttleFirst = function(windowDuration, scheduler) {
- isScheduler(scheduler) || (scheduler = timeoutScheduler);
- var duration = +windowDuration || 0;
- if (duration <= 0) {
- throw new RangeError('windowDuration cannot be less or equal zero.');
- }
- var source = this;
- return new AnonymousObservable(function(o) {
- var lastOnNext = 0;
- return source.subscribe(function(x) {
- var now = scheduler.now();
- if (lastOnNext === 0 || now - lastOnNext >= duration) {
- lastOnNext = now;
- o.onNext(x);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- o.onCompleted();
- });
- }, source);
- };
- observableProto.transduce = function(transducer) {
- var source = this;
- function transformForObserver(o) {
- return {
- '@@transducer/init': function() {
- return o;
- },
- '@@transducer/step': function(obs, input) {
- return obs.onNext(input);
- },
- '@@transducer/result': function(obs) {
- return obs.onCompleted();
- }
- };
- }
- return new AnonymousObservable(function(o) {
- var xform = transducer(transformForObserver(o));
- return source.subscribe(function(v) {
- try {
- xform['@@transducer/step'](o, v);
- } catch (e) {
- o.onError(e);
- }
- }, function(e) {
- o.onError(e);
- }, function() {
- xform['@@transducer/result'](o);
- });
- }, source);
- };
- observableProto.exclusive = function() {
- var sources = this;
- return new AnonymousObservable(function(observer) {
- var hasCurrent = false,
- isStopped = false,
- m = new SingleAssignmentDisposable(),
- g = new CompositeDisposable();
- g.add(m);
- m.setDisposable(sources.subscribe(function(innerSource) {
- if (!hasCurrent) {
- hasCurrent = true;
- isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
- var innerSubscription = new SingleAssignmentDisposable();
- g.add(innerSubscription);
- innerSubscription.setDisposable(innerSource.subscribe(observer.onNext.bind(observer), observer.onError.bind(observer), function() {
- g.remove(innerSubscription);
- hasCurrent = false;
- if (isStopped && g.length === 1) {
- observer.onCompleted();
- }
- }));
- }
- }, observer.onError.bind(observer), function() {
- isStopped = true;
- if (!hasCurrent && g.length === 1) {
- observer.onCompleted();
- }
- }));
- return g;
- }, this);
- };
- observableProto.exclusiveMap = function(selector, thisArg) {
- var sources = this,
- selectorFunc = bindCallback(selector, thisArg, 3);
- return new AnonymousObservable(function(observer) {
- var index = 0,
- hasCurrent = false,
- isStopped = true,
- m = new SingleAssignmentDisposable(),
- g = new CompositeDisposable();
- g.add(m);
- m.setDisposable(sources.subscribe(function(innerSource) {
- if (!hasCurrent) {
- hasCurrent = true;
- innerSubscription = new SingleAssignmentDisposable();
- g.add(innerSubscription);
- isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));
- innerSubscription.setDisposable(innerSource.subscribe(function(x) {
- var result;
- try {
- result = selectorFunc(x, index++, innerSource);
- } catch (e) {
- observer.onError(e);
- return ;
- }
- observer.onNext(result);
- }, function(e) {
- observer.onError(e);
- }, function() {
- g.remove(innerSubscription);
- hasCurrent = false;
- if (isStopped && g.length === 1) {
- observer.onCompleted();
- }
- }));
- }
- }, function(e) {
- observer.onError(e);
- }, function() {
- isStopped = true;
- if (g.length === 1 && !hasCurrent) {
- observer.onCompleted();
- }
- }));
- return g;
- }, this);
- };
- Rx.VirtualTimeScheduler = (function(__super__) {
- function localNow() {
- return this.toDateTimeOffset(this.clock);
- }
- function scheduleNow(state, action) {
- return this.scheduleAbsoluteWithState(state, this.clock, action);
- }
- function scheduleRelative(state, dueTime, action) {
- return this.scheduleRelativeWithState(state, this.toRelative(dueTime), action);
- }
- function scheduleAbsolute(state, dueTime, action) {
- return this.scheduleRelativeWithState(state, this.toRelative(dueTime - this.now()), action);
- }
- function invokeAction(scheduler, action) {
- action();
- return disposableEmpty;
- }
- inherits(VirtualTimeScheduler, __super__);
- function VirtualTimeScheduler(initialClock, comparer) {
- this.clock = initialClock;
- this.comparer = comparer;
- this.isEnabled = false;
- this.queue = new PriorityQueue(1024);
- __super__.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute);
- }
- var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;
- VirtualTimeSchedulerPrototype.add = notImplemented;
- VirtualTimeSchedulerPrototype.toDateTimeOffset = notImplemented;
- VirtualTimeSchedulerPrototype.toRelative = notImplemented;
- VirtualTimeSchedulerPrototype.schedulePeriodicWithState = function(state, period, action) {
- var s = new SchedulePeriodicRecursive(this, state, period, action);
- return s.start();
- };
- VirtualTimeSchedulerPrototype.scheduleRelativeWithState = function(state, dueTime, action) {
- var runAt = this.add(this.clock, dueTime);
- return this.scheduleAbsoluteWithState(state, runAt, action);
- };
- VirtualTimeSchedulerPrototype.scheduleRelative = function(dueTime, action) {
- return this.scheduleRelativeWithState(action, dueTime, invokeAction);
- };
- VirtualTimeSchedulerPrototype.start = function() {
- if (!this.isEnabled) {
- this.isEnabled = true;
- do {
- var next = this.getNext();
- if (next !== null) {
- this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);
- next.invoke();
- } else {
- this.isEnabled = false;
- }
- } while (this.isEnabled);
- }
- };
- VirtualTimeSchedulerPrototype.stop = function() {
- this.isEnabled = false;
- };
- VirtualTimeSchedulerPrototype.advanceTo = function(time) {
- var dueToClock = this.comparer(this.clock, time);
- if (this.comparer(this.clock, time) > 0) {
- throw new ArgumentOutOfRangeError();
- }
- if (dueToClock === 0) {
- return ;
- }
- if (!this.isEnabled) {
- this.isEnabled = true;
- do {
- var next = this.getNext();
- if (next !== null && this.comparer(next.dueTime, time) <= 0) {
- this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);
- next.invoke();
- } else {
- this.isEnabled = false;
- }
- } while (this.isEnabled);
- this.clock = time;
- }
- };
- VirtualTimeSchedulerPrototype.advanceBy = function(time) {
- var dt = this.add(this.clock, time),
- dueToClock = this.comparer(this.clock, dt);
- if (dueToClock > 0) {
- throw new ArgumentOutOfRangeError();
- }
- if (dueToClock === 0) {
- return ;
- }
- this.advanceTo(dt);
- };
- VirtualTimeSchedulerPrototype.sleep = function(time) {
- var dt = this.add(this.clock, time);
- if (this.comparer(this.clock, dt) >= 0) {
- throw new ArgumentOutOfRangeError();
- }
- this.clock = dt;
- };
- VirtualTimeSchedulerPrototype.getNext = function() {
- while (this.queue.length > 0) {
- var next = this.queue.peek();
- if (next.isCancelled()) {
- this.queue.dequeue();
- } else {
- return next;
- }
- }
- return null;
- };
- VirtualTimeSchedulerPrototype.scheduleAbsolute = function(dueTime, action) {
- return this.scheduleAbsoluteWithState(action, dueTime, invokeAction);
- };
- VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState = function(state, dueTime, action) {
- var self = this;
- function run(scheduler, state1) {
- self.queue.remove(si);
- return action(scheduler, state1);
- }
- var si = new ScheduledItem(this, state, run, dueTime, this.comparer);
- this.queue.enqueue(si);
- return si.disposable;
- };
- return VirtualTimeScheduler;
- }(Scheduler));
- Rx.HistoricalScheduler = (function(__super__) {
- inherits(HistoricalScheduler, __super__);
- function HistoricalScheduler(initialClock, comparer) {
- var clock = initialClock == null ? 0 : initialClock;
- var cmp = comparer || defaultSubComparer;
- __super__.call(this, clock, cmp);
- }
- var HistoricalSchedulerProto = HistoricalScheduler.prototype;
- HistoricalSchedulerProto.add = function(absolute, relative) {
- return absolute + relative;
- };
- HistoricalSchedulerProto.toDateTimeOffset = function(absolute) {
- return new Date(absolute).getTime();
- };
- HistoricalSchedulerProto.toRelative = function(timeSpan) {
- return timeSpan;
- };
- return HistoricalScheduler;
- }(Rx.VirtualTimeScheduler));
- var AnonymousObservable = Rx.AnonymousObservable = (function(__super__) {
- inherits(AnonymousObservable, __super__);
- function fixSubscriber(subscriber) {
- return subscriber && isFunction(subscriber.dispose) ? subscriber : isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;
- }
- function setDisposable(s, state) {
- var ado = state[0],
- subscribe = state[1];
- var sub = tryCatch(subscribe)(ado);
- if (sub === errorObj) {
- if (!ado.fail(errorObj.e)) {
- return thrower(errorObj.e);
- }
- }
- ado.setDisposable(fixSubscriber(sub));
- }
- function AnonymousObservable(subscribe, parent) {
- this.source = parent;
- function s(observer) {
- var ado = new AutoDetachObserver(observer),
- state = [ado, subscribe];
- if (currentThreadScheduler.scheduleRequired()) {
- currentThreadScheduler.scheduleWithState(state, setDisposable);
- } else {
- setDisposable(null, state);
- }
- return ado;
- }
- __super__.call(this, s);
- }
- return AnonymousObservable;
- }(Observable));
- var AutoDetachObserver = (function(__super__) {
- inherits(AutoDetachObserver, __super__);
- function AutoDetachObserver(observer) {
- __super__.call(this);
- this.observer = observer;
- this.m = new SingleAssignmentDisposable();
- }
- var AutoDetachObserverPrototype = AutoDetachObserver.prototype;
- AutoDetachObserverPrototype.next = function(value) {
- var result = tryCatch(this.observer.onNext).call(this.observer, value);
- if (result === errorObj) {
- this.dispose();
- thrower(result.e);
- }
- };
- AutoDetachObserverPrototype.error = function(err) {
- var result = tryCatch(this.observer.onError).call(this.observer, err);
- this.dispose();
- result === errorObj && thrower(result.e);
- };
- AutoDetachObserverPrototype.completed = function() {
- var result = tryCatch(this.observer.onCompleted).call(this.observer);
- this.dispose();
- result === errorObj && thrower(result.e);
- };
- AutoDetachObserverPrototype.setDisposable = function(value) {
- this.m.setDisposable(value);
- };
- AutoDetachObserverPrototype.getDisposable = function() {
- return this.m.getDisposable();
- };
- AutoDetachObserverPrototype.dispose = function() {
- __super__.prototype.dispose.call(this);
- this.m.dispose();
- };
- return AutoDetachObserver;
- }(AbstractObserver));
- var GroupedObservable = (function(__super__) {
- inherits(GroupedObservable, __super__);
- function subscribe(observer) {
- return this.underlyingObservable.subscribe(observer);
- }
- function GroupedObservable(key, underlyingObservable, mergedDisposable) {
- __super__.call(this, subscribe);
- this.key = key;
- this.underlyingObservable = !mergedDisposable ? underlyingObservable : new AnonymousObservable(function(observer) {
- return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer));
- });
- }
- return GroupedObservable;
- }(Observable));
- var Subject = Rx.Subject = (function(__super__) {
- function subscribe(observer) {
- checkDisposed(this);
- if (!this.isStopped) {
- this.observers.push(observer);
- return new InnerSubscription(this, observer);
- }
- if (this.hasError) {
- observer.onError(this.error);
- return disposableEmpty;
- }
- observer.onCompleted();
- return disposableEmpty;
- }
- inherits(Subject, __super__);
- function Subject() {
- __super__.call(this, subscribe);
- this.isDisposed = false, this.isStopped = false, this.observers = [];
- this.hasError = false;
- }
- addProperties(Subject.prototype, Observer.prototype, {
- hasObservers: function() {
- return this.observers.length > 0;
- },
- onCompleted: function() {
- checkDisposed(this);
- if (!this.isStopped) {
- this.isStopped = true;
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- os[i].onCompleted();
- }
- this.observers.length = 0;
- }
- },
- onError: function(error) {
- checkDisposed(this);
- if (!this.isStopped) {
- this.isStopped = true;
- this.error = error;
- this.hasError = true;
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- os[i].onError(error);
- }
- this.observers.length = 0;
- }
- },
- onNext: function(value) {
- checkDisposed(this);
- if (!this.isStopped) {
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- os[i].onNext(value);
- }
- }
- },
- dispose: function() {
- this.isDisposed = true;
- this.observers = null;
- }
- });
- Subject.create = function(observer, observable) {
- return new AnonymousSubject(observer, observable);
- };
- return Subject;
- }(Observable));
- var AsyncSubject = Rx.AsyncSubject = (function(__super__) {
- function subscribe(observer) {
- checkDisposed(this);
- if (!this.isStopped) {
- this.observers.push(observer);
- return new InnerSubscription(this, observer);
- }
- if (this.hasError) {
- observer.onError(this.error);
- } else if (this.hasValue) {
- observer.onNext(this.value);
- observer.onCompleted();
- } else {
- observer.onCompleted();
- }
- return disposableEmpty;
- }
- inherits(AsyncSubject, __super__);
- function AsyncSubject() {
- __super__.call(this, subscribe);
- this.isDisposed = false;
- this.isStopped = false;
- this.hasValue = false;
- this.observers = [];
- this.hasError = false;
- }
- addProperties(AsyncSubject.prototype, Observer, {
- hasObservers: function() {
- checkDisposed(this);
- return this.observers.length > 0;
- },
- onCompleted: function() {
- var i,
- len;
- checkDisposed(this);
- if (!this.isStopped) {
- this.isStopped = true;
- var os = cloneArray(this.observers),
- len = os.length;
- if (this.hasValue) {
- for (i = 0; i < len; i++) {
- var o = os[i];
- o.onNext(this.value);
- o.onCompleted();
- }
- } else {
- for (i = 0; i < len; i++) {
- os[i].onCompleted();
- }
- }
- this.observers.length = 0;
- }
- },
- onError: function(error) {
- checkDisposed(this);
- if (!this.isStopped) {
- this.isStopped = true;
- this.hasError = true;
- this.error = error;
- for (var i = 0,
- os = cloneArray(this.observers),
- len = os.length; i < len; i++) {
- os[i].onError(error);
- }
- this.observers.length = 0;
- }
- },
- onNext: function(value) {
- checkDisposed(this);
- if (this.isStopped) {
- return ;
- }
- this.value = value;
- this.hasValue = true;
- },
- dispose: function() {
- this.isDisposed = true;
- this.observers = null;
- this.exception = null;
- this.value = null;
- }
- });
- return AsyncSubject;
- }(Observable));
- var AnonymousSubject = Rx.AnonymousSubject = (function(__super__) {
- inherits(AnonymousSubject, __super__);
- function subscribe(observer) {
- return this.observable.subscribe(observer);
- }
- function AnonymousSubject(observer, observable) {
- this.observer = observer;
- this.observable = observable;
- __super__.call(this, subscribe);
- }
- addProperties(AnonymousSubject.prototype, Observer.prototype, {
- onCompleted: function() {
- this.observer.onCompleted();
- },
- onError: function(error) {
- this.observer.onError(error);
- },
- onNext: function(value) {
- this.observer.onNext(value);
- }
- });
- return AnonymousSubject;
- }(Observable));
- Rx.Pauser = (function(__super__) {
- inherits(Pauser, __super__);
- function Pauser() {
- __super__.call(this);
- }
- Pauser.prototype.pause = function() {
- this.onNext(false);
- };
- Pauser.prototype.resume = function() {
- this.onNext(true);
- };
- return Pauser;
- }(Subject));
- if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
- root.Rx = Rx;
- define(function() {
- return Rx;
- });
- } else if (freeExports && freeModule) {
- if (moduleExports) {
- (freeModule.exports = Rx).Rx = Rx;
- } else {
- freeExports.Rx = Rx;
- }
- } else {
- root.Rx = Rx;
- }
- var rEndingLine = captureLine();
- }.call(this));
- global.define = __define;
- return module.exports;
- });
- System.register("angular2/src/facade/lang", [], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/facade/lang";
- var _global,
- Type,
- Math,
- Date,
- assertionsEnabled_,
- int,
- CONST,
- ABSTRACT,
- IMPLEMENTS,
- StringWrapper,
- StringJoiner,
- NumberParseError,
- NumberWrapper,
- RegExp,
- RegExpWrapper,
- RegExpMatcherWrapper,
- FunctionWrapper,
- BaseException,
- Json,
- DateWrapper;
- function isPresent(obj) {
- return obj !== undefined && obj !== null;
- }
- function isBlank(obj) {
- return obj === undefined || obj === null;
- }
- function isString(obj) {
- return typeof obj === "string";
- }
- function isFunction(obj) {
- return typeof obj === "function";
- }
- function stringify(token) {
- if (typeof token === 'string') {
- return token;
- }
- if (token === undefined || token === null) {
- return '' + token;
- }
- if (token.name) {
- return token.name;
- }
- return token.toString();
- }
- function looseIdentical(a, b) {
- return a === b || typeof a === "number" && typeof b === "number" && isNaN(a) && isNaN(b);
- }
- function getMapKey(value) {
- return value;
- }
- function normalizeBlank(obj) {
- return isBlank(obj) ? null : obj;
- }
- function isJsObject(o) {
- return o !== null && (typeof o === "function" || typeof o === "object");
- }
- function assertionsEnabled() {
- return assertionsEnabled_;
- }
- function print(obj) {
- if (obj instanceof Error) {
- console.log(obj.stack);
- } else {
- console.log(obj);
- }
- }
- $__export("isPresent", isPresent);
- $__export("isBlank", isBlank);
- $__export("isString", isString);
- $__export("isFunction", isFunction);
- $__export("stringify", stringify);
- $__export("looseIdentical", looseIdentical);
- $__export("getMapKey", getMapKey);
- $__export("normalizeBlank", normalizeBlank);
- $__export("isJsObject", isJsObject);
- $__export("assertionsEnabled", assertionsEnabled);
- $__export("print", print);
- return {
- setters: [],
- execute: function() {
- _global = typeof window === 'undefined' ? global : window;
- $__export("global", _global);
- Type = $__export("Type", Function);
- Math = $__export("Math", _global.Math);
- Date = $__export("Date", _global.Date);
- assertionsEnabled_ = typeof assert !== 'undefined';
- if (assertionsEnabled_) {
- _global.assert = assert;
- $__export("int", int = assert.define('int', function(value) {
- return typeof value === 'number' && value % 1 === 0;
- }));
- } else {
- $__export("int", int = {});
- _global.assert = function() {};
- }
- $__export("int", int);
- CONST = $__export("CONST", (function() {
- var CONST = function CONST() {
- ;
- };
- return ($traceurRuntime.createClass)(CONST, {}, {});
- }()));
- ABSTRACT = $__export("ABSTRACT", (function() {
- var ABSTRACT = function ABSTRACT() {
- ;
- };
- return ($traceurRuntime.createClass)(ABSTRACT, {}, {});
- }()));
- IMPLEMENTS = $__export("IMPLEMENTS", (function() {
- var IMPLEMENTS = function IMPLEMENTS() {
- ;
- };
- return ($traceurRuntime.createClass)(IMPLEMENTS, {}, {});
- }()));
- StringWrapper = $__export("StringWrapper", (function() {
- var StringWrapper = function StringWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(StringWrapper, {}, {
- fromCharCode: function(code) {
- return String.fromCharCode(code);
- },
- charCodeAt: function(s, index) {
- return s.charCodeAt(index);
- },
- split: function(s, regExp) {
- return s.split(regExp);
- },
- equals: function(s, s2) {
- return s === s2;
- },
- replace: function(s, from, replace) {
- return s.replace(from, replace);
- },
- replaceAll: function(s, from, replace) {
- return s.replace(from, replace);
- },
- startsWith: function(s, start) {
- return s.startsWith(start);
- },
- substring: function(s, start) {
- var end = arguments[2] !== (void 0) ? arguments[2] : null;
- return s.substring(start, end === null ? undefined : end);
- },
- replaceAllMapped: function(s, from, cb) {
- return s.replace(from, function() {
- for (var matches = [],
- $__1 = 0; $__1 < arguments.length; $__1++)
- matches[$__1] = arguments[$__1];
- matches.splice(-2, 2);
- return cb(matches);
- });
- },
- contains: function(s, substr) {
- return s.indexOf(substr) != -1;
- }
- });
- }()));
- Object.defineProperty(StringWrapper.fromCharCode, "parameters", {get: function() {
- return [[int]];
- }});
- Object.defineProperty(StringWrapper.charCodeAt, "parameters", {get: function() {
- return [[assert.type.string], [int]];
- }});
- Object.defineProperty(StringWrapper.split, "parameters", {get: function() {
- return [[assert.type.string], []];
- }});
- Object.defineProperty(StringWrapper.equals, "parameters", {get: function() {
- return [[assert.type.string], [assert.type.string]];
- }});
- Object.defineProperty(StringWrapper.replace, "parameters", {get: function() {
- return [[assert.type.string], [assert.type.string], [assert.type.string]];
- }});
- Object.defineProperty(StringWrapper.replaceAll, "parameters", {get: function() {
- return [[assert.type.string], [RegExp], [assert.type.string]];
- }});
- Object.defineProperty(StringWrapper.startsWith, "parameters", {get: function() {
- return [[assert.type.string], [assert.type.string]];
- }});
- Object.defineProperty(StringWrapper.substring, "parameters", {get: function() {
- return [[assert.type.string], [int], [int]];
- }});
- Object.defineProperty(StringWrapper.replaceAllMapped, "parameters", {get: function() {
- return [[assert.type.string], [RegExp], [Function]];
- }});
- Object.defineProperty(StringWrapper.contains, "parameters", {get: function() {
- return [[assert.type.string], [assert.type.string]];
- }});
- StringJoiner = $__export("StringJoiner", (function() {
- var StringJoiner = function StringJoiner() {
- this.parts = [];
- };
- return ($traceurRuntime.createClass)(StringJoiner, {
- add: function(part) {
- this.parts.push(part);
- },
- toString: function() {
- return this.parts.join("");
- }
- }, {});
- }()));
- Object.defineProperty(StringJoiner.prototype.add, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- NumberParseError = $__export("NumberParseError", (function($__super) {
- var NumberParseError = function NumberParseError(message) {
- $traceurRuntime.superConstructor(NumberParseError).call(this);
- this.message = message;
- };
- return ($traceurRuntime.createClass)(NumberParseError, {toString: function() {
- return this.message;
- }}, {}, $__super);
- }(Error)));
- NumberWrapper = $__export("NumberWrapper", (function() {
- var NumberWrapper = function NumberWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(NumberWrapper, {}, {
- toFixed: function(n, fractionDigits) {
- return n.toFixed(fractionDigits);
- },
- equal: function(a, b) {
- return a === b;
- },
- parseIntAutoRadix: function(text) {
- var result = parseInt(text);
- if (isNaN(result)) {
- throw new NumberParseError("Invalid integer literal when parsing " + text);
- }
- return result;
- },
- parseInt: function(text, radix) {
- if (radix == 10) {
- if (/^(\-|\+)?[0-9]+$/.test(text)) {
- return parseInt(text, radix);
- }
- } else if (radix == 16) {
- if (/^(\-|\+)?[0-9ABCDEFabcdef]+$/.test(text)) {
- return parseInt(text, radix);
- }
- } else {
- var result = parseInt(text, radix);
- if (!isNaN(result)) {
- return result;
- }
- }
- throw new NumberParseError("Invalid integer literal when parsing " + text + " in base " + radix);
- },
- parseFloat: function(text) {
- return parseFloat(text);
- },
- get NaN() {
- return NaN;
- },
- isNaN: function(value) {
- return isNaN(value);
- },
- isInteger: function(value) {
- return Number.isInteger(value);
- }
- });
- }()));
- Object.defineProperty(NumberWrapper.toFixed, "parameters", {get: function() {
- return [[assert.type.number], [int]];
- }});
- Object.defineProperty(NumberWrapper.parseIntAutoRadix, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- Object.defineProperty(NumberWrapper.parseInt, "parameters", {get: function() {
- return [[assert.type.string], [int]];
- }});
- Object.defineProperty(NumberWrapper.parseFloat, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- RegExp = $__export("RegExp", _global.RegExp);
- RegExpWrapper = $__export("RegExpWrapper", (function() {
- var RegExpWrapper = function RegExpWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(RegExpWrapper, {}, {
- create: function(regExpStr) {
- var flags = arguments[1] !== (void 0) ? arguments[1] : '';
- flags = flags.replace(/g/g, '');
- return new _global.RegExp(regExpStr, flags + 'g');
- },
- firstMatch: function(regExp, input) {
- regExp.lastIndex = 0;
- return regExp.exec(input);
- },
- matcher: function(regExp, input) {
- regExp.lastIndex = 0;
- return {
- re: regExp,
- input: input
- };
- }
- });
- }()));
- Object.defineProperty(RegExpWrapper.create, "parameters", {get: function() {
- return [[], [assert.type.string]];
- }});
- RegExpMatcherWrapper = $__export("RegExpMatcherWrapper", (function() {
- var RegExpMatcherWrapper = function RegExpMatcherWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(RegExpMatcherWrapper, {}, {next: function(matcher) {
- return matcher.re.exec(matcher.input);
- }});
- }()));
- FunctionWrapper = $__export("FunctionWrapper", (function() {
- var FunctionWrapper = function FunctionWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(FunctionWrapper, {}, {apply: function(fn, posArgs) {
- return fn.apply(null, posArgs);
- }});
- }()));
- Object.defineProperty(FunctionWrapper.apply, "parameters", {get: function() {
- return [[Function], []];
- }});
- BaseException = $__export("BaseException", Error);
- Json = $__export("Json", _global.JSON);
- DateWrapper = $__export("DateWrapper", (function() {
- var DateWrapper = function DateWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(DateWrapper, {}, {
- fromMillis: function(ms) {
- return new Date(ms);
- },
- toMillis: function(date) {
- return date.getTime();
- },
- now: function() {
- return new Date();
- },
- toJson: function(date) {
- return date.toJSON();
- }
- });
- }()));
- Object.defineProperty(DateWrapper.toMillis, "parameters", {get: function() {
- return [[Date]];
- }});
- }
- };
- });
- System.register("angular2/src/facade/collection", ["angular2/src/facade/lang"], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/facade/collection";
- var int,
- isJsObject,
- global,
- List,
- Map,
- Set,
- StringMap,
- MapWrapper,
- StringMapWrapper,
- ListWrapper,
- SetWrapper;
- function isListLikeIterable(obj) {
- if (!isJsObject(obj))
- return false;
- return ListWrapper.isList(obj) || (!(obj instanceof Map) && Symbol.iterator in obj);
- }
- function iterateListLike(obj, fn) {
- if (ListWrapper.isList(obj)) {
- for (var i = 0; i < obj.length; i++) {
- fn(obj[i]);
- }
- } else {
- var iterator = obj[Symbol.iterator]();
- var item;
- while (!((item = iterator.next()).done)) {
- fn(item.value);
- }
- }
- }
- $__export("isListLikeIterable", isListLikeIterable);
- $__export("iterateListLike", iterateListLike);
- return {
- setters: [function($__m) {
- int = $__m.int;
- isJsObject = $__m.isJsObject;
- global = $__m.global;
- }],
- execute: function() {
- List = $__export("List", global.Array);
- Map = $__export("Map", global.Map);
- Set = $__export("Set", global.Set);
- StringMap = $__export("StringMap", global.Object);
- MapWrapper = $__export("MapWrapper", (function() {
- var MapWrapper = function MapWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(MapWrapper, {}, {
- create: function() {
- return new Map();
- },
- clone: function(m) {
- return new Map(m);
- },
- createFromStringMap: function(stringMap) {
- var result = MapWrapper.create();
- for (var prop in stringMap) {
- MapWrapper.set(result, prop, stringMap[prop]);
- }
- return result;
- },
- createFromPairs: function(pairs) {
- return new Map(pairs);
- },
- get: function(m, k) {
- return m.get(k);
- },
- set: function(m, k, v) {
- m.set(k, v);
- },
- contains: function(m, k) {
- return m.has(k);
- },
- forEach: function(m, fn) {
- m.forEach(fn);
- },
- size: function(m) {
- return m.size;
- },
- delete: function(m, k) {
- m.delete(k);
- },
- clear: function(m) {
- m.clear();
- },
- clearValues: function(m) {
- var keyIterator = m.keys();
- var k;
- while (!((k = keyIterator.next()).done)) {
- m.set(k.value, null);
- }
- },
- iterable: function(m) {
- return m;
- },
- keys: function(m) {
- return m.keys();
- },
- values: function(m) {
- return m.values();
- }
- });
- }()));
- Object.defineProperty(MapWrapper.clone, "parameters", {get: function() {
- return [[Map]];
- }});
- Object.defineProperty(MapWrapper.createFromPairs, "parameters", {get: function() {
- return [[List]];
- }});
- StringMapWrapper = $__export("StringMapWrapper", (function() {
- var StringMapWrapper = function StringMapWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(StringMapWrapper, {}, {
- create: function() {
- return {};
- },
- contains: function(map, key) {
- return map.hasOwnProperty(key);
- },
- get: function(map, key) {
- return map.hasOwnProperty(key) ? map[key] : undefined;
- },
- set: function(map, key, value) {
- map[key] = value;
- },
- isEmpty: function(map) {
- for (var prop in map) {
- return false;
- }
- return true;
- },
- delete: function(map, key) {
- delete map[key];
- },
- forEach: function(map, callback) {
- for (var prop in map) {
- if (map.hasOwnProperty(prop)) {
- callback(map[prop], prop);
- }
- }
- },
- merge: function(m1, m2) {
- var m = {};
- for (var attr in m1) {
- if (m1.hasOwnProperty(attr)) {
- m[attr] = m1[attr];
- }
- }
- for (var attr in m2) {
- if (m2.hasOwnProperty(attr)) {
- m[attr] = m2[attr];
- }
- }
- return m;
- }
- });
- }()));
- ListWrapper = $__export("ListWrapper", (function() {
- var ListWrapper = function ListWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(ListWrapper, {}, {
- create: function() {
- return new List();
- },
- createFixedSize: function(size) {
- return new List(size);
- },
- get: function(m, k) {
- return m[k];
- },
- set: function(m, k, v) {
- m[k] = v;
- },
- clone: function(array) {
- return array.slice(0);
- },
- map: function(array, fn) {
- return array.map(fn);
- },
- forEach: function(array, fn) {
- for (var i = 0; i < array.length; i++) {
- fn(array[i]);
- }
- },
- push: function(array, el) {
- array.push(el);
- },
- first: function(array) {
- if (!array)
- return null;
- return array[0];
- },
- last: function(array) {
- if (!array || array.length == 0)
- return null;
- return array[array.length - 1];
- },
- find: function(list, pred) {
- for (var i = 0; i < list.length; ++i) {
- if (pred(list[i]))
- return list[i];
- }
- return null;
- },
- reduce: function(list, fn, init) {
- return list.reduce(fn, init);
- },
- filter: function(array, pred) {
- return array.filter(pred);
- },
- any: function(list, pred) {
- for (var i = 0; i < list.length; ++i) {
- if (pred(list[i]))
- return true;
- }
- return false;
- },
- contains: function(list, el) {
- return list.indexOf(el) !== -1;
- },
- reversed: function(array) {
- var a = ListWrapper.clone(array);
- return a.reverse();
- },
- concat: function(a, b) {
- return a.concat(b);
- },
- isList: function(list) {
- return Array.isArray(list);
- },
- insert: function(list, index, value) {
- list.splice(index, 0, value);
- },
- removeAt: function(list, index) {
- var res = list[index];
- list.splice(index, 1);
- return res;
- },
- removeAll: function(list, items) {
- for (var i = 0; i < items.length; ++i) {
- var index = list.indexOf(items[i]);
- list.splice(index, 1);
- }
- },
- removeLast: function(list) {
- return list.pop();
- },
- remove: function(list, el) {
- var index = list.indexOf(el);
- if (index > -1) {
- list.splice(index, 1);
- return true;
- }
- return false;
- },
- clear: function(list) {
- list.splice(0, list.length);
- },
- join: function(list, s) {
- return list.join(s);
- },
- isEmpty: function(list) {
- return list.length == 0;
- },
- fill: function(list, value) {
- var start = arguments[2] !== (void 0) ? arguments[2] : 0;
- var end = arguments[3] !== (void 0) ? arguments[3] : null;
- list.fill(value, start, end === null ? undefined : end);
- },
- equals: function(a, b) {
- if (a.length != b.length)
- return false;
- for (var i = 0; i < a.length; ++i) {
- if (a[i] !== b[i])
- return false;
- }
- return true;
- },
- slice: function(l, from, to) {
- return l.slice(from, to);
- },
- sort: function(l, compareFn) {
- l.sort(compareFn);
- }
- });
- }()));
- Object.defineProperty(ListWrapper.clone, "parameters", {get: function() {
- return [[List]];
- }});
- Object.defineProperty(ListWrapper.forEach, "parameters", {get: function() {
- return [[List], [Function]];
- }});
- Object.defineProperty(ListWrapper.find, "parameters", {get: function() {
- return [[List], [Function]];
- }});
- Object.defineProperty(ListWrapper.reduce, "parameters", {get: function() {
- return [[List], [Function], []];
- }});
- Object.defineProperty(ListWrapper.filter, "parameters", {get: function() {
- return [[], [Function]];
- }});
- Object.defineProperty(ListWrapper.any, "parameters", {get: function() {
- return [[List], [Function]];
- }});
- Object.defineProperty(ListWrapper.contains, "parameters", {get: function() {
- return [[List], []];
- }});
- Object.defineProperty(ListWrapper.insert, "parameters", {get: function() {
- return [[], [int], []];
- }});
- Object.defineProperty(ListWrapper.removeAt, "parameters", {get: function() {
- return [[], [int]];
- }});
- Object.defineProperty(ListWrapper.removeLast, "parameters", {get: function() {
- return [[List]];
- }});
- Object.defineProperty(ListWrapper.fill, "parameters", {get: function() {
- return [[List], [], [int], [int]];
- }});
- Object.defineProperty(ListWrapper.equals, "parameters", {get: function() {
- return [[List], [List]];
- }});
- Object.defineProperty(ListWrapper.slice, "parameters", {get: function() {
- return [[List], [int], [int]];
- }});
- Object.defineProperty(ListWrapper.sort, "parameters", {get: function() {
- return [[List], [Function]];
- }});
- Object.defineProperty(iterateListLike, "parameters", {get: function() {
- return [[], [Function]];
- }});
- SetWrapper = $__export("SetWrapper", (function() {
- var SetWrapper = function SetWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(SetWrapper, {}, {
- createFromList: function(lst) {
- return new Set(lst);
- },
- has: function(s, key) {
- return s.has(key);
- }
- });
- }()));
- Object.defineProperty(SetWrapper.createFromList, "parameters", {get: function() {
- return [[List]];
- }});
- Object.defineProperty(SetWrapper.has, "parameters", {get: function() {
- return [[Set], []];
- }});
- }
- };
- });
- System.register("angular2/src/reflection/types", [], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/reflection/types";
- var SetterFn,
- GetterFn,
- MethodFn;
- return {
- setters: [],
- execute: function() {
- SetterFn = $__export("SetterFn", Function);
- GetterFn = $__export("GetterFn", Function);
- MethodFn = $__export("MethodFn", Function);
- }
- };
- });
- System.register("angular2/src/reflection/reflection_capabilities", ["angular2/src/facade/lang", "angular2/src/facade/collection", "angular2/src/reflection/types"], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/reflection/reflection_capabilities";
- var Type,
- isPresent,
- List,
- ListWrapper,
- GetterFn,
- SetterFn,
- MethodFn,
- ReflectionCapabilities;
- return {
- setters: [function($__m) {
- Type = $__m.Type;
- isPresent = $__m.isPresent;
- }, function($__m) {
- List = $__m.List;
- ListWrapper = $__m.ListWrapper;
- }, function($__m) {
- GetterFn = $__m.GetterFn;
- SetterFn = $__m.SetterFn;
- MethodFn = $__m.MethodFn;
- }],
- execute: function() {
- ReflectionCapabilities = $__export("ReflectionCapabilities", (function() {
- var ReflectionCapabilities = function ReflectionCapabilities() {
- ;
- };
- return ($traceurRuntime.createClass)(ReflectionCapabilities, {
- factory: function(type) {
- switch (type.length) {
- case 0:
- return function() {
- return new type();
- };
- case 1:
- return function(a1) {
- return new type(a1);
- };
- case 2:
- return function(a1, a2) {
- return new type(a1, a2);
- };
- case 3:
- return function(a1, a2, a3) {
- return new type(a1, a2, a3);
- };
- case 4:
- return function(a1, a2, a3, a4) {
- return new type(a1, a2, a3, a4);
- };
- case 5:
- return function(a1, a2, a3, a4, a5) {
- return new type(a1, a2, a3, a4, a5);
- };
- case 6:
- return function(a1, a2, a3, a4, a5, a6) {
- return new type(a1, a2, a3, a4, a5, a6);
- };
- case 7:
- return function(a1, a2, a3, a4, a5, a6, a7) {
- return new type(a1, a2, a3, a4, a5, a6, a7);
- };
- case 8:
- return function(a1, a2, a3, a4, a5, a6, a7, a8) {
- return new type(a1, a2, a3, a4, a5, a6, a7, a8);
- };
- case 9:
- return function(a1, a2, a3, a4, a5, a6, a7, a8, a9) {
- return new type(a1, a2, a3, a4, a5, a6, a7, a8, a9);
- };
- case 10:
- return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
- return new type(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
- };
- }
- ;
- throw new Error("Factory cannot take more than 10 arguments");
- },
- parameters: function(typeOfFunc) {
- return isPresent(typeOfFunc.parameters) ? typeOfFunc.parameters : ListWrapper.createFixedSize(typeOfFunc.length);
- },
- annotations: function(typeOfFunc) {
- return isPresent(typeOfFunc.annotations) ? typeOfFunc.annotations : [];
- },
- getter: function(name) {
- return new Function('o', 'return o.' + name + ';');
- },
- setter: function(name) {
- return new Function('o', 'v', 'return o.' + name + ' = v;');
- },
- method: function(name) {
- var method = ("o." + name);
- return new Function('o', 'args', ("if (!" + method + ") throw new Error('\"" + name + "\" is undefined');") + ("return " + method + ".apply(o, args);"));
- }
- }, {});
- }()));
- Object.defineProperty(ReflectionCapabilities.prototype.factory, "parameters", {get: function() {
- return [[Type]];
- }});
- Object.defineProperty(ReflectionCapabilities.prototype.getter, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- Object.defineProperty(ReflectionCapabilities.prototype.setter, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- Object.defineProperty(ReflectionCapabilities.prototype.method, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- }
- };
- });
- System.register("angular2/src/di/exceptions", ["angular2/src/facade/collection", "angular2/src/facade/lang"], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/di/exceptions";
- var ListWrapper,
- List,
- stringify,
- KeyMetadataError,
- ProviderError,
- NoProviderError,
- AsyncBindingError,
- CyclicDependencyError,
- InstantiationError,
- InvalidBindingError,
- NoAnnotationError;
- function findFirstClosedCycle(keys) {
- var res = [];
- for (var i = 0; i < keys.length; ++i) {
- if (ListWrapper.contains(res, keys[i])) {
- ListWrapper.push(res, keys[i]);
- return res;
- } else {
- ListWrapper.push(res, keys[i]);
- }
- }
- return res;
- }
- function constructResolvingPath(keys) {
- if (keys.length > 1) {
- var reversed = findFirstClosedCycle(ListWrapper.reversed(keys));
- var tokenStrs = ListWrapper.map(reversed, (function(k) {
- return stringify(k.token);
- }));
- return " (" + tokenStrs.join(' -> ') + ")";
- } else {
- return "";
- }
- }
- return {
- setters: [function($__m) {
- ListWrapper = $__m.ListWrapper;
- List = $__m.List;
- }, function($__m) {
- stringify = $__m.stringify;
- }],
- execute: function() {
- Object.defineProperty(findFirstClosedCycle, "parameters", {get: function() {
- return [[List]];
- }});
- Object.defineProperty(constructResolvingPath, "parameters", {get: function() {
- return [[List]];
- }});
- KeyMetadataError = $__export("KeyMetadataError", (function($__super) {
- var KeyMetadataError = function KeyMetadataError() {
- $traceurRuntime.superConstructor(KeyMetadataError).apply(this, arguments);
- ;
- };
- return ($traceurRuntime.createClass)(KeyMetadataError, {}, {}, $__super);
- }(Error)));
- ProviderError = $__export("ProviderError", (function($__super) {
- var ProviderError = function ProviderError(key, constructResolvingMessage) {
- $traceurRuntime.superConstructor(ProviderError).call(this);
- this.keys = [key];
- this.constructResolvingMessage = constructResolvingMessage;
- this.message = this.constructResolvingMessage(this.keys);
- };
- return ($traceurRuntime.createClass)(ProviderError, {
- addKey: function(key) {
- ListWrapper.push(this.keys, key);
- this.message = this.constructResolvingMessage(this.keys);
- },
- toString: function() {
- return this.message;
- }
- }, {}, $__super);
- }(Error)));
- Object.defineProperty(ProviderError, "parameters", {get: function() {
- return [[], [Function]];
- }});
- NoProviderError = $__export("NoProviderError", (function($__super) {
- var NoProviderError = function NoProviderError(key) {
- $traceurRuntime.superConstructor(NoProviderError).call(this, key, function(keys) {
- var first = stringify(ListWrapper.first(keys).token);
- return ("No provider for " + first + "!" + constructResolvingPath(keys));
- });
- };
- return ($traceurRuntime.createClass)(NoProviderError, {}, {}, $__super);
- }(ProviderError)));
- AsyncBindingError = $__export("AsyncBindingError", (function($__super) {
- var AsyncBindingError = function AsyncBindingError(key) {
- $traceurRuntime.superConstructor(AsyncBindingError).call(this, key, function(keys) {
- var first = stringify(ListWrapper.first(keys).token);
- return ("Cannot instantiate " + first + " synchronously. ") + ("It is provided as a promise!" + constructResolvingPath(keys));
- });
- };
- return ($traceurRuntime.createClass)(AsyncBindingError, {}, {}, $__super);
- }(ProviderError)));
- CyclicDependencyError = $__export("CyclicDependencyError", (function($__super) {
- var CyclicDependencyError = function CyclicDependencyError(key) {
- $traceurRuntime.superConstructor(CyclicDependencyError).call(this, key, function(keys) {
- return ("Cannot instantiate cyclic dependency!" + constructResolvingPath(keys));
- });
- };
- return ($traceurRuntime.createClass)(CyclicDependencyError, {}, {}, $__super);
- }(ProviderError)));
- InstantiationError = $__export("InstantiationError", (function($__super) {
- var InstantiationError = function InstantiationError(originalException, key) {
- $traceurRuntime.superConstructor(InstantiationError).call(this, key, function(keys) {
- var first = stringify(ListWrapper.first(keys).token);
- return ("Error during instantiation of " + first + "!" + constructResolvingPath(keys) + ".") + (" ORIGINAL ERROR: " + originalException);
- });
- };
- return ($traceurRuntime.createClass)(InstantiationError, {}, {}, $__super);
- }(ProviderError)));
- InvalidBindingError = $__export("InvalidBindingError", (function($__super) {
- var InvalidBindingError = function InvalidBindingError(binding) {
- $traceurRuntime.superConstructor(InvalidBindingError).call(this);
- this.message = ("Invalid binding " + binding);
- };
- return ($traceurRuntime.createClass)(InvalidBindingError, {toString: function() {
- return this.message;
- }}, {}, $__super);
- }(Error)));
- NoAnnotationError = $__export("NoAnnotationError", (function($__super) {
- var NoAnnotationError = function NoAnnotationError(typeOrFunc) {
- $traceurRuntime.superConstructor(NoAnnotationError).call(this);
- this.message = ("Cannot resolve all parameters for " + stringify(typeOrFunc));
- };
- return ($traceurRuntime.createClass)(NoAnnotationError, {toString: function() {
- return this.message;
- }}, {}, $__super);
- }(Error)));
- }
- };
- });
- System.register("angular2/src/di/opaque_token", [], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/di/opaque_token";
- var OpaqueToken;
- return {
- setters: [],
- execute: function() {
- OpaqueToken = $__export("OpaqueToken", (function() {
- var OpaqueToken = function OpaqueToken(desc) {
- this._desc = ("Token(" + desc + ")");
- };
- return ($traceurRuntime.createClass)(OpaqueToken, {toString: function() {
- return this._desc;
- }}, {});
- }()));
- Object.defineProperty(OpaqueToken, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- }
- };
- });
- System.register("angular2/src/di/annotations", ["angular2/src/facade/lang"], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/di/annotations";
- var CONST,
- Inject,
- InjectPromise,
- InjectLazy,
- Optional,
- DependencyAnnotation,
- Injectable;
- return {
- setters: [function($__m) {
- CONST = $__m.CONST;
- }],
- execute: function() {
- Inject = $__export("Inject", (function() {
- var Inject = function Inject(token) {
- this.token = token;
- };
- return ($traceurRuntime.createClass)(Inject, {}, {});
- }()));
- Object.defineProperty(Inject, "annotations", {get: function() {
- return [new CONST()];
- }});
- InjectPromise = $__export("InjectPromise", (function() {
- var InjectPromise = function InjectPromise(token) {
- this.token = token;
- };
- return ($traceurRuntime.createClass)(InjectPromise, {}, {});
- }()));
- Object.defineProperty(InjectPromise, "annotations", {get: function() {
- return [new CONST()];
- }});
- InjectLazy = $__export("InjectLazy", (function() {
- var InjectLazy = function InjectLazy(token) {
- this.token = token;
- };
- return ($traceurRuntime.createClass)(InjectLazy, {}, {});
- }()));
- Object.defineProperty(InjectLazy, "annotations", {get: function() {
- return [new CONST()];
- }});
- Optional = $__export("Optional", (function() {
- var Optional = function Optional() {};
- return ($traceurRuntime.createClass)(Optional, {}, {});
- }()));
- Object.defineProperty(Optional, "annotations", {get: function() {
- return [new CONST()];
- }});
- DependencyAnnotation = $__export("DependencyAnnotation", (function() {
- var DependencyAnnotation = function DependencyAnnotation() {};
- return ($traceurRuntime.createClass)(DependencyAnnotation, {get token() {
- return null;
- }}, {});
- }()));
- Object.defineProperty(DependencyAnnotation, "annotations", {get: function() {
- return [new CONST()];
- }});
- Injectable = $__export("Injectable", (function() {
- var Injectable = function Injectable() {};
- return ($traceurRuntime.createClass)(Injectable, {}, {});
- }()));
- Object.defineProperty(Injectable, "annotations", {get: function() {
- return [new CONST()];
- }});
- }
- };
- });
- System.register("angular2/src/reflection/reflector", ["angular2/src/facade/lang", "angular2/src/facade/collection", "angular2/src/reflection/types"], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/reflection/reflector";
- var Type,
- isPresent,
- stringify,
- BaseException,
- List,
- ListWrapper,
- Map,
- MapWrapper,
- StringMapWrapper,
- SetterFn,
- GetterFn,
- MethodFn,
- Reflector;
- function _mergeMaps(target, config) {
- StringMapWrapper.forEach(config, (function(v, k) {
- return MapWrapper.set(target, k, v);
- }));
- }
- return {
- setters: [function($__m) {
- Type = $__m.Type;
- isPresent = $__m.isPresent;
- stringify = $__m.stringify;
- BaseException = $__m.BaseException;
- }, function($__m) {
- List = $__m.List;
- ListWrapper = $__m.ListWrapper;
- Map = $__m.Map;
- MapWrapper = $__m.MapWrapper;
- StringMapWrapper = $__m.StringMapWrapper;
- }, function($__m) {
- SetterFn = $__m.SetterFn;
- GetterFn = $__m.GetterFn;
- MethodFn = $__m.MethodFn;
- $__export("SetterFn", $__m.SetterFn);
- $__export("GetterFn", $__m.GetterFn);
- $__export("MethodFn", $__m.MethodFn);
- }],
- execute: function() {
- Reflector = $__export("Reflector", (function() {
- var Reflector = function Reflector(reflectionCapabilities) {
- this._typeInfo = MapWrapper.create();
- this._getters = MapWrapper.create();
- this._setters = MapWrapper.create();
- this._methods = MapWrapper.create();
- this.reflectionCapabilities = reflectionCapabilities;
- };
- return ($traceurRuntime.createClass)(Reflector, {
- registerType: function(type, typeInfo) {
- MapWrapper.set(this._typeInfo, type, typeInfo);
- },
- registerGetters: function(getters) {
- _mergeMaps(this._getters, getters);
- },
- registerSetters: function(setters) {
- _mergeMaps(this._setters, setters);
- },
- registerMethods: function(methods) {
- _mergeMaps(this._methods, methods);
- },
- factory: function(type) {
- if (MapWrapper.contains(this._typeInfo, type)) {
- return MapWrapper.get(this._typeInfo, type)["factory"];
- } else {
- return this.reflectionCapabilities.factory(type);
- }
- },
- parameters: function(typeOfFunc) {
- if (MapWrapper.contains(this._typeInfo, typeOfFunc)) {
- return MapWrapper.get(this._typeInfo, typeOfFunc)["parameters"];
- } else {
- return this.reflectionCapabilities.parameters(typeOfFunc);
- }
- },
- annotations: function(typeOfFunc) {
- if (MapWrapper.contains(this._typeInfo, typeOfFunc)) {
- return MapWrapper.get(this._typeInfo, typeOfFunc)["annotations"];
- } else {
- return this.reflectionCapabilities.annotations(typeOfFunc);
- }
- },
- getter: function(name) {
- if (MapWrapper.contains(this._getters, name)) {
- return MapWrapper.get(this._getters, name);
- } else {
- return this.reflectionCapabilities.getter(name);
- }
- },
- setter: function(name) {
- if (MapWrapper.contains(this._setters, name)) {
- return MapWrapper.get(this._setters, name);
- } else {
- return this.reflectionCapabilities.setter(name);
- }
- },
- method: function(name) {
- if (MapWrapper.contains(this._methods, name)) {
- return MapWrapper.get(this._methods, name);
- } else {
- return this.reflectionCapabilities.method(name);
- }
- }
- }, {});
- }()));
- Object.defineProperty(Reflector.prototype.factory, "parameters", {get: function() {
- return [[Type]];
- }});
- Object.defineProperty(Reflector.prototype.getter, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- Object.defineProperty(Reflector.prototype.setter, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- Object.defineProperty(Reflector.prototype.method, "parameters", {get: function() {
- return [[assert.type.string]];
- }});
- Object.defineProperty(_mergeMaps, "parameters", {get: function() {
- return [[Map], []];
- }});
- }
- };
- });
- System.register("angular2/src/di/key", ["angular2/src/di/exceptions", "angular2/src/facade/collection", "angular2/src/facade/lang"], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/di/key";
- var KeyMetadataError,
- MapWrapper,
- Map,
- int,
- isPresent,
- Key,
- KeyRegistry,
- _globalKeyRegistry;
- return {
- setters: [function($__m) {
- KeyMetadataError = $__m.KeyMetadataError;
- }, function($__m) {
- MapWrapper = $__m.MapWrapper;
- Map = $__m.Map;
- }, function($__m) {
- int = $__m.int;
- isPresent = $__m.isPresent;
- }],
- execute: function() {
- Key = $__export("Key", (function() {
- var Key = function Key(token, id) {
- this.token = token;
- this.id = id;
- this.metadata = null;
- };
- return ($traceurRuntime.createClass)(Key, {}, {
- setMetadata: function(key, metadata) {
- if (isPresent(key.metadata) && key.metadata !== metadata) {
- throw new KeyMetadataError();
- }
- key.metadata = metadata;
- return key;
- },
- get: function(token) {
- return _globalKeyRegistry.get(token);
- },
- get numberOfKeys() {
- return _globalKeyRegistry.numberOfKeys;
- }
- });
- }()));
- Object.defineProperty(Key, "parameters", {get: function() {
- return [[], [int]];
- }});
- Object.defineProperty(Key.setMetadata, "parameters", {get: function() {
- return [[Key], []];
- }});
- KeyRegistry = $__export("KeyRegistry", (function() {
- var KeyRegistry = function KeyRegistry() {
- this._allKeys = MapWrapper.create();
- };
- return ($traceurRuntime.createClass)(KeyRegistry, {
- get: function(token) {
- if (token instanceof Key)
- return token;
- if (MapWrapper.contains(this._allKeys, token)) {
- return MapWrapper.get(this._allKeys, token);
- }
- var newKey = new Key(token, Key.numberOfKeys);
- MapWrapper.set(this._allKeys, token, newKey);
- return newKey;
- },
- get numberOfKeys() {
- return MapWrapper.size(this._allKeys);
- }
- }, {});
- }()));
- _globalKeyRegistry = new KeyRegistry();
- }
- };
- });
- System.register("angular2/src/facade/async", ["angular2/src/facade/lang", "angular2/src/facade/collection", "rx/dist/rx.all"], function($__export) {
- "use strict";
- var __moduleName = "angular2/src/facade/async";
- var int,
- global,
- isPresent,
- List,
- Rx,
- Promise,
- PromiseWrapper,
- Observable,
- ObservableController,
- ObservableWrapper;
- return {
- setters: [function($__m) {
- int = $__m.int;
- global = $__m.global;
- isPresent = $__m.isPresent;
- }, function($__m) {
- List = $__m.List;
- }, function($__m) {
- Rx = $__m.default;
- }],
- execute: function() {
- Promise = $__export("Promise", global.Promise);
- PromiseWrapper = $__export("PromiseWrapper", (function() {
- var PromiseWrapper = function PromiseWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(PromiseWrapper, {}, {
- resolve: function(obj) {
- return Promise.resolve(obj);
- },
- reject: function(obj) {
- return Promise.reject(obj);
- },
- catchError: function(promise, onError) {
- return promise.catch(onError);
- },
- all: function(promises) {
- if (promises.length == 0)
- return Promise.resolve([]);
- return Promise.all(promises);
- },
- then: function(promise, success, rejection) {
- return promise.then(success, rejection);
- },
- completer: function() {
- var resolve;
- var reject;
- var p = new Promise(function(res, rej) {
- resolve = res;
- reject = rej;
- });
- return {
- promise: p,
- resolve: resolve,
- reject: reject
- };
- },
- setTimeout: function(fn, millis) {
- global.setTimeout(fn, millis);
- },
- isPromise: function(maybePromise) {
- return maybePromise instanceof Promise;
- }
- });
- }()));
- Object.defineProperty(PromiseWrapper.catchError, "parameters", {get: function() {
- return [[Promise], [Function]];
- }});
- Object.defineProperty(PromiseWrapper.all, "parameters", {get: function() {
- return [[List]];
- }});
- Object.defineProperty(PromiseWrapper.then, "parameters", {get: function() {
- return [[Promise], [Function], [Function]];
- }});
- Object.defineProperty(PromiseWrapper.setTimeout, "parameters", {get: function() {
- return [[Function], [int]];
- }});
- Observable = $__export("Observable", Rx.Observable);
- ObservableController = $__export("ObservableController", Rx.Subject);
- ObservableWrapper = $__export("ObservableWrapper", (function() {
- var ObservableWrapper = function ObservableWrapper() {
- ;
- };
- return ($traceurRuntime.createClass)(ObservableWrapper, {}, {
- createController: function() {
- return new Rx.Subject();
- },
- createObservable: function(subject) {
- return subject;
- },
- subscribe: function(observable, generatorOrOnNext) {
- var onThrow = arguments[2] !== (void 0) ? arguments[2] : null;
- var onReturn = arguments[3] !== (void 0) ? arguments[3] : null;
- if (isPresent(generatorOrOnNext.next)) {
- return observable.observeOn(Rx.Scheduler.timeout).subscribe((function(value) {
- return generatorOrOnNext.next(value);
- }), (function(error) {
- return generatorOrOnNext.throw(error);
- }), (function() {
- return generatorOrOnNext.return();
- }));
- } else {
- return observable.observeOn(Rx.Scheduler.timeout).subscribe(generatorOrOnNext, onThrow, onReturn);
- }
- },
- callNext: function(subject, value) {
- subject.onNext(value);
- },
- callThrow: function(subject, error) {
- subject.onError(error);
- },
- callReturn: function(subject) {
- subject.onCompleted();
- }
- });
- }()));
- Object.defineProperty(ObservableWrapper.createObservable, "parameters", {get: function() {
- return [[Rx.Subject]];
- }});
- Object.defineProperty(ObservableWrapper.subscribe, "parameters", {get: function() {
- return [[Observable], [], [], []];
- }});
- Object.defineProperty(ObservableWrapper.callNext, "parameters", {get: function() {
- return [[Rx.Subject], [assert.type.any]];
- }});
- Object.defineProperty(ObservableWrapper.callThrow, "parameters", {get: function() {
- return [[Rx.Subject], [assert.type.any]];
- }});
- Object.defineProperty(ObservableWrapper.callReturn, "parameters", {get: function() {
- return [[Rx.Subject]];
- }});
- }
- };
- });
- 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) {
- "use strict";
- var __moduleName = "angular2/src/reflection/reflection";
- var Type,
- isPresent,
- List,
- ListWrapper,
- Reflector,
- ReflectionCapabilities,
- reflector;
- return {
- setters: [function($__m) {
- Type = $__m.Type;
- isPresent = $__m.isPresent;
- }, function($__m) {
- List = $__m.List;
- ListWrapper = $__m.ListWrapper;
- }, function($__m) {
- Reflector = $__m.Reflector;
- $__export("Reflector", $__m.Reflector);
- }, function($__m) {
- ReflectionCapabilities = $__m.ReflectionCapabilities;
- }],
- execute: function() {
- reflector = $__export("reflector", new Reflector(new ReflectionCapabilities()));
- }
- };
- });
- 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) {
- "use strict";
- var __moduleName = "angular2/src/di/binding";
- var Type,
- isBlank,
- isPresent,
- List,
- MapWrapper,
- ListWrapper,
- reflector,
- Key,
- Inject,
- InjectLazy,
- InjectPromise,
- Optional,
- DependencyAnnotation,
- NoAnnotationError,
- Dependency,
- Binding,
- BindingBuilder;
- function bind(token) {
- return new BindingBuilder(token);
- }
- function _dependenciesFor(typeOrFunc) {
- var params = reflector.parameters(typeOrFunc);
- if (isBlank(params))
- return [];
- if (ListWrapper.any(params, (function(p) {
- return isBlank(p);
- })))
- throw new NoAnnotationError(typeOrFunc);
- return ListWrapper.map(params, (function(p) {
- return _extractToken(typeOrFunc, p);
- }));
- }
- function _extractToken(typeOrFunc, annotations) {
- var depProps = [];
- var token = null;
- var optional = false;
- var lazy = false;
- var asPromise = false;
- for (var i = 0; i < annotations.length; ++i) {
- var paramAnnotation = annotations[i];
- if (paramAnnotation instanceof Type) {
- token = paramAnnotation;
- } else if (paramAnnotation instanceof Inject) {
- token = paramAnnotation.token;
- } else if (paramAnnotation instanceof InjectPromise) {
- token = paramAnnotation.token;
- asPromise = true;
- } else if (paramAnnotation instanceof InjectLazy) {
- token = paramAnnotation.token;
- lazy = true;
- } else if (paramAnnotation instanceof Optional) {
- optional = true;
- } else if (paramAnnotation instanceof DependencyAnnotation) {
- if (isPresent(paramAnnotation.token)) {
- token = paramAnnotation.token;
- }
- ListWrapper.push(depProps, paramAnnotation);
- }
- }
- if (isPresent(token)) {
- return _createDependency(token, asPromise, lazy, optional, depProps);
- } else {
- throw new NoAnnotationError(typeOrFunc);
- }
- }
- function _createDependency(token, asPromise, lazy, optional, depProps) {
- return new Dependency(Key.get(token), asPromise, lazy, optional, depProps);
- }
- $__export("bind", bind);
- return {
- setters: [function($__m) {
- Type = $__m.Type;
- isBlank = $__m.isBlank;
- isPresent = $__m.isPresent;
- }, function($__m) {
- List = $__m.List;
- MapWrapper = $__m.MapWrapper;
- ListWrapper = $__m.ListWrapper;
- }, function($__m) {
- reflector = $__m.reflector;
- }, function($__m) {
- Key = $__m.Key;
- }, function($__m) {
- Inject = $__m.Inject;
- InjectLazy = $__m.InjectLazy;
- InjectPromise = $__m.InjectPromise;
- Optional = $__m.Optional;
- DependencyAnnotation = $__m.DependencyAnnotation;
- }, function($__m) {
- NoAnnotationError = $__m.NoAnnotationError;
- }],
- execute: function() {
- Dependency = $__export("Dependency", (function() {
- var Dependency = function Dependency(key, asPromise, lazy, optional, properties) {
- this.key = key;
- this.asPromise = asPromise;
- this.lazy = lazy;
- this.optional = optional;
- this.properties = properties;
- };
- return ($traceurRuntime.createClass)(Dependency, {}, {fromKey: function(key) {
- return new Dependency(key, false, false, false, []);
- }});
- }()));
- Object.defineProperty(Dependency, "parameters", {get: function() {
- return [[Key], [assert.type.boolean], [assert.type.boolean], [assert.type.boolean], [List]];
- }});
- Object.defineProperty(Dependency.fromKey, "parameters", {get: function() {
- return [[Key]];
- }});
- Binding = $__export("Binding", (function() {
- var Binding = function Binding(key, factory, dependencies, providedAsPromise) {
- this.key = key;
- this.factory = factory;
- this.dependencies = dependencies;
- this.providedAsPromise = providedAsPromise;
- };
- return ($traceurRuntime.createClass)(Binding, {}, {});
- }()));
- Object.defineProperty(Binding, "parameters", {get: function() {
- return [[Key], [Function], [List], [assert.type.boolean]];
- }});
- BindingBuilder = $__export("BindingBuilder", (function() {
- var BindingBuilder = function BindingBuilder(token) {
- this.token = token;
- };
- return ($traceurRuntime.createClass)(BindingBuilder, {
- toClass: function(type) {
- return new Binding(Key.get(this.token), reflector.factory(type), _dependenciesFor(type), false);
- },
- toValue: function(value) {
- return new Binding(Key.get(this.token), (function() {
- return value;
- }), [], false);
- },
- toAlias: function(aliasToken) {
- return new Binding(Key.get(this.token), (function(aliasInstance) {
- return aliasInstance;
- }), [Dependency.fromKey(Key.get(aliasToken))], false);
- },
- toFactory: function(factoryFunction) {
- var dependencies = arguments[1] !== (void 0) ? arguments[1] : null;
- return new Binding(Key.get(this.token), factoryFunction, this._constructDependencies(factoryFunction, dependencies), false);
- },
- toAsyncFactory: function(factoryFunction) {
- var dependencies = arguments[1] !== (void 0) ? arguments[1] : null;
- return new Binding(Key.get(this.token), factoryFunction, this._constructDependencies(factoryFunction, dependencies), true);
- },
- _constructDependencies: function(factoryFunction, dependencies) {
- return isBlank(dependencies) ? _dependenciesFor(factoryFunction) : ListWrapper.map(dependencies, (function(t) {
- return Dependency.fromKey(Key.get(t));
- }));
- }
- }, {});
- }()));
- Object.defineProperty(BindingBuilder.prototype.toClass, "parameters", {get: function() {
- return [[Type]];
- }});
- Object.defineProperty(BindingBuilder.prototype.toFactory, "parameters", {get: function() {
- return [[Function], [List]];
- }});
- Object.defineProperty(BindingBuilder.prototype.toAsyncFactory, "parameters", {get: function() {
- return [[Function], [List]];
- }});
- Object.defineProperty(BindingBuilder.prototype._constructDependencies, "parameters", {get: function() {
- return [[Function], [List]];
- }});
- }
- };
- });
- 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) {
- "use strict";
- var __moduleName = "angular2/src/di/injector";
- var Map,
- List,
- MapWrapper,
- ListWrapper,
- Binding,
- BindingBuilder,
- bind,
- ProviderError,
- NoProviderError,
- InvalidBindingError,
- AsyncBindingError,
- CyclicDependencyError,
- InstantiationError,
- FunctionWrapper,
- Type,
- isPresent,
- isBlank,
- Promise,
- PromiseWrapper,
- Key,
- _constructing,
- _notFound,
- _Waiting,
- Injector,
- _SyncInjectorStrategy,
- _AsyncInjectorStrategy;
- function _isWaiting(obj) {
- return obj instanceof _Waiting;
- }
- function _flattenBindings(bindings, res) {
- ListWrapper.forEach(bindings, function(b) {
- if (b instanceof Binding) {
- MapWrapper.set(res, b.key.id, b);
- } else if (b instanceof Type) {
- var s = bind(b).toClass(b);
- MapWrapper.set(res, s.key.id, s);
- } else if (b instanceof List) {
- _flattenBindings(b, res);
- } else if (b instanceof BindingBuilder) {
- throw new InvalidBindingError(b.token);
- } else {
- throw new InvalidBindingError(b);
- }
- });
- return res;
- }
- return {
- setters: [function($__m) {
- Map = $__m.Map;
- List = $__m.List;
- MapWrapper = $__m.MapWrapper;
- ListWrapper = $__m.ListWrapper;
- }, function($__m) {
- Binding = $__m.Binding;
- BindingBuilder = $__m.BindingBuilder;
- bind = $__m.bind;
- }, function($__m) {
- ProviderError = $__m.ProviderError;
- NoProviderError = $__m.NoProviderError;
- InvalidBindingError = $__m.InvalidBindingError;
- AsyncBindingError = $__m.AsyncBindingError;
- CyclicDependencyError = $__m.CyclicDependencyError;
- InstantiationError = $__m.InstantiationError;
- }, function($__m) {
- FunctionWrapper = $__m.FunctionWrapper;
- Type = $__m.Type;
- isPresent = $__m.isPresent;
- isBlank = $__m.isBlank;
- }, function($__m) {
- Promise = $__m.Promise;
- PromiseWrapper = $__m.PromiseWrapper;
- }, function($__m) {
- Key = $__m.Key;
- }],
- execute: function() {
- _constructing = new Object();
- _notFound = new Object();
- _Waiting = (function() {
- var _Waiting = function _Waiting(promise) {
- this.promise = promise;
- };
- return ($traceurRuntime.createClass)(_Waiting, {}, {});
- }());
- Object.defineProperty(_Waiting, "parameters", {get: function() {
- return [[Promise]];
- }});
- Injector = $__export("Injector", (function() {
- var Injector = function Injector(bindings) {
- var $__3,
- $__4;
- var $__2 = arguments[1] !== (void 0) ? arguments[1] : {},
- parent = ($__3 = $__2.parent) === void 0 ? null : $__3,
- defaultBindings = ($__4 = $__2.defaultBindings) === void 0 ? false : $__4;
- var flatten = _flattenBindings(bindings, MapWrapper.create());
- this._bindings = this._createListOfBindings(flatten);
- this._instances = this._createInstances();
- this._parent = parent;
- this._defaultBindings = defaultBindings;
- this._asyncStrategy = new _AsyncInjectorStrategy(this);
- this._syncStrategy = new _SyncInjectorStrategy(this);
- };
- return ($traceurRuntime.createClass)(Injector, {
- get: function(token) {
- return this._getByKey(Key.get(token), false, false, false);
- },
- getOptional: function(token) {
- return this._getByKey(Key.get(token), false, false, true);
- },
- asyncGet: function(token) {
- return this._getByKey(Key.get(token), true, false, false);
- },
- createChild: function(bindings) {
- return new Injector(bindings, {parent: this});
- },
- _createListOfBindings: function(flattenBindings) {
- var bindings = ListWrapper.createFixedSize(Key.numberOfKeys + 1);
- MapWrapper.forEach(flattenBindings, (function(v, keyId) {
- return bindings[keyId] = v;
- }));
- return bindings;
- },
- _createInstances: function() {
- return ListWrapper.createFixedSize(Key.numberOfKeys + 1);
- },
- _getByKey: function(key, returnPromise, returnLazy, optional) {
- var $__0 = this;
- if (returnLazy) {
- return (function() {
- return $__0._getByKey(key, returnPromise, false, optional);
- });
- }
- var strategy = returnPromise ? this._asyncStrategy : this._syncStrategy;
- var instance = strategy.readFromCache(key);
- if (instance !== _notFound)
- return instance;
- instance = strategy.instantiate(key);
- if (instance !== _notFound)
- return instance;
- if (isPresent(this._parent)) {
- return this._parent._getByKey(key, returnPromise, returnLazy, optional);
- }
- if (optional) {
- return null;
- } else {
- throw new NoProviderError(key);
- }
- },
- _resolveDependencies: function(key, binding, forceAsync) {
- var $__0 = this;
- try {
- var getDependency = (function(d) {
- return $__0._getByKey(d.key, forceAsync || d.asPromise, d.lazy, d.optional);
- });
- return ListWrapper.map(binding.dependencies, getDependency);
- } catch (e) {
- this._clear(key);
- if (e instanceof ProviderError)
- e.addKey(key);
- throw e;
- }
- },
- _getInstance: function(key) {
- if (this._instances.length <= key.id)
- return null;
- return ListWrapper.get(this._instances, key.id);
- },
- _setInstance: function(key, obj) {
- ListWrapper.set(this._instances, key.id, obj);
- },
- _getBinding: function(key) {
- var binding = this._bindings.length <= key.id ? null : ListWrapper.get(this._bindings, key.id);
- if (isBlank(binding) && this._defaultBindings) {
- return bind(key.token).toClass(key.token);
- } else {
- return binding;
- }
- },
- _markAsConstructing: function(key) {
- this._setInstance(key, _constructing);
- },
- _clear: function(key) {
- this._setInstance(key, null);
- }
- }, {});
- }()));
- Object.defineProperty(Injector, "parameters", {get: function() {
- return [[List], []];
- }});
- Object.defineProperty(Injector.prototype.createChild, "parameters", {get: function() {
- return [[List]];
- }});
- Object.defineProperty(Injector.prototype._getByKey, "parameters", {get: function() {
- return [[Key], [assert.type.boolean], [assert.type.boolean], [assert.type.boolean]];
- }});
- Object.defineProperty(Injector.prototype._resolveDependencies, "parameters", {get: function() {
- return [[Key], [Binding], [assert.type.boolean]];
- }});
- Object.defineProperty(Injector.prototype._getInstance, "parameters", {get: function() {
- return [[Key]];
- }});
- Object.defineProperty(Injector.prototype._setInstance, "parameters", {get: function() {
- return [[Key], []];
- }});
- Object.defineProperty(Injector.prototype._getBinding, "parameters", {get: function() {
- return [[Key]];
- }});
- Object.defineProperty(Injector.prototype._markAsConstructing, "parameters", {get: function() {
- return [[Key]];
- }});
- Object.defineProperty(Injector.prototype._clear, "parameters", {get: function() {
- return [[Key]];
- }});
- _SyncInjectorStrategy = (function() {
- var _SyncInjectorStrategy = function _SyncInjectorStrategy(injector) {
- this.injector = injector;
- };
- return ($traceurRuntime.createClass)(_SyncInjectorStrategy, {
- readFromCache: function(key) {
- if (key.token === Injector) {
- return this.injector;
- }
- var instance = this.injector._getInstance(key);
- if (instance === _constructing) {
- throw new CyclicDependencyError(key);
- } else if (isPresent(instance) && !_isWaiting(instance)) {
- return instance;
- } else {
- return _notFound;
- }
- },
- instantiate: function(key) {
- var binding = this.injector._getBinding(key);
- if (isBlank(binding))
- return _notFound;
- if (binding.providedAsPromise)
- throw new AsyncBindingError(key);
- this.injector._markAsConstructing(key);
- var deps = this.injector._resolveDependencies(key, binding, false);
- return this._createInstance(key, binding, deps);
- },
- _createInstance: function(key, binding, deps) {
- try {
- var instance = FunctionWrapper.apply(binding.factory, deps);
- this.injector._setInstance(key, instance);
- return instance;
- } catch (e) {
- this.injector._clear(key);
- throw new InstantiationError(e, key);
- }
- }
- }, {});
- }());
- Object.defineProperty(_SyncInjectorStrategy, "parameters", {get: function() {
- return [[Injector]];
- }});
- Object.defineProperty(_SyncInjectorStrategy.prototype.readFromCache, "parameters", {get: function() {
- return [[Key]];
- }});
- Object.defineProperty(_SyncInjectorStrategy.prototype.instantiate, "parameters", {get: function() {
- return [[Key]];
- }});
- Object.defineProperty(_SyncInjectorStrategy.prototype._createInstance, "parameters", {get: function() {
- return [[Key], [Binding], [List]];
- }});
- _AsyncInjectorStrategy = (function() {
- var _AsyncInjectorStrategy = function _AsyncInjectorStrategy(injector) {
- this.injector = injector;
- };
- return ($traceurRuntime.createClass)(_AsyncInjectorStrategy, {
- readFromCache: function(key) {
- if (key.token === Injector) {
- return PromiseWrapper.resolve(this.injector);
- }
- var instance = this.injector._getInstance(key);
- if (instance === _constructing) {
- throw new CyclicDependencyError(key);
- } else if (_isWaiting(instance)) {
- return instance.promise;
- } else if (isPresent(instance)) {
- return PromiseWrapper.resolve(instance);
- } else {
- return _notFound;
- }
- },
- instantiate: function(key) {
- var $__0 = this;
- var binding = this.injector._getBinding(key);
- if (isBlank(binding))
- return _notFound;
- this.injector._markAsConstructing(key);
- var deps = this.injector._resolveDependencies(key, binding, true);
- var depsPromise = PromiseWrapper.all(deps);
- var promise = PromiseWrapper.then(depsPromise, null, (function(e) {
- return $__0._errorHandler(key, e);
- })).then((function(deps) {
- return $__0._findOrCreate(key, binding, deps);
- })).then((function(instance) {
- return $__0._cacheInstance(key, instance);
- }));
- this.injector._setInstance(key, new _Waiting(promise));
- return promise;
- },
- _errorHandler: function(key, e) {
- if (e instanceof ProviderError)
- e.addKey(key);
- return PromiseWrapper.reject(e);
- },
- _findOrCreate: function(key, binding, deps) {
- try {
- var instance = this.injector._getInstance(key);
- if (!_isWaiting(instance))
- return instance;
- return FunctionWrapper.apply(binding.factory, deps);
- } catch (e) {
- this.injector._clear(key);
- throw new InstantiationError(e, key);
- }
- },
- _cacheInstance: function(key, instance) {
- this.injector._setInstance(key, instance);
- return instance;
- }
- }, {});
- }());
- Object.defineProperty(_AsyncInjectorStrategy, "parameters", {get: function() {
- return [[Injector]];
- }});
- Object.defineProperty(_AsyncInjectorStrategy.prototype.readFromCache, "parameters", {get: function() {
- return [[Key]];
- }});
- Object.defineProperty(_AsyncInjectorStrategy.prototype.instantiate, "parameters", {get: function() {
- return [[Key]];
- }});
- Object.defineProperty(_AsyncInjectorStrategy.prototype._errorHandler, "parameters", {get: function() {
- return [[Key], []];
- }});
- Object.defineProperty(_AsyncInjectorStrategy.prototype._findOrCreate, "parameters", {get: function() {
- return [[Key], [Binding], [List]];
- }});
- Object.defineProperty(_flattenBindings, "parameters", {get: function() {
- return [[List], [Map]];
- }});
- }
- };
- });
- 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) {
- "use strict";
- var __moduleName = "angular2/di";
- return {
- setters: [function($__m) {
- $__export("Inject", $__m.Inject);
- $__export("InjectPromise", $__m.InjectPromise);
- $__export("InjectLazy", $__m.InjectLazy);
- $__export("Injectable", $__m.Injectable);
- $__export("Optional", $__m.Optional);
- $__export("DependencyAnnotation", $__m.DependencyAnnotation);
- }, function($__m) {
- $__export("Injector", $__m.Injector);
- }, function($__m) {
- $__export("Binding", $__m.Binding);
- $__export("Dependency", $__m.Dependency);
- $__export("bind", $__m.bind);
- }, function($__m) {
- $__export("Key", $__m.Key);
- $__export("KeyRegistry", $__m.KeyRegistry);
- }, function($__m) {
- $__export("KeyMetadataError", $__m.KeyMetadataError);
- $__export("NoProviderError", $__m.NoProviderError);
- $__export("ProviderError", $__m.ProviderError);
- $__export("AsyncBindingError", $__m.AsyncBindingError);
- $__export("CyclicDependencyError", $__m.CyclicDependencyError);
- $__export("InstantiationError", $__m.InstantiationError);
- $__export("InvalidBindingError", $__m.InvalidBindingError);
- $__export("NoAnnotationError", $__m.NoAnnotationError);
- }, function($__m) {
- $__export("OpaqueToken", $__m.OpaqueToken);
- }],
- execute: function() {}
- };
- });
- //# sourceMappingURL=angular2.di.js.map
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement