made with requirebin
Created
August 8, 2014 21:33
-
-
Save jhusain/9522cb1a4964981f06bf to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// example using the raf module from npm. try changing some values! | |
var Rx = require('rx'); | |
window.Rx = Rx; | |
!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),(f.falkor||(f.falkor={})).PathEvaluator=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){ | |
var Rx = _dereq_("../src/rx.ultralite"); | |
var Observable = Rx.Observable, | |
Disposable = Rx.Disposable, | |
sentinelSize = 50, | |
isArray = Array.isArray; | |
var µTime = 1, | |
µRate = 0.25, | |
µSize = 0.25, | |
MIN_SAFE_INTEGER = -Math.pow(2, 53) - 1; | |
PathEvaluator.internals = { | |
getPaths: getPaths, | |
setPaths: setPaths, | |
setPBF: setPBF, | |
setPBFRoot: setPBFRoot, | |
setPathsRoot: setPathsRoot, | |
stringify: stringify | |
}; | |
PathEvaluator.EXPIRES_NOW = 0; | |
PathEvaluator.EXPIRES_NEVER = 1; | |
PathEvaluator.lazy = true; | |
PathEvaluator.connected = true; | |
PathEvaluator.streaming = true; | |
PathEvaluator.refreshing = false; | |
PathEvaluator.prototype.get = get; | |
PathEvaluator.prototype.set = set; | |
PathEvaluator.prototype.call = call; | |
PathEvaluator.prototype.invalidate = invalidate; | |
PathEvaluator.prototype.value = value; | |
PathEvaluator.prototype.optimize = optimize; | |
PathEvaluator.prototype.context = context; | |
PathEvaluator.prototype.insert = insert; | |
PathEvaluator.prototype.getValueSync = value; | |
PathEvaluator.prototype.setValueSync = insert; | |
PathEvaluator.prototype.bind = bind; | |
PathEvaluator.prototype.hardBind = hardBind; | |
PathEvaluator.prototype.deferBind = deferBind; | |
PathEvaluator.prototype.serialize = serialize; | |
PathEvaluator.prototype.deserialize = immediateToLazy(deserialize); | |
PathEvaluator.prototype.toBatched = toBatched; | |
PathEvaluator.prototype.toIndependent = toIndependent; | |
PathEvaluator.prototype.toLazy = toLazy; | |
PathEvaluator.prototype.toEager = toEager; | |
PathEvaluator.prototype.toRemote = toRemote; | |
PathEvaluator.prototype.toLocal = toLocal; | |
PathEvaluator.prototype.toProgressive = toProgressive; | |
PathEvaluator.prototype.toAggregate = toAggregate; | |
PathEvaluator.prototype.toCached = toCached; | |
PathEvaluator.prototype.toRefreshed = toRefreshed; | |
function PathEvaluator(maxSize, loader, cache, lazy, batches, streaming, connected, refreshing) { | |
this.loader = loader || { | |
get: function() { | |
return Observable.create(function(o) { | |
o.onCompleted(); | |
return function() {}; | |
}); | |
} | |
}; | |
if (typeof maxSize !== 'number') { | |
throw new Error('PathEvaluator: maxSize must be a number.'); | |
} | |
this.maxSize = maxSize; | |
this.cache = cache || {}; | |
this.path = []; | |
this.timeExpireList = []; | |
this.sizeExpireList = []; | |
this.root = this; | |
this._batches = batches; | |
this._lazy = lazy !== undefined ? lazy : PathEvaluator.lazy; | |
this._streaming = streaming !== undefined ? streaming : PathEvaluator.streaming; | |
this._connected = connected !== undefined ? connected : PathEvaluator.connected; | |
this._refreshing = refreshing !== undefined ? refreshing : PathEvaluator.refreshing; | |
return this; | |
} | |
function toBatched(newBatch) { | |
if (this._batches == null) delete this._batches; | |
return this._batches !== undefined && newBatch === undefined ? | |
this : clone(this, undefined, newBatch || []); | |
} | |
function toIndependent() { | |
return this._batches === undefined ? | |
this : clone(this, undefined, null); | |
} | |
function toLazy() { | |
return this._lazy === true ? | |
this : clone(this, undefined, undefined, true); | |
} | |
function toEager() { | |
return this._lazy === false ? | |
this : clone(this, undefined, undefined, false); | |
} | |
function toProgressive() { | |
return this._streaming === true ? | |
this : clone(this, undefined, undefined, undefined, true); | |
} | |
function toAggregate() { | |
return this._streaming === false ? | |
this : clone(this, undefined, undefined, undefined, false); | |
} | |
function toRemote() { | |
return this._connected === true ? | |
this : clone(this, undefined, undefined, undefined, undefined, true); | |
} | |
function toLocal() { | |
return this._connected === false ? | |
this : clone(this, undefined, undefined, undefined, undefined, false); | |
} | |
function toCached() { | |
return this._refreshing === false ? | |
this : clone(this, undefined, undefined, undefined, undefined, undefined, false); | |
} | |
function toRefreshed() { | |
return this._refreshing === true ? | |
this : clone(this, undefined, undefined, undefined, undefined, undefined, true); | |
} | |
function noop() {} | |
function clone(evaluator, path, batches, lazy, streaming, connected, refreshing) { | |
var pe = Object.create(evaluator); | |
if (path !== undefined) pe.path = path; | |
if (batches !== undefined) pe._batches = batches; | |
if (lazy !== undefined) pe._lazy = lazy; | |
if (streaming !== undefined) pe._streaming = streaming; | |
if (connected !== undefined) pe._connected = connected; | |
if (refreshing !== undefined) pe._refreshing = refreshing; | |
return pe; | |
} | |
function immediateToLazy(immediateFn) { | |
return function lazyImpl() { | |
var self = this, | |
lazyArgs = args(arguments); | |
return Observable.createWithDisposable(function(observer) { | |
return immediateFn.apply(self, lazyArgs.concat(self.context(), onNext, onError, onCompleted)); | |
function onNext(pbvf) { | |
if (self._streaming === false || pbvf === self) { | |
observer.onNext(pbvf); | |
} else { | |
var pbv = {}, | |
path = pbvf.path, | |
value = pbvf.value, | |
i = -1, | |
n = path.length, | |
a = new Array(n); | |
if (typeof value === 'object' && | |
!Array.isArray(value) && | |
value != null) { | |
value = Object.create(value); | |
} | |
pbv.value = value; | |
while (++i < n) { | |
a[i] = path[i]; | |
} | |
pbv.path = path; | |
path = pbvf.optimized; | |
i = -1; | |
n = path.length; | |
a = new Array(n); | |
while (++i < n) { | |
a[i] = path[i]; | |
} | |
pbv.optimized = a; | |
observer.onNext(pbv); | |
} | |
} | |
function onError(e) { | |
observer.onError(e); | |
} | |
function onCompleted() { | |
observer.onCompleted(); | |
} | |
}); | |
}; | |
} | |
function args(list) { | |
for (var a = [], i = 0, n = list.length; i < n; ++i) { | |
a[i] = list[i]; | |
} | |
return a; | |
} | |
function serialize(cache) { | |
var frame, key, context = cache || this.cache, | |
message = {}, | |
depth = 0, | |
stack = [], | |
keys; | |
descending: while (depth >= 0) { | |
frame = stack[depth] || (stack[depth] = { | |
context: context, | |
message: message, | |
keys: Object.keys(context).filter(internalKeys).sort() | |
}); | |
context = frame.context; | |
message = frame.message; | |
keys = frame.keys; | |
while ((key = keys.shift())) { | |
context = context[key]; | |
if (context == null || Array.isArray(context) || typeof context !== 'object') { | |
message[key] = context; | |
context = frame.context; | |
} else { | |
message = message[key] || (message[key] = {}); | |
++depth; | |
continue descending; | |
} | |
} | |
stack[depth--] = undefined; | |
} | |
return message; | |
function internalKeys(x) { | |
return x.indexOf('__') !== 0; | |
} | |
} | |
function deserialize(cache, pbv, onNext, onError, onCompleted) { | |
var self = this, | |
frame, key, context = cache, | |
depth = 0, | |
path = [], | |
paths = [], | |
stack = [], | |
keys; | |
descending: while (depth >= 0) { | |
frame = stack[depth] || (stack[depth] = { | |
context: context, | |
keys: Object.keys(context).filter(internalKeys).sort() | |
}); | |
context = frame.context; | |
keys = frame.keys; | |
while ((key = keys.shift())) { | |
path[depth] = key; | |
context = context[key]; | |
if (context == null || Array.isArray(context) || typeof context !== "object" || context.$type !== undefined) { | |
context = frame.context; | |
paths.push(path.slice(0, depth + 1)); | |
} else { | |
++depth; | |
continue descending; | |
} | |
} | |
stack[depth--] = undefined; | |
} | |
return setPBFRoot.call(self, { | |
paths: paths, | |
value: cache | |
}, noop, finished, finished); | |
function internalKeys(x) { | |
return (x[0] !== '$' && x.indexOf('__') !== 0); | |
} | |
function finished() { | |
onNext(self); | |
onCompleted(); | |
} | |
} | |
function stringify(obj, replacer, space) { | |
return JSON.stringify(flatten(obj), replacer, space); | |
} | |
function flatten(obj) { | |
var flattenedObject, keys, keyCount, key; | |
if (obj === null || typeof obj !== 'object') { | |
return obj; | |
} else if (obj instanceof Array) { | |
flattenedObject = []; | |
for (keyCount = 0; keyCount < obj.length; keyCount++) { | |
flattenedObject.push(flatten(obj[keyCount])); | |
} | |
return flattenedObject; | |
} else { | |
flattenedObject = {}; | |
do { | |
keys = Object.keys(obj); | |
keys.sort(); | |
for (keyCount = 0; keyCount < keys.length; keyCount++) { | |
key = keys[keyCount]; | |
if (key.substring(0, 2) !== '__') { | |
flattenedObject[key] = flatten(obj[key]); | |
} | |
} | |
obj = Object.getPrototypeOf(obj); | |
} while (obj !== undefined && obj !== null); | |
return flattenedObject; | |
} | |
} | |
function bind(path) { | |
var pe = clone(this, this.path.concat(path)); | |
pe._context = null; | |
return pe; | |
} | |
function hardBind(path) { | |
var branch = findPath.call(this, this.path.concat(path, null)), | |
context = branch.value, | |
backRefsLength, evaluator; | |
if (context) { | |
evaluator = clone(this, branch.optimized); | |
backRefsLength = context.__refsLength || 0; | |
context['__ref' + backRefsLength] = evaluator; | |
context.__refsLength = backRefsLength + 1; | |
evaluator._context = context; | |
} else { | |
evaluator = clone(this, this.path.concat(path)); | |
} | |
return evaluator; | |
} | |
function deferBind(path) { | |
var self = this; | |
return Observable.create(function(observer) { | |
observer.onNext(self.hardBind(path)); | |
observer.onCompleted(); | |
return noop; | |
}); | |
} | |
function get() { | |
var a = args(arguments); | |
if (this._lazy) { | |
if (this._refreshing) { | |
return refreshLazily.call(this, a); | |
} | |
return getLazily.call(this, a); | |
} | |
var pbv = this.context(), | |
onNext = a[a.length - 3], | |
onError = a[a.length - 2], | |
onCompleted = a[a.length - 1]; | |
a = a.slice(0, -3); | |
if (this._refreshing) { | |
return refreshPaths.call(this, a, pbv, onNext, onError, onCompleted); | |
} | |
return getPaths.call(this, a, pbv, onNext, onError, onCompleted); | |
} | |
var getLazily = immediateToLazy(getPaths), | |
refreshLazily = immediateToLazy(refreshPaths); | |
function getPaths(paths, pbv, onNext, onError, onCompleted) { | |
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW, | |
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER, | |
self, streaming, connected, max, | |
batches, batch, observers, observer, | |
contexts, messages, pathSets, misses, errors, | |
cache, context, parent, value, type, size, expires, timestamp, | |
messageParent, message, messageValue, messageType, messageSize, | |
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive, | |
sizeOffset = 0, | |
bound, original, optimized, offset, | |
path, key, column, last, ref, now, | |
refs, cols, prevs, interrupts, interrupted, | |
generations, generationsLen, backRefs, pathSet, index, total, miss; | |
var timeExpireList = this.timeExpireList, | |
sizeExpireList = this.sizeExpireList, | |
timeExpireListLength = timeExpireList.length, | |
sizeExpireListLength = sizeExpireList.length; | |
self = this; | |
now = Date.now(); | |
streaming = self._streaming; | |
connected = self._connected; | |
cache = self.cache; | |
batches = self._batches; | |
max = self.maxSize; | |
misses = paths.misses || (paths.misses = []); | |
errors = paths.errors || (paths.errors = []); | |
refs = paths.refs || (paths.refs = []); | |
cols = paths.cols || (paths.cols = []); | |
prevs = paths.prevs || (paths.prevs = []); | |
interrupts = paths.interrupts || (paths.interrupts = 0); | |
interrupted = interrupts > 0; | |
observers = paths.observers || (paths.observers = []); | |
index = paths.index || (paths.index = 0); | |
total = paths.length; | |
context = init_context(paths, pbv.value || {}); | |
contexts = paths.contexts; | |
bound = refs[-1] = pbv.optimized || pbv.path; | |
pbv.path = original = []; | |
pbv.optimized = optimized = []; | |
pbv.value = undefined; | |
observers[observers.length] = observer = { | |
onNext: onNext, | |
onError: onError, | |
onCompleted: onCompleted, | |
streaming: streaming, | |
paths: 0, | |
path: bound, | |
misses: paths.concat(), | |
errors: errors | |
}; | |
getting: for (; index < total; ++index) { | |
original.length = 0; | |
path = paths[paths.index = index]; | |
last = path.length - 1; | |
column = path.index || (path.index = 0); | |
reset_refs(); | |
reset_cols(); | |
unlocking: while (column >= 0) { | |
parent = contexts[column - 1]; | |
descend(); | |
unlock(); | |
path.index = column = ascend(path, column, 0); | |
reset_refs(); | |
reset_cols(); | |
} | |
path.index = 0; | |
} | |
paths.index = 0; | |
if (connected === true && misses.length > 0) { | |
return batch_or_load_paths(); | |
} | |
finish(); | |
return Disposable.empty; | |
/** @inline */ | |
function ascend(path, column, lower) { | |
var key; | |
ascending: for (; column >= lower; --column) { | |
key = path[column]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
if (isArray(key)) { | |
if (++key.index === key.length) { | |
key = key[key.index = offset = 0]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
} else { | |
break ascending; | |
} | |
} | |
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) { | |
offset = 0; | |
key.offset = key.from; | |
continue ascending; | |
} | |
break ascending; | |
} | |
return column; | |
} | |
/** @inline */ | |
function reset_cols() { | |
var i = cols[interrupts - 1]; | |
while (i >= column) { | |
if (--interrupts >= 0) { | |
i = cols[interrupts - 1]; | |
} else { | |
break; | |
} | |
} | |
interrupted = interrupts > 0; | |
} | |
/** @inline */ | |
function reset_refs() { | |
ref = refs[column - 1]; | |
if (ref !== undefined) { | |
offset = reset_optimized_from_ref() - column; | |
} | |
} | |
/** @inline */ | |
function find_key(key) { | |
if (is_complex_key(key)) { | |
if (isArray(key)) { | |
key = find_segment_key(key); | |
if (is_complex_key(key)) { | |
key = find_range_key(key); | |
} | |
} else { | |
key = find_range_key(key); | |
} | |
} | |
return key; | |
} | |
/** @inline */ | |
function find_segment_key(key) { | |
return key[key.index || (key.index = 0)]; | |
} | |
/** @inline */ | |
function find_range_key(key) { | |
return key.offset || (key.offset = key.from || (key.from = 0)); | |
} | |
/** @inline */ | |
function is_simple_key(key) { | |
return (typeof key !== 'object' || key == null); | |
} | |
/** @inline */ | |
function is_complex_key(key) { | |
return (typeof key === 'object' && key != null); | |
} | |
/** @inline */ | |
function find_context() { | |
return parent[key]; | |
} | |
/** @inline */ | |
function find_leaf_context() { | |
return ( | |
(context = parent[key]) !== undefined && ( | |
((expires = context.$expires) === undefined && context) || | |
((expires === EXPIRES_NOW && context)) && | |
((expires === EXPIRES_NEVER && context)) && | |
((expires > now && context))) || | |
// (timeExpireList[timeExpireListLength++] = context) && | |
// (context = undefined))) || | |
(context = undefined) | |
); | |
} | |
/** @inline */ | |
function find_type() { | |
return (type = context && context.$type || undefined); | |
} | |
/** @inline */ | |
function find_value() { | |
return (value = ( | |
context !== undefined && | |
find_type() === "sentinel" | |
) ? context.value : context); | |
} | |
/** @inline */ | |
function reset_path_from_ref() { | |
if (path._context === undefined) { | |
set_back_reference(); | |
} | |
while (interrupted === true && column === last) { | |
path = prevs[--interrupts]; | |
column = cols[interrupts]; | |
interrupted = interrupts > 0; | |
offset = last - column; | |
last = path.length - 1; | |
} | |
} | |
/** @inline */ | |
function reset_optimized_from_ref() { | |
var n = optimized.length = ref.length; | |
for (var i = -1; ++i < n;) { | |
optimized[i] = ref[i]; | |
} | |
return n; | |
} | |
/** @inline */ | |
function save_optimized(optimized, column, offset, key) { | |
return (optimized[optimized.length = column + offset] = key); | |
} | |
/** @inline */ | |
function save_original(original, column, key) { | |
return (original[column] = key); | |
} | |
/** @inline */ | |
function set_back_reference() { | |
// create a back reference | |
backRefs = context.__refsLength || 0; | |
context['__ref' + backRefs] = path; | |
context.__refsLength = backRefs + 1; | |
// create a hard reference | |
path._context = context; | |
} | |
/** @inline */ | |
function stamp() { | |
context.__access_time = now; | |
context.__access_count = (context.__access_count || 0) + 1; | |
} | |
/** @inline */ | |
function build_path_set(paths, pathSet, observer) { | |
var contexts = [], | |
context, xs, | |
index = -1, | |
total = paths.length, | |
path, column, last, obs; | |
contexts[-1] = pathSet || (pathSet = { | |
__observers: [] | |
}); | |
building: while (++index < total) { | |
path = paths[index]; | |
obs = observer || path.observer; | |
last = path.length - 1; | |
column = 0; | |
unlocking: while (column >= 0) { | |
context = contexts[column - 1]; | |
(xs = context.__observers)[xs.length] = obs; | |
for (; column <= last; ++column) { | |
key = find_key(path[column]); | |
if (key != null) { | |
contexts[column] = context = context[key] || (context[key] = { | |
__observers: [] | |
}); | |
(xs = context.__observers)[xs.length] = obs; | |
} | |
} | |
obs.paths = (obs.paths || 0) + 1; | |
column = ascend(path, column, 0); | |
} | |
} | |
return pathSet; | |
} | |
/** @inline */ | |
function cleanup() { | |
if ((total = cache.$size) >= max) { | |
if (batches === undefined || batches.length === 0 || batches.every(function(batch) { | |
return batch.pendingLoad === false; | |
})) { | |
if (timeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up time expire list"); | |
self.root.timeExpireList = timeExpireList = | |
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
total = timeExpireList.total; | |
} | |
} | |
if (sizeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up size expire list"); | |
self.root.sizeExpireList = sizeExpireList = | |
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
} | |
} | |
} | |
} | |
} | |
/** @inline */ | |
function descend() { | |
descending: for (; column <= last; ++column) { | |
key = find_key(path[column]); | |
// all the columns before the last column | |
if (column < last) { | |
if (key == null) { | |
continue descending; | |
} | |
save_optimized(optimized, column, offset, key); | |
if (interrupted === false) { | |
save_original(original, column, key); | |
} | |
if ((context = find_context(parent, key)) === undefined) { | |
short_circuit(); | |
break descending; | |
} | |
value = find_value(context); | |
if (isArray(value)) { | |
do { | |
stamp(); | |
interrupt(); | |
} while (isArray(value = find_value(context))); | |
type = undefined; | |
continue descending; | |
} else if (type !== undefined) { | |
short_circuit(); | |
break descending; | |
} else if (interrupted === false) { | |
contexts[column] = context; | |
} | |
type = undefined; | |
parent = context; | |
continue descending; | |
} | |
// last column | |
if (key != null) { | |
save_optimized(optimized, column, offset, key); | |
context = find_leaf_context(parent, key); | |
} | |
value = find_value(context); | |
if (interrupted === true) { | |
if (context == null || type === "error") { | |
short_circuit_int(); | |
break descending; | |
} | |
reset_path_from_ref(); | |
contexts[column] = parent = context; | |
if (isArray(value)) { | |
stamp(); | |
interrupt(); | |
} | |
type = undefined; | |
continue descending; | |
} | |
save_original(original, column, key); | |
break descending; | |
} | |
} | |
/** @inline */ | |
function unlock() { | |
if (context == null) { | |
miss = save_missing(); | |
miss.observer = observer; | |
misses[misses.length] = miss; | |
} else if (type === 'error') { | |
stamp(); | |
save_error(); | |
} else { | |
stamp(); | |
if (streaming === true && value !== undefined) { | |
pbv.value = value; | |
onNext(pbv); | |
} | |
} | |
} | |
/** @inline */ | |
function init_context(paths, context) { | |
return contexts === undefined ? | |
((paths.contexts = contexts = [])[-1] = context) : | |
((contexts[-1])); | |
} | |
/** @inline */ | |
function interrupt() { | |
refs[column] = ref = value; | |
if ((context = value._context) !== undefined) { | |
offset = reset_optimized_from_ref() - column - 1; | |
contexts[column] = parent = context; | |
} else { | |
prevs[interrupts] = path; | |
cols[interrupts++] = column; | |
interrupted = true; | |
path = value; | |
last = path.length - 1; | |
offset = 0; | |
column = -1; | |
parent = cache; | |
context = value = undefined; | |
} | |
} | |
/** @inline */ | |
function save_missing() { | |
var i, j, nulls = 0, | |
n = optimized.length, | |
miss = new Array(n + last - column); | |
for (i = j = -1; ++i < n;) { | |
key = optimized[i]; | |
if (key != null) { | |
miss[++j] = key; | |
} else { | |
--nulls; | |
} | |
} | |
i = column; | |
while (++i <= last) { | |
key = path[i]; | |
if (key != null) { | |
miss[++j] = key; | |
} else { | |
--nulls; | |
} | |
} | |
miss.length += nulls; | |
return miss; | |
} | |
/** @inline */ | |
function batch_or_load_paths() { | |
var loadDisposable = Disposable.empty; | |
if (batches === undefined) { | |
pathSet = build_path_set(misses, null, observer); | |
misses = rangeCollapse(buildQueries(pathSet)); | |
loadDisposable = self.loader.get(misses).subscribe(function(pbf) { | |
pbf = Object.create(pbf); | |
var error = pbf.error, | |
serverErrors = []; | |
// TODO: retry certain errors | |
while (error !== undefined) { | |
if (error.innerErrors) { | |
serverErrors.push.apply(serverErrors, error.innerErrors); | |
} else { | |
error.$type = "error"; | |
setPath.call(self, error.path || error.pql, error, pbf.value); | |
} | |
error = serverErrors.pop(); | |
} | |
pbf.paths.errors = errors; | |
pbf.paths.pathSet = undefined; | |
pbf.paths.observers = undefined; | |
setPBFRoot.call(self, pbf, onNext, onError, onCompleted); | |
}, onError, noop); | |
return loadDisposable; | |
} else { | |
batch = batches[batches.length - 1]; | |
if (batch === undefined || batch.pendingLoad === true) { | |
batch = Disposable.create(function() { | |
var i = batches.indexOf(batch); | |
if (i !== -1) { | |
batches.splice(i, 1); | |
} | |
if (batch.batchID !== undefined) { | |
clearTimeout(batch.batchID); | |
batch.batchID = undefined; | |
} | |
if (batch.pendingLoad === true) { | |
loadDisposable.dispose(); | |
} | |
batch.pendingLoad = false; | |
}); | |
batch.batchIndex = batches.length; | |
// util.log.warn('PathEvaluator: new batch - ' + batch.batchIndex); | |
batch.batchID = setTimeout(function() { | |
var i = batches.indexOf(batch); | |
if (i !== -1) { | |
batches.splice(i, 1); | |
} | |
batch.batchID = undefined; | |
batch.pendingLoad = true; | |
batch.pathSet = build_path_set(batch.misses); | |
batch.misses = rangeCollapse(buildQueries(batch.pathSet)); | |
// util.log.warn('PathEvaluator: requesting batch ' + batch.batchIndex + ' - ' + JSON.stringify(batch.misses)); | |
loadDisposable = self.loader.get(batch.misses).subscribe(function(pbf) { | |
pbf = Object.create(pbf); | |
batch.pendingLoad = false; | |
// util.log.warn('PathEvaluator: setting batch - ' + batch.batchIndex); | |
var error = pbf.error, | |
serverErrors = []; | |
// TODO: retry certain errors | |
while (error !== undefined) { | |
if (error.innerErrors) { | |
serverErrors.push.apply(serverErrors, error.innerErrors); | |
} else { | |
error.$type = "error"; | |
setPath.call(self, error.path || error.pql, error, pbf.value); | |
} | |
error = serverErrors.pop(); | |
} | |
pbf.paths.errors = []; | |
pbf.paths.pathSet = batch.pathSet; | |
pbf.paths.observers = batch.observers.concat(); | |
setPBFRoot.call(self, pbf, noop, noop, noop); | |
}, onError, noop); | |
}, 16); | |
batch.pendingLoad = false; | |
batches.push(batch); | |
} | |
// util.log.warn('PathEvaluator: adding paths to batch - ' + batch.batchIndex); | |
var batchMisses = batch.misses || (batch.misses = []); | |
var batchObservers = batch.observers || (batch.observers = []); | |
batchMisses.push.apply(batchMisses, misses); | |
batchObservers.push(observer); | |
batch.pathSet = batch.pathSet || (batch.pathSet = { | |
__observers: [] | |
}); | |
return Disposable.create(function() { | |
var batchObservers = batch.observers, | |
i = batchObservers.indexOf(observer); | |
if (i !== -1) { | |
batchObservers.splice(i, 1); | |
} | |
if (batchObservers.length === 0) { | |
batch.dispose(); | |
} | |
}); | |
} | |
} | |
/** @inline */ | |
function finish() { | |
if (streaming === false && onNext !== undefined) { | |
onNext({ | |
paths: paths, | |
value: self.context().value | |
}); | |
} | |
if (errors.length > 0 && onError !== undefined) { | |
onError({ | |
innerErrors: errors | |
}); | |
} else if (onCompleted !== undefined) { | |
onCompleted(); | |
} | |
} | |
/** @inline */ | |
function save_error() { | |
errors[errors.length] = { | |
optimized: optimized.concat(), | |
path: original.concat(), | |
value: value | |
}; | |
} | |
/** @inline */ | |
function short_circuit() { | |
if (interrupted === true) { | |
short_circuit_int(); | |
} else { | |
short_circuit_path(); | |
} | |
} | |
/** @inline */ | |
function short_circuit_path() { | |
original.length = column + 1; | |
optimized.length = column + offset + 1; | |
} | |
/** @inline */ | |
function short_circuit_int() { | |
path = prevs[0] || path; | |
column = cols[0]; | |
last = path.length - 1; | |
original.length = column + 2; | |
original[column + 1] = null; | |
optimized.length = column + offset + 1; | |
} | |
} | |
function refreshPaths(paths, pbv, onNext, onError, onCompleted) { | |
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW, | |
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER, | |
self, streaming, connected, max, | |
batches, batch, observers, observer, | |
contexts, messages, pathSets, misses, errors, | |
cache, context, parent, value, type, size, expires, timestamp, | |
messageParent, message, messageValue, messageType, messageSize, | |
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive, | |
sizeOffset = 0, | |
bound, original, optimized, offset, | |
path, key, column, last, ref, now, | |
refs, cols, prevs, interrupts, interrupted, | |
generations, generationsLen, backRefs, pathSet, index, total, miss; | |
var timeExpireList = this.timeExpireList, | |
sizeExpireList = this.sizeExpireList, | |
timeExpireListLength = timeExpireList.length, | |
sizeExpireListLength = sizeExpireList.length; | |
self = this; | |
now = Date.now(); | |
streaming = self._streaming; | |
connected = self._connected; | |
cache = self.cache; | |
batches = self._batches; | |
max = self.maxSize; | |
misses = paths.misses || (paths.misses = []); | |
errors = paths.errors || (paths.errors = []); | |
refs = paths.refs || (paths.refs = []); | |
cols = paths.cols || (paths.cols = []); | |
prevs = paths.prevs || (paths.prevs = []); | |
interrupts = paths.interrupts || (paths.interrupts = 0); | |
interrupted = interrupts > 0; | |
observers = paths.observers || (paths.observers = []); | |
index = paths.index || (paths.index = 0); | |
total = paths.length; | |
context = init_context(paths, pbv.value || {}); | |
contexts = paths.contexts; | |
bound = refs[-1] = pbv.optimized || pbv.path; | |
pbv.path = original = []; | |
pbv.optimized = optimized = []; | |
pbv.value = undefined; | |
observers[observers.length] = observer = { | |
onNext: onNext, | |
onError: onError, | |
onCompleted: onCompleted, | |
streaming: streaming, | |
paths: 0, | |
path: bound, | |
misses: paths.concat(), | |
errors: errors | |
}; | |
getting: for (; index < total; ++index) { | |
original.length = 0; | |
path = paths[paths.index = index]; | |
last = path.length - 1; | |
column = path.index || (path.index = 0); | |
reset_refs(); | |
reset_cols(); | |
unlocking: while (column >= 0) { | |
parent = contexts[column - 1]; | |
descend(); | |
unlock(); | |
path.index = column = ascend(path, column, 0); | |
reset_refs(); | |
reset_cols(); | |
} | |
path.index = 0; | |
} | |
paths.index = 0; | |
if (connected === true) { | |
return batch_or_load_paths(); | |
} | |
finish(); | |
return Disposable.empty; | |
/** @inline */ | |
function ascend(path, column, lower) { | |
var key; | |
ascending: for (; column >= lower; --column) { | |
key = path[column]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
if (isArray(key)) { | |
if (++key.index === key.length) { | |
key = key[key.index = offset = 0]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
} else { | |
break ascending; | |
} | |
} | |
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) { | |
offset = 0; | |
key.offset = key.from; | |
continue ascending; | |
} | |
break ascending; | |
} | |
return column; | |
} | |
/** @inline */ | |
function reset_cols() { | |
var i = cols[interrupts - 1]; | |
while (i >= column) { | |
if (--interrupts >= 0) { | |
i = cols[interrupts - 1]; | |
} else { | |
break; | |
} | |
} | |
interrupted = interrupts > 0; | |
} | |
/** @inline */ | |
function reset_refs() { | |
ref = refs[column - 1]; | |
if (ref !== undefined) { | |
offset = reset_optimized_from_ref() - column; | |
} | |
} | |
/** @inline */ | |
function find_key(key) { | |
if (is_complex_key(key)) { | |
if (isArray(key)) { | |
key = find_segment_key(key); | |
if (is_complex_key(key)) { | |
key = find_range_key(key); | |
} | |
} else { | |
key = find_range_key(key); | |
} | |
} | |
return key; | |
} | |
/** @inline */ | |
function find_segment_key(key) { | |
return key[key.index || (key.index = 0)]; | |
} | |
/** @inline */ | |
function find_range_key(key) { | |
return key.offset || (key.offset = key.from || (key.from = 0)); | |
} | |
/** @inline */ | |
function is_simple_key(key) { | |
return (typeof key !== 'object' || key == null); | |
} | |
/** @inline */ | |
function is_complex_key(key) { | |
return (typeof key === 'object' && key != null); | |
} | |
/** @inline */ | |
function find_context() { | |
return parent[key]; | |
} | |
/** @inline */ | |
function find_leaf_context() { | |
return ( | |
(context = parent[key]) !== undefined && ( | |
((expires = context.$expires) === undefined && context) || | |
((expires === EXPIRES_NOW && context)) && | |
((expires === EXPIRES_NEVER && context)) && | |
((expires > now && context))) || | |
// (timeExpireList[timeExpireListLength++] = context) && | |
// (context = undefined))) || | |
(context = undefined) | |
); | |
} | |
/** @inline */ | |
function find_type() { | |
return (type = context && context.$type || undefined); | |
} | |
/** @inline */ | |
function find_value() { | |
return (value = ( | |
context !== undefined && | |
find_type() === "sentinel" | |
) ? context.value : context); | |
} | |
/** @inline */ | |
function reset_path_from_ref() { | |
if (path._context === undefined) { | |
set_back_reference(); | |
} | |
while (interrupted === true && column === last) { | |
path = prevs[--interrupts]; | |
column = cols[interrupts]; | |
interrupted = interrupts > 0; | |
offset = last - column; | |
last = path.length - 1; | |
} | |
} | |
/** @inline */ | |
function reset_optimized_from_ref() { | |
var n = optimized.length = ref.length; | |
for (var i = -1; ++i < n;) { | |
optimized[i] = ref[i]; | |
} | |
return n; | |
} | |
/** @inline */ | |
function save_optimized(optimized, column, offset, key) { | |
return (optimized[optimized.length = column + offset] = key); | |
} | |
/** @inline */ | |
function save_original(original, column, key) { | |
return (original[column] = key); | |
} | |
/** @inline */ | |
function set_back_reference() { | |
// create a back reference | |
backRefs = context.__refsLength || 0; | |
context['__ref' + backRefs] = path; | |
context.__refsLength = backRefs + 1; | |
// create a hard reference | |
path._context = context; | |
} | |
/** @inline */ | |
function stamp() { | |
context.__access_time = now; | |
context.__access_count = (context.__access_count || 0) + 1; | |
} | |
/** @inline */ | |
function build_path_set(paths, pathSet, observer) { | |
var contexts = [], | |
context, xs, | |
index = -1, | |
total = paths.length, | |
path, column, last, obs; | |
contexts[-1] = pathSet || (pathSet = { | |
__observers: [] | |
}); | |
building: while (++index < total) { | |
path = paths[index]; | |
obs = observer || path.observer; | |
last = path.length - 1; | |
column = 0; | |
unlocking: while (column >= 0) { | |
context = contexts[column - 1]; | |
(xs = context.__observers)[xs.length] = obs; | |
for (; column <= last; ++column) { | |
key = find_key(path[column]); | |
if (key != null) { | |
contexts[column] = context = context[key] || (context[key] = { | |
__observers: [] | |
}); | |
(xs = context.__observers)[xs.length] = obs; | |
} | |
} | |
obs.paths = (obs.paths || 0) + 1; | |
column = ascend(path, column, 0); | |
} | |
} | |
return pathSet; | |
} | |
/** @inline */ | |
function cleanup() { | |
if ((total = cache.$size) >= max) { | |
if (batches === undefined || batches.length === 0 || batches.every(function(batch) { | |
return batch.pendingLoad === false; | |
})) { | |
if (timeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up time expire list"); | |
self.root.timeExpireList = timeExpireList = | |
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
total = timeExpireList.total; | |
} | |
} | |
if (sizeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up size expire list"); | |
self.root.sizeExpireList = sizeExpireList = | |
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
} | |
} | |
} | |
} | |
} | |
/** @inline */ | |
function descend() { | |
descending: for (; column <= last; ++column) { | |
key = find_key(path[column]); | |
// all the columns before the last column | |
if (column < last) { | |
if (key == null) { | |
continue descending; | |
} | |
save_optimized(optimized, column, offset, key); | |
if (interrupted === false) { | |
save_original(original, column, key); | |
} | |
if ((context = find_context(parent, key)) === undefined) { | |
short_circuit(); | |
break descending; | |
} | |
value = find_value(context); | |
if (isArray(value)) { | |
do { | |
stamp(); | |
interrupt(); | |
} while (isArray(value = find_value(context))); | |
type = undefined; | |
continue descending; | |
} else if (type !== undefined) { | |
short_circuit(); | |
break descending; | |
} else if (interrupted === false) { | |
contexts[column] = context; | |
} | |
type = undefined; | |
parent = context; | |
continue descending; | |
} | |
// last column | |
if (key != null) { | |
save_optimized(optimized, column, offset, key); | |
context = find_leaf_context(parent, key); | |
} | |
value = find_value(context); | |
if (interrupted === true) { | |
if (context == null || type === "error") { | |
short_circuit_int(); | |
break descending; | |
} | |
reset_path_from_ref(); | |
contexts[column] = parent = context; | |
if (isArray(value)) { | |
stamp(); | |
interrupt(); | |
} | |
type = undefined; | |
continue descending; | |
} | |
save_original(original, column, key); | |
break descending; | |
} | |
} | |
/** @inline */ | |
function unlock() { | |
miss = save_missing(); | |
miss.observer = observer; | |
misses[misses.length] = miss; | |
if (context != null) { | |
if (type === 'error') { | |
stamp(); | |
save_error(); | |
} else { | |
stamp(); | |
if (streaming === true && value !== undefined) { | |
pbv.value = value; | |
onNext(pbv); | |
} | |
} | |
} | |
} | |
/** @inline */ | |
function init_context(paths, context) { | |
return contexts === undefined ? | |
((paths.contexts = contexts = [])[-1] = context) : | |
((contexts[-1])); | |
} | |
/** @inline */ | |
function interrupt() { | |
refs[column] = ref = value; | |
if ((context = value._context) !== undefined) { | |
offset = reset_optimized_from_ref() - column - 1; | |
contexts[column] = parent = context; | |
} else { | |
prevs[interrupts] = path; | |
cols[interrupts++] = column; | |
interrupted = true; | |
path = value; | |
last = path.length - 1; | |
offset = 0; | |
column = -1; | |
parent = cache; | |
context = value = undefined; | |
} | |
} | |
/** @inline */ | |
function save_missing() { | |
var i, j, nulls = 0, | |
n = optimized.length, | |
miss = new Array(n + last - column); | |
for (i = j = -1; ++i < n;) { | |
key = optimized[i]; | |
if (key != null) { | |
miss[++j] = key; | |
} else { | |
--nulls; | |
} | |
} | |
i = column; | |
while (++i <= last) { | |
key = path[i]; | |
if (key != null) { | |
miss[++j] = key; | |
} else { | |
--nulls; | |
} | |
} | |
miss.length += nulls; | |
return miss; | |
} | |
/** @inline */ | |
function batch_or_load_paths() { | |
var loadDisposable = Disposable.empty; | |
if (batches === undefined) { | |
pathSet = build_path_set(misses, null, observer); | |
misses = rangeCollapse(buildQueries(pathSet)); | |
loadDisposable = self.loader.get(misses).subscribe(function(pbf) { | |
pbf = Object.create(pbf); | |
var error = pbf.error, | |
serverErrors = []; | |
// TODO: retry certain errors | |
while (error !== undefined) { | |
if (error.innerErrors) { | |
serverErrors.push.apply(serverErrors, error.innerErrors); | |
} else { | |
error.$type = "error"; | |
setPath.call(self, error.path || error.pql, error, pbf.value); | |
} | |
error = serverErrors.pop(); | |
} | |
pbf.paths.errors = errors; | |
pbf.paths.pathSet = undefined; | |
pbf.paths.observers = undefined; | |
setPBFRoot.call(self, pbf, onNext, onError, onCompleted); | |
}, onError, noop); | |
return loadDisposable; | |
} else { | |
batch = batches[batches.length - 1]; | |
if (batch === undefined || batch.pendingLoad === true) { | |
batch = Disposable.create(function() { | |
var i = batches.indexOf(batch); | |
if (i !== -1) { | |
batches.splice(i, 1); | |
} | |
if (batch.batchID !== undefined) { | |
clearTimeout(batch.batchID); | |
batch.batchID = undefined; | |
} | |
if (batch.pendingLoad === true) { | |
loadDisposable.dispose(); | |
} | |
batch.pendingLoad = false; | |
}); | |
batch.batchIndex = batches.length; | |
// util.log.warn('PathEvaluator: new batch - ' + batch.batchIndex); | |
batch.batchID = setTimeout(function() { | |
var i = batches.indexOf(batch); | |
if (i !== -1) { | |
batches.splice(i, 1); | |
} | |
batch.batchID = undefined; | |
batch.pendingLoad = true; | |
batch.pathSet = build_path_set(batch.misses); | |
batch.misses = rangeCollapse(buildQueries(batch.pathSet)); | |
// util.log.warn('PathEvaluator: requesting batch ' + batch.batchIndex + ' - ' + JSON.stringify(batch.misses)); | |
loadDisposable = self.loader.get(batch.misses).subscribe(function(pbf) { | |
pbf = Object.create(pbf); | |
batch.pendingLoad = false; | |
// util.log.warn('PathEvaluator: setting batch - ' + batch.batchIndex); | |
var error = pbf.error, | |
serverErrors = []; | |
// TODO: retry certain errors | |
while (error !== undefined) { | |
if (error.innerErrors) { | |
serverErrors.push.apply(serverErrors, error.innerErrors); | |
} else { | |
error.$type = "error"; | |
setPath.call(self, error.path || error.pql, error, pbf.value); | |
} | |
error = serverErrors.pop(); | |
} | |
pbf.paths.errors = []; | |
pbf.paths.pathSet = batch.pathSet; | |
pbf.paths.observers = batch.observers.concat(); | |
setPBFRoot.call(self, pbf, noop, noop, noop); | |
}, onError, noop); | |
}, 16); | |
batch.pendingLoad = false; | |
batches.push(batch); | |
} | |
// util.log.warn('PathEvaluator: adding paths to batch - ' + batch.batchIndex); | |
var batchMisses = batch.misses || (batch.misses = []); | |
var batchObservers = batch.observers || (batch.observers = []); | |
batchMisses.push.apply(batchMisses, misses); | |
batchObservers.push(observer); | |
batch.pathSet = batch.pathSet || (batch.pathSet = { | |
__observers: [] | |
}); | |
return Disposable.create(function() { | |
var batchObservers = batch.observers, | |
i = batchObservers.indexOf(observer); | |
if (i !== -1) { | |
batchObservers.splice(i, 1); | |
} | |
if (batchObservers.length === 0) { | |
batch.dispose(); | |
} | |
}); | |
} | |
} | |
/** @inline */ | |
function finish() { | |
if (streaming === false && onNext !== undefined) { | |
onNext({ | |
paths: paths, | |
value: self.context().value | |
}); | |
} | |
if (errors.length > 0 && onError !== undefined) { | |
onError({ | |
innerErrors: errors | |
}); | |
} else if (onCompleted !== undefined) { | |
onCompleted(); | |
} | |
} | |
/** @inline */ | |
function save_error() { | |
errors[errors.length] = { | |
optimized: optimized.concat(), | |
path: original.concat(), | |
value: value | |
}; | |
} | |
/** @inline */ | |
function short_circuit() { | |
if (interrupted === true) { | |
short_circuit_int(); | |
} else { | |
short_circuit_path(); | |
} | |
} | |
/** @inline */ | |
function short_circuit_path() { | |
original.length = column + 1; | |
optimized.length = column + offset + 1; | |
} | |
/** @inline */ | |
function short_circuit_int() { | |
path = prevs[0] || path; | |
column = cols[0]; | |
last = path.length - 1; | |
original.length = column + 2; | |
original[column + 1] = null; | |
optimized.length = column + offset + 1; | |
} | |
} | |
function set() { | |
var a = args(arguments); | |
if (this._lazy) { | |
if (this._streaming) { | |
return setPathsLazily.call(this, a); | |
} | |
return setPBFLazily.call(this, a[0]); | |
} | |
var pbv = this.context(), | |
onNext = a[a.length - 3], | |
onError = a[a.length - 2], | |
onCompleted = a[a.length - 1]; | |
a = a.slice(0, -3); | |
if (this._streaming) { | |
return setPaths.call(this, a, pbv, onNext, onError, onCompleted); | |
} | |
return setPBF.call(this, a[0].paths, a[0].value, pbv, onNext, onError, onCompleted); | |
} | |
var setPBFLazily = immediateToLazy(function(pbf, pbv, n, e, c) { | |
return setPBF.call(this, pbf.paths, pbf.value, pbv, n, e, c); | |
}); | |
var setPathsLazily = immediateToLazy(setPaths); | |
function setPBFRoot(pbf, onNext, onError, onCompleted) { | |
return setPBF.call(this, pbf.paths, pbf.value, { | |
path: [], | |
value: this.cache | |
}, onNext, onError, onCompleted); | |
} | |
function setPathsRoot(paths, onNext, onError, onCompleted) { | |
return setPaths.call(this, paths, { | |
path: [], | |
value: this.cache | |
}, onNext, onError, onCompleted); | |
} | |
function setPBF(paths, messageCache, pbv, onNext, onError, onCompleted) { | |
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW, | |
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER, | |
self, streaming, connected, max, | |
batches, batch, observers, observer, | |
contexts, messages, pathSets, misses, errors, | |
cache, context, parent, value, type, size, expires, timestamp, | |
messageParent, message, messageValue, messageType, messageSize, | |
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive, | |
sizeOffset = 0, | |
bound, original, optimized, offset, | |
path, key, column, last, ref, now, | |
refs, cols, prevs, interrupts, interrupted, | |
generations, generationsLen, backRefs, pathSet, index, total, miss; | |
var timeExpireList = this.timeExpireList, | |
sizeExpireList = this.sizeExpireList, | |
timeExpireListLength = timeExpireList.length, | |
sizeExpireListLength = sizeExpireList.length; | |
self = this; | |
now = Date.now(); | |
streaming = self._streaming; | |
connected = self._connected; | |
cache = self.cache; | |
batches = self._batches; | |
max = self.maxSize; | |
misses = paths.misses || (paths.misses = []); | |
errors = paths.errors || (paths.errors = []); | |
refs = paths.refs || (paths.refs = []); | |
cols = paths.cols || (paths.cols = []); | |
prevs = paths.prevs || (paths.prevs = []); | |
interrupts = paths.interrupts || (paths.interrupts = 0); | |
interrupted = interrupts > 0; | |
observers = paths.observers || (paths.observers = []); | |
index = paths.index || (paths.index = 0); | |
total = paths.length; | |
context = init_context(paths, pbv.value || {}); | |
contexts = paths.contexts; | |
bound = refs[-1] = pbv.optimized || pbv.path; | |
pbv.path = original = []; | |
pbv.optimized = optimized = []; | |
pbv.value = undefined; | |
observers[observers.length] = observer = { | |
onNext: onNext, | |
onError: onError, | |
onCompleted: onCompleted, | |
streaming: streaming, | |
paths: 0, | |
path: bound, | |
misses: paths.concat(), | |
errors: errors | |
}; | |
generations = paths.generations || (paths.generations = []); | |
generationsLen = generations.length; | |
message = init_message(paths, paths.messages, messageCache); | |
messages = paths.messages; | |
pathSets = paths.pathSets || (paths.pathSets = []); | |
pathSets[-1] = pathSet = build_path_set(paths, paths.pathSet || { | |
__observers: [] | |
}, observer); | |
setting: for (; index < total; ++index) { | |
original.length = 0; | |
path = paths[paths.index = index]; | |
last = path.length - 1; | |
column = path.index || (path.index = 0); | |
reset_refs(); | |
reset_cols(); | |
unlocking: while (column >= 0) { | |
parent = contexts[column - 1]; | |
messageParent = messages[column - 1]; | |
pathSet = pathSets[column - 1]; | |
descend(); | |
unlock(); | |
path.index = column = ascend(path, column, 0); | |
reset_refs(); | |
reset_cols(); | |
} | |
path.index = 0; | |
} | |
paths.index = 0; | |
update_generations(); | |
finish(pathSet); | |
cleanup(); | |
return Disposable.empty; | |
/** @inline */ | |
function ascend(path, column, lower) { | |
var key; | |
ascending: for (; column >= lower; --column) { | |
key = path[column]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
if (isArray(key)) { | |
if (++key.index === key.length) { | |
key = key[key.index = offset = 0]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
} else { | |
break ascending; | |
} | |
} | |
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) { | |
offset = 0; | |
key.offset = key.from; | |
continue ascending; | |
} | |
break ascending; | |
} | |
return column; | |
} | |
/** @inline */ | |
function reset_cols() { | |
var i = cols[interrupts - 1]; | |
while (i >= column) { | |
if (--interrupts >= 0) { | |
i = cols[interrupts - 1]; | |
} else { | |
break; | |
} | |
} | |
interrupted = interrupts > 0; | |
} | |
/** @inline */ | |
function reset_refs() { | |
ref = refs[column - 1]; | |
if (ref !== undefined) { | |
offset = reset_optimized_from_ref() - column; | |
} | |
} | |
/** @inline */ | |
function find_key(key) { | |
if (is_complex_key(key)) { | |
if (isArray(key)) { | |
key = find_segment_key(key); | |
if (is_complex_key(key)) { | |
key = find_range_key(key); | |
} | |
} else { | |
key = find_range_key(key); | |
} | |
} | |
return key; | |
} | |
/** @inline */ | |
function find_segment_key(key) { | |
return key[key.index || (key.index = 0)]; | |
} | |
/** @inline */ | |
function find_range_key(key) { | |
return key.offset || (key.offset = key.from || (key.from = 0)); | |
} | |
/** @inline */ | |
function is_simple_key(key) { | |
return (typeof key !== 'object' || key == null); | |
} | |
/** @inline */ | |
function is_complex_key(key) { | |
return (typeof key === 'object' && key != null); | |
} | |
/** @inline */ | |
function find_context() { | |
return parent[key]; | |
} | |
/** @inline */ | |
function find_leaf_context() { | |
return ( | |
(context = parent[key]) !== undefined && ( | |
((expires = context.$expires) === undefined && context) || | |
((expires === EXPIRES_NOW && context)) && | |
((expires === EXPIRES_NEVER && context)) && | |
((expires > now && context))) || | |
// (timeExpireList[timeExpireListLength++] = context) && | |
// (context = undefined))) || | |
(context = undefined) | |
); | |
} | |
/** @inline */ | |
function find_type() { | |
return (type = context && context.$type || undefined); | |
} | |
/** @inline */ | |
function find_value() { | |
return (value = ( | |
context !== undefined && | |
find_type() === "sentinel" | |
) ? context.value : context); | |
} | |
/** @inline */ | |
function reset_path_from_ref() { | |
if (path._context === undefined) { | |
set_back_reference(); | |
} | |
while (interrupted === true && column === last) { | |
path = prevs[--interrupts]; | |
column = cols[interrupts]; | |
interrupted = interrupts > 0; | |
offset = last - column; | |
last = path.length - 1; | |
} | |
} | |
/** @inline */ | |
function reset_optimized_from_ref() { | |
var n = optimized.length = ref.length; | |
for (var i = -1; ++i < n;) { | |
optimized[i] = ref[i]; | |
} | |
return n; | |
} | |
/** @inline */ | |
function save_optimized(optimized, column, offset, key) { | |
return (optimized[optimized.length = column + offset] = key); | |
} | |
/** @inline */ | |
function save_original(original, column, key) { | |
return (original[column] = key); | |
} | |
/** @inline */ | |
function set_back_reference() { | |
// create a back reference | |
backRefs = context.__refsLength || 0; | |
context['__ref' + backRefs] = path; | |
context.__refsLength = backRefs + 1; | |
// create a hard reference | |
path._context = context; | |
} | |
/** @inline */ | |
function stamp() { | |
context.__access_time = now; | |
context.__access_count = (context.__access_count || 0) + 1; | |
} | |
/** @inline */ | |
function adjust_contexts() { | |
context.__generation = (context.__generation || 0) + 1; | |
do { | |
context.$size = (context.$size || 0) + sizeOffset; | |
context = context.__parent; | |
} while (context !== undefined); | |
context = parent[key]; | |
var stack = [], | |
frame, refs, ref, | |
depth = 0, | |
i, n; | |
adjusting: while (depth >= 0) { | |
if ((frame = stack[depth]) === undefined) { | |
i = -1; | |
n = context.__refsLength || 0; | |
refs = []; | |
while (++i < n) { | |
ref = context['__ref' + i]; | |
if (ref && ref.__tagged === undefined) { | |
ref.__tagged = true; | |
generations[generationsLen++] = refs[i] = ref; | |
} | |
} | |
if ((ref = context.__parent) !== undefined && ref.__tagged === undefined) { | |
ref.__tagged = true; | |
generations[generationsLen++] = refs[i] = ref; | |
} | |
frame = stack[depth] = { | |
context: context, | |
refs: refs | |
}; | |
} | |
refs = frame.refs; | |
if ((context = refs[refs.length - 1]) !== undefined) { | |
refs.length -= 1; | |
++depth; | |
continue adjusting; | |
} | |
stack[depth--] = undefined; | |
} | |
context = parent[key]; | |
sizeOffset = 0; | |
} | |
/** @inline */ | |
function update_generations() { | |
var i = generations.length, | |
ref; | |
while ((ref = generations[--i]) !== undefined) { | |
ref.__tagged = undefined; | |
ref.__generation = (ref.__generation || 0) + 1; | |
} | |
generations.length = generationsLen = 0; | |
} | |
/** @inline */ | |
function cleanup() { | |
if ((total = cache.$size) >= max) { | |
if (batches === undefined || batches.length === 0 || batches.every(function(batch) { | |
return batch.pendingLoad === false; | |
})) { | |
if (timeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up time expire list"); | |
self.root.timeExpireList = timeExpireList = | |
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
total = timeExpireList.total; | |
} | |
} | |
if (sizeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up size expire list"); | |
self.root.sizeExpireList = sizeExpireList = | |
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
} | |
} | |
} | |
} | |
} | |
/** @inline */ | |
function build_path_set(paths, pathSet, observer) { | |
var contexts = [], | |
context, xs, | |
index = -1, | |
total = paths.length, | |
path, column, last, obs; | |
contexts[-1] = pathSet || (pathSet = { | |
__observers: [] | |
}); | |
building: while (++index < total) { | |
path = paths[index]; | |
obs = observer || path.observer; | |
last = path.length - 1; | |
column = 0; | |
unlocking: while (column >= 0) { | |
context = contexts[column - 1]; | |
(xs = context.__observers)[xs.length] = obs; | |
for (; column <= last; ++column) { | |
key = find_key(path[column]); | |
if (key != null) { | |
contexts[column] = context = context[key] || (context[key] = { | |
__observers: [] | |
}); | |
(xs = context.__observers)[xs.length] = obs; | |
} | |
} | |
obs.paths = (obs.paths || 0) + 1; | |
column = ascend(path, column, 0); | |
} | |
} | |
return pathSet; | |
} | |
/** @inline */ | |
function check_observer_finished(observers, observer) { | |
var j; | |
if (--observer.paths === 0) { | |
if (observer.errors.length > 0) { | |
observer.onError({ | |
innerErrors: observer.errors | |
}); | |
} else { | |
observer.onCompleted(); | |
} | |
j = observers.indexOf(observer); | |
if (j !== -1) { | |
observers.splice(j, 1); | |
} | |
} | |
} | |
/** @inline */ | |
function descend() { | |
var i, n; | |
descending: for (; column <= last; ++column) { | |
if (interrupted === false) { | |
key = find_key(path[column]); | |
if (key != null) { | |
save_original(original, column, key); | |
pathSet = find_path_set(); | |
pathSets[column] = pathSet; | |
} else if (column < last) { | |
continue descending; | |
} else { | |
save_original(original, column, key); | |
} | |
} else { | |
key = path[column]; | |
if (key == null && column < last) { | |
continue descending; | |
} | |
} | |
if (key != null) { | |
save_optimized(optimized, column, offset, key); | |
context = column < last ? find_context() : find_leaf_context(); | |
message = find_message(); | |
if (context === undefined || message === context) { | |
size = timestamp = 0; | |
} else if (message_value_is_leaf() || (interrupted === false && column === last)) { | |
replace_context(message); | |
} | |
if (context === undefined) { | |
if (message === undefined) { | |
short_circuit(); | |
insert_missing_sentinel(); | |
break descending; | |
} else { | |
if (message == null) { | |
messageExpires = messageTimestamp = 2; | |
} else { | |
messageTimestamp = message.$timestamp; | |
messageExpires = message.$expires; | |
} | |
if (messageTimestamp < timestamp) { | |
short_circuit(); | |
value = find_value(context); | |
context = undefined; | |
break descending; | |
} else if (messageExpires === EXPIRES_NOW) { | |
short_circuit(); | |
value = find_message_value(); | |
context = undefined; | |
break descending; | |
} else if (column < last) { | |
if (message_value_is_leaf()) { | |
insert_message(); | |
} else { | |
insert_empty_branch(); | |
} | |
} else if (interrupted === true) { | |
insert_empty_branch(); | |
reset_path_from_ref(); | |
contexts[column] = parent = context; | |
messages[column] = messageParent = message; | |
type = undefined; | |
continue descending; | |
} else { | |
insert_message(); | |
break descending; | |
} | |
} | |
} else if (typeof context === 'object') { | |
link_context(); | |
} | |
} | |
if (isArray(find_value())) { | |
stamp(); | |
interrupt(); | |
messageParent = messageCache; | |
type = undefined; | |
continue descending; | |
} else if (type !== undefined) { | |
short_circuit(); | |
break descending; | |
} else if (interrupted === false) { | |
contexts[column] = context; | |
messages[column] = message; | |
} else if (column === last) { | |
if (context === undefined || type === "error") { | |
short_circuit(); | |
break descending; | |
} | |
reset_path_from_ref(); | |
contexts[column] = parent = context; | |
messages[column] = messageParent = message; | |
if (isArray(value)) { | |
stamp(); | |
interrupt(); | |
messageParent = messageCache; | |
} | |
type = undefined; | |
continue descending; | |
} | |
parent = context; | |
messageParent = message; | |
} | |
} | |
/** @inline */ | |
function find_message() { | |
return messageParent && messageParent[key]; | |
} | |
/** @inline */ | |
function find_message_value() { | |
return (messageValue = ( | |
(message !== undefined) && | |
find_message_type() === "sentinel" | |
) ? message.value : message); | |
} | |
/** @inline */ | |
function find_message_size() { | |
messageSize = 1; | |
if (message_value_has_length()) { | |
messageSize = messageValue.length; | |
} else if (message !== messageValue && typeofMessageValue === "object" && messageValue !== null) { | |
messageSize = 0; | |
} | |
if (messageType !== undefined) { | |
messageSize += sentinelSize; | |
} else if (message_value_is_primitive()) { | |
messageType = "sentinel"; | |
messageSize += sentinelSize; | |
message = { | |
"$type": messageType, | |
"value": messageValue | |
}; | |
} else if (!message_value_is_array()) { | |
messageSize = message.$size || sentinelSize; | |
} | |
type = messageType; | |
return messageSize; | |
} | |
/** @inline */ | |
function find_message_type() { | |
return (messageType = message && message.$type || undefined); | |
} | |
/** @inline */ | |
function find_path_set() { | |
return pathSet[key]; | |
} | |
/** @inline */ | |
function finish(pathSet) { | |
var x = observers.concat(), | |
i = -1, | |
n = x.length; | |
while (++i < n) { | |
if ((observer = x[i]).streaming === false) { | |
observer.onNext({ | |
paths: observer.misses, | |
value: findPath.call(self, observer.path, self.cache).value | |
}); | |
} | |
if (observer.errors.length > 0) { | |
observer.onError({ | |
innerErrors: observer.errors | |
}); | |
} else { | |
observer.onCompleted(); | |
} | |
} | |
} | |
/** @inline */ | |
function init_context(paths, context) { | |
return contexts === undefined ? | |
((paths.contexts = contexts = [])[-1] = context) : | |
((contexts[-1])); | |
} | |
/** @inline */ | |
function init_message(paths, messages, message) { | |
return messages === undefined ? | |
((paths.messages = [])[-1] = message) : | |
((messages[-1])); | |
} | |
/** @inline */ | |
function init_stamp() { | |
sizeExpireList[sizeExpireListLength++] = context; | |
expires = context.$expires; | |
if (expires !== undefined && | |
expires !== EXPIRES_NEVER && | |
expires !== EXPIRES_NOW) { | |
if (expires < 0) { | |
expires = now + (expires * -1); | |
} | |
context.$expires = expires; | |
} | |
stamp(); | |
} | |
/** @inline */ | |
function insert_missing_sentinel() { | |
messageSize = sentinelSize + 1; | |
messageValue = value = undefined; | |
messageType = type = "sentinel"; | |
message = { | |
"$type": messageType, | |
"value": messageValue | |
}; | |
sizeOffset += messageSize; | |
parent[key] = context = message; | |
link_context(); | |
adjust_contexts(); | |
} | |
/** @inline */ | |
function insert_empty_branch() { | |
parent[key] = context = { | |
"$size": 0 | |
}; | |
link_context(); | |
} | |
/** @inline */ | |
function insert_message() { | |
value = find_message_value(); | |
messageSize = find_message_size(); | |
message.$size = size; | |
sizeOffset += (messageSize - size); | |
parent[key] = context = message; | |
link_context(); | |
adjust_contexts(); | |
context.$type = type = (type || "leaf"); | |
if (context.__access_time === undefined) { | |
init_stamp(); | |
} else { | |
stamp(); | |
} | |
} | |
/** @inline */ | |
function interrupt() { | |
refs[column] = value; | |
prevs[interrupts] = path; | |
cols[interrupts++] = column; | |
interrupted = true; | |
path = value; | |
last = path.length - 1; | |
offset = 0; | |
column = -1; | |
parent = cache; | |
} | |
/** @inline */ | |
function link_context() { | |
// link the child to the parent | |
context.__parent = parent; | |
context.__key = key; | |
} | |
/** @inline */ | |
function message_value_is_leaf() { | |
return (message_value_is_primitive() || message_value_is_array()); | |
} | |
/** @inline */ | |
function message_value_has_length() { | |
return ((typeof_message_value() === 'string') || message_value_is_array()); | |
} | |
/** @inline */ | |
function message_value_is_array() { | |
return (isArray(messageValue) && (typeofMessageValue = "array")); | |
} | |
/** @inline */ | |
function message_value_is_primitive() { | |
return (messageValueIsPrimitive = (typeof_message_value() !== 'object' || messageValue === null)); | |
} | |
/** @inline */ | |
function replace_context(message) { | |
size = context.$size || 0; | |
timestamp = context.$timestamp || 0; | |
if (message != null) { | |
migrate_references(context, message); | |
} | |
if (isArray(value)) { | |
delete_hard_link(context); | |
} | |
// context.$expires = -1; | |
// timeExpireList[timeExpireListLength++] = context; | |
context = undefined; | |
} | |
/** @inline */ | |
function migrate_references(context, message) { | |
var mBackRefs = message.__refsLength || 0, | |
cBackRefs = context.__refsLength || 0, | |
refs = -1, | |
refKey, ref; | |
while (++refs < cBackRefs) { | |
refKey = "__ref" + refs; | |
ref = context[refKey]; | |
ref._context = message; | |
message["__ref" + (mBackRefs + refs)] = ref; | |
delete context[refKey]; | |
} | |
} | |
/** @inline */ | |
function delete_hard_link(reference) { | |
var destination = reference._context; | |
if (destination != null) { | |
var refIndex = (reference.__refIndex || 0) - 1, | |
refsLen = (destination.__refsLength || 0) - 1; | |
while (++refIndex <= refsLen) { | |
destination["__ref" + refIndex] = destination["__ref" + refIndex + 1]; | |
} | |
destination.__refsLength = refsLen; | |
if (refsLen < 0) { | |
delete destination.__ref0; | |
delete destination.__refsLength; | |
} | |
delete reference.__refIndex; | |
delete reference._context; | |
} | |
} | |
/** @inline */ | |
function short_circuit() { | |
if (interrupted === true) { | |
short_circuit_int(); | |
} else { | |
short_circuit_path(); | |
} | |
} | |
/** @inline */ | |
function short_circuit_path() { | |
original.length = column + 1; | |
optimized.length = column + offset + 1; | |
} | |
/** @inline */ | |
function short_circuit_int() { | |
path = prevs[0] || path; | |
column = cols[0]; | |
last = path.length - 1; | |
original.length = column + 2; | |
original[column + 1] = null; | |
optimized.length = column + offset + 1; | |
} | |
/** @inline */ | |
function typeof_message_value() { | |
return (typeofMessageValue = typeof find_message_value()); | |
} | |
/** @inline */ | |
function unlock() { | |
var i, n, x; | |
// if(context != null && column === last) { | |
// if (context.__access_time === undefined) { | |
// init_stamp(); | |
// } else { | |
// stamp(); | |
// } | |
// } | |
if (type === "error") { | |
var error = { | |
optimized: optimized.concat(), | |
path: original.concat(), | |
value: value | |
}; | |
for (i = -1, x = pathSet.__observers, n = x.length; ++i < n;) { | |
observer = x[i]; | |
if (observers.indexOf(observer) !== -1) { | |
errors = observer.errors; | |
errors[errors.length] = error; | |
if (observer.streaming === true) { | |
check_observer_finished(observers, observer); | |
} | |
} | |
} | |
} else { | |
if ((value !== undefined) || | |
(type === "sentinel" && column < last)) { // onNext undefined branch sentinels | |
pbv.value = value; | |
for (i = -1, x = pathSet.__observers, n = x.length; ++i < n;) { | |
observer = x[i]; | |
if (observers.indexOf(observer) !== -1) { | |
if (observer.streaming === true) { | |
observer.onNext(pbv); | |
check_observer_finished(observers, observer); | |
} | |
} | |
} | |
x.length = 0; | |
} | |
} | |
} | |
} | |
function setPaths(paths, pbv, onNext, onError, onCompleted) { | |
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW, | |
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER, | |
self, streaming, connected, max, | |
batches, batch, observers, observer, | |
contexts, messages, pathSets, misses, errors, | |
cache, context, parent, value, type, size, expires, timestamp, | |
messageParent, message, messageValue, messageType, messageSize, | |
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive, | |
sizeOffset = 0, | |
bound, original, optimized, offset, | |
path, key, column, last, ref, now, | |
refs, cols, prevs, interrupts, interrupted, | |
generations, generationsLen, backRefs, pathSet, index, total, miss; | |
var timeExpireList = this.timeExpireList, | |
sizeExpireList = this.sizeExpireList, | |
timeExpireListLength = timeExpireList.length, | |
sizeExpireListLength = sizeExpireList.length; | |
self = this; | |
now = Date.now(); | |
streaming = self._streaming; | |
connected = self._connected; | |
cache = self.cache; | |
batches = self._batches; | |
max = self.maxSize; | |
misses = paths.misses || (paths.misses = []); | |
errors = paths.errors || (paths.errors = []); | |
refs = paths.refs || (paths.refs = []); | |
cols = paths.cols || (paths.cols = []); | |
prevs = paths.prevs || (paths.prevs = []); | |
interrupts = paths.interrupts || (paths.interrupts = 0); | |
interrupted = interrupts > 0; | |
observers = paths.observers || (paths.observers = []); | |
index = paths.index || (paths.index = 0); | |
total = paths.length; | |
context = init_context(paths, pbv.value || {}); | |
contexts = paths.contexts; | |
bound = refs[-1] = pbv.optimized || pbv.path; | |
pbv.path = original = []; | |
pbv.optimized = optimized = []; | |
pbv.value = undefined; | |
observers[observers.length] = observer = { | |
onNext: onNext, | |
onError: onError, | |
onCompleted: onCompleted, | |
streaming: streaming, | |
paths: 0, | |
path: bound, | |
misses: paths.concat(), | |
errors: errors | |
}; | |
generations = paths.generations || (paths.generations = []); | |
generationsLen = generations.length; | |
cache = context; | |
for (; index < total; ++index) { | |
pbv = paths[paths.index = index]; | |
pbv.path.generations = generations; | |
pbv = this.insert(pbv, cache); | |
value = find_value(context = pbv.value); | |
unlock(); | |
} | |
paths.index = 0; | |
update_generations(); | |
finish(); | |
cleanup(); | |
return Disposable.empty; | |
/** @inline */ | |
function ascend(path, column, lower) { | |
var key; | |
ascending: for (; column >= lower; --column) { | |
key = path[column]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
if (isArray(key)) { | |
if (++key.index === key.length) { | |
key = key[key.index = offset = 0]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
} else { | |
break ascending; | |
} | |
} | |
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) { | |
offset = 0; | |
key.offset = key.from; | |
continue ascending; | |
} | |
break ascending; | |
} | |
return column; | |
} | |
/** @inline */ | |
function reset_cols() { | |
var i = cols[interrupts - 1]; | |
while (i >= column) { | |
if (--interrupts >= 0) { | |
i = cols[interrupts - 1]; | |
} else { | |
break; | |
} | |
} | |
interrupted = interrupts > 0; | |
} | |
/** @inline */ | |
function reset_refs() { | |
ref = refs[column - 1]; | |
if (ref !== undefined) { | |
offset = reset_optimized_from_ref() - column; | |
} | |
} | |
/** @inline */ | |
function find_key(key) { | |
if (is_complex_key(key)) { | |
if (isArray(key)) { | |
key = find_segment_key(key); | |
if (is_complex_key(key)) { | |
key = find_range_key(key); | |
} | |
} else { | |
key = find_range_key(key); | |
} | |
} | |
return key; | |
} | |
/** @inline */ | |
function find_segment_key(key) { | |
return key[key.index || (key.index = 0)]; | |
} | |
/** @inline */ | |
function find_range_key(key) { | |
return key.offset || (key.offset = key.from || (key.from = 0)); | |
} | |
/** @inline */ | |
function is_simple_key(key) { | |
return (typeof key !== 'object' || key == null); | |
} | |
/** @inline */ | |
function is_complex_key(key) { | |
return (typeof key === 'object' && key != null); | |
} | |
/** @inline */ | |
function find_context() { | |
return parent[key]; | |
} | |
/** @inline */ | |
function find_leaf_context() { | |
return ( | |
(context = parent[key]) !== undefined && ( | |
((expires = context.$expires) === undefined && context) || | |
((expires === EXPIRES_NOW && context)) && | |
((expires === EXPIRES_NEVER && context)) && | |
((expires > now && context))) || | |
// (timeExpireList[timeExpireListLength++] = context) && | |
// (context = undefined))) || | |
(context = undefined) | |
); | |
} | |
/** @inline */ | |
function find_type() { | |
return (type = context && context.$type || undefined); | |
} | |
/** @inline */ | |
function find_value() { | |
return (value = ( | |
context !== undefined && | |
find_type() === "sentinel" | |
) ? context.value : context); | |
} | |
/** @inline */ | |
function reset_path_from_ref() { | |
if (path._context === undefined) { | |
set_back_reference(); | |
} | |
while (interrupted === true && column === last) { | |
path = prevs[--interrupts]; | |
column = cols[interrupts]; | |
interrupted = interrupts > 0; | |
offset = last - column; | |
last = path.length - 1; | |
} | |
} | |
/** @inline */ | |
function reset_optimized_from_ref() { | |
var n = optimized.length = ref.length; | |
for (var i = -1; ++i < n;) { | |
optimized[i] = ref[i]; | |
} | |
return n; | |
} | |
/** @inline */ | |
function save_optimized(optimized, column, offset, key) { | |
return (optimized[optimized.length = column + offset] = key); | |
} | |
/** @inline */ | |
function save_original(original, column, key) { | |
return (original[column] = key); | |
} | |
/** @inline */ | |
function set_back_reference() { | |
// create a back reference | |
backRefs = context.__refsLength || 0; | |
context['__ref' + backRefs] = path; | |
context.__refsLength = backRefs + 1; | |
// create a hard reference | |
path._context = context; | |
} | |
/** @inline */ | |
function stamp() { | |
context.__access_time = now; | |
context.__access_count = (context.__access_count || 0) + 1; | |
} | |
/** @inline */ | |
function cleanup() { | |
if ((total = cache.$size) >= max) { | |
if (batches === undefined || batches.length === 0 || batches.every(function(batch) { | |
return batch.pendingLoad === false; | |
})) { | |
if (timeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up time expire list"); | |
self.root.timeExpireList = timeExpireList = | |
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
total = timeExpireList.total; | |
} | |
} | |
if (sizeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up size expire list"); | |
self.root.sizeExpireList = sizeExpireList = | |
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
} | |
} | |
} | |
} | |
} | |
/** @inline */ | |
function update_generations() { | |
var i = generations.length, | |
ref; | |
while ((ref = generations[--i]) !== undefined) { | |
ref.__tagged = undefined; | |
ref.__generation = (ref.__generation || 0) + 1; | |
} | |
generations.length = generationsLen = 0; | |
} | |
/** @inline */ | |
function finish() { | |
if (streaming === false && onNext !== undefined) { | |
onNext({ | |
paths: paths, | |
value: self.context().value | |
}); | |
} | |
if (errors.length > 0 && onError !== undefined) { | |
onError({ | |
innerErrors: errors | |
}); | |
} else if (onCompleted !== undefined) { | |
onCompleted(); | |
} | |
} | |
/** @inline */ | |
function init_context(paths, context) { | |
return contexts === undefined ? | |
((paths.contexts = contexts = [])[-1] = context) : | |
((contexts[-1])); | |
} | |
/** @inline */ | |
function unlock() { | |
if (type === "error") { | |
errors[errors.length] = { | |
optimized: pbv.optimized.concat(), | |
path: pbv.path.concat(), | |
value: value | |
}; | |
} else { | |
if ((streaming === true) && ( | |
(value !== undefined) || | |
(type === "sentinel" && column < last))) { // onNext undefined branch sentinels | |
pbv.value = value; | |
onNext(pbv); | |
} | |
} | |
} | |
} | |
function invalidate() { | |
var a = args(arguments); | |
if (this._lazy) { | |
return invalidateLazily.call(this, a); | |
} | |
var pbv = this.context(), | |
onNext = a[a.length - 3], | |
onError = a[a.length - 2], | |
onCompleted = a[a.length - 1]; | |
a = a.slice(0, -3); | |
return invalidatePaths.call(this, a, pbv, onNext, onError, onCompleted); | |
} | |
var invalidateLazily = immediateToLazy(invalidatePaths); | |
function invalidatePaths(paths, pbv, onNext, onError, onCompleted) { | |
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW, | |
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER, | |
self, streaming, connected, max, | |
batches, batch, observers, observer, | |
contexts, messages, pathSets, misses, errors, | |
cache, context, parent, value, type, size, expires, timestamp, | |
messageParent, message, messageValue, messageType, messageSize, | |
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive, | |
sizeOffset = 0, | |
bound, original, optimized, offset, | |
path, key, column, last, ref, now, | |
refs, cols, prevs, interrupts, interrupted, | |
generations, generationsLen, backRefs, pathSet, index, total, miss; | |
var timeExpireList = this.timeExpireList, | |
sizeExpireList = this.sizeExpireList, | |
timeExpireListLength = timeExpireList.length, | |
sizeExpireListLength = sizeExpireList.length; | |
self = this; | |
now = Date.now(); | |
streaming = self._streaming; | |
connected = self._connected; | |
cache = self.cache; | |
batches = self._batches; | |
max = self.maxSize; | |
misses = paths.misses || (paths.misses = []); | |
errors = paths.errors || (paths.errors = []); | |
refs = paths.refs || (paths.refs = []); | |
cols = paths.cols || (paths.cols = []); | |
prevs = paths.prevs || (paths.prevs = []); | |
interrupts = paths.interrupts || (paths.interrupts = 0); | |
interrupted = interrupts > 0; | |
observers = paths.observers || (paths.observers = []); | |
index = paths.index || (paths.index = 0); | |
total = paths.length; | |
context = init_context(paths, pbv.value || {}); | |
contexts = paths.contexts; | |
bound = refs[-1] = pbv.optimized || pbv.path; | |
pbv.path = original = []; | |
pbv.optimized = optimized = []; | |
pbv.value = undefined; | |
observers[observers.length] = observer = { | |
onNext: onNext, | |
onError: onError, | |
onCompleted: onCompleted, | |
streaming: streaming, | |
paths: 0, | |
path: bound, | |
misses: paths.concat(), | |
errors: errors | |
}; | |
invalidating: for (; index < total; ++index) { | |
path = paths[paths.index = index]; | |
last = path.length - 1; | |
column = path.index || (path.index = 0); | |
reset_cols(); | |
unlocking: while (column >= 0) { | |
parent = contexts[column - 1]; | |
descend(); | |
unlock(); | |
path.index = column = ascend(path, column, 0); | |
reset_cols(); | |
} | |
path.index = 0; | |
} | |
paths.index = 0; | |
cleanup(); | |
onNext(self); | |
onCompleted(); | |
return Disposable.empty; | |
/** @inline */ | |
function ascend(path, column, lower) { | |
var key; | |
ascending: for (; column >= lower; --column) { | |
key = path[column]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
if (isArray(key)) { | |
if (++key.index === key.length) { | |
key = key[key.index = offset = 0]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
} else { | |
break ascending; | |
} | |
} | |
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) { | |
offset = 0; | |
key.offset = key.from; | |
continue ascending; | |
} | |
break ascending; | |
} | |
return column; | |
} | |
/** @inline */ | |
function reset_cols() { | |
var i = cols[interrupts - 1]; | |
while (i >= column) { | |
if (--interrupts >= 0) { | |
i = cols[interrupts - 1]; | |
} else { | |
break; | |
} | |
} | |
interrupted = interrupts > 0; | |
} | |
/** @inline */ | |
function reset_refs() { | |
ref = refs[column - 1]; | |
if (ref !== undefined) { | |
offset = reset_optimized_from_ref() - column; | |
} | |
} | |
/** @inline */ | |
function find_key(key) { | |
if (is_complex_key(key)) { | |
if (isArray(key)) { | |
key = find_segment_key(key); | |
if (is_complex_key(key)) { | |
key = find_range_key(key); | |
} | |
} else { | |
key = find_range_key(key); | |
} | |
} | |
return key; | |
} | |
/** @inline */ | |
function find_segment_key(key) { | |
return key[key.index || (key.index = 0)]; | |
} | |
/** @inline */ | |
function find_range_key(key) { | |
return key.offset || (key.offset = key.from || (key.from = 0)); | |
} | |
/** @inline */ | |
function is_simple_key(key) { | |
return (typeof key !== 'object' || key == null); | |
} | |
/** @inline */ | |
function is_complex_key(key) { | |
return (typeof key === 'object' && key != null); | |
} | |
/** @inline */ | |
function find_context() { | |
return parent[key]; | |
} | |
/** @inline */ | |
function find_leaf_context() { | |
return ( | |
(context = parent[key]) !== undefined && ( | |
((expires = context.$expires) === undefined && context) || | |
((expires === EXPIRES_NOW && context)) && | |
((expires === EXPIRES_NEVER && context)) && | |
((expires > now && context))) || | |
// (timeExpireList[timeExpireListLength++] = context) && | |
// (context = undefined))) || | |
(context = undefined) | |
); | |
} | |
/** @inline */ | |
function find_type() { | |
return (type = context && context.$type || undefined); | |
} | |
/** @inline */ | |
function find_value() { | |
return (value = ( | |
context !== undefined && | |
find_type() === "sentinel" | |
) ? context.value : context); | |
} | |
/** @inline */ | |
function reset_path_from_ref() { | |
if (path._context === undefined) { | |
set_back_reference(); | |
} | |
while (interrupted === true && column === last) { | |
path = prevs[--interrupts]; | |
column = cols[interrupts]; | |
interrupted = interrupts > 0; | |
offset = last - column; | |
last = path.length - 1; | |
} | |
} | |
/** @inline */ | |
function reset_optimized_from_ref() { | |
var n = optimized.length = ref.length; | |
for (var i = -1; ++i < n;) { | |
optimized[i] = ref[i]; | |
} | |
return n; | |
} | |
/** @inline */ | |
function save_optimized(optimized, column, offset, key) { | |
return (optimized[optimized.length = column + offset] = key); | |
} | |
/** @inline */ | |
function save_original(original, column, key) { | |
return (original[column] = key); | |
} | |
/** @inline */ | |
function set_back_reference() { | |
// create a back reference | |
backRefs = context.__refsLength || 0; | |
context['__ref' + backRefs] = path; | |
context.__refsLength = backRefs + 1; | |
// create a hard reference | |
path._context = context; | |
} | |
/** @inline */ | |
function stamp() { | |
context.__access_time = now; | |
context.__access_count = (context.__access_count || 0) + 1; | |
} | |
/** @inline */ | |
function cleanup() { | |
if ((total = cache.$size) >= max) { | |
if (batches === undefined || batches.length === 0 || batches.every(function(batch) { | |
return batch.pendingLoad === false; | |
})) { | |
if (timeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up time expire list"); | |
self.root.timeExpireList = timeExpireList = | |
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
total = timeExpireList.total; | |
} | |
} | |
if (sizeExpireListLength > 0) { | |
if (total >= max) { | |
// console.log("Falkor GC: cleaning up size expire list"); | |
self.root.sizeExpireList = sizeExpireList = | |
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize); | |
} | |
} | |
} | |
} | |
} | |
/** @inline */ | |
function descend() { | |
descending: for (; column <= last; ++column) { | |
key = find_key(path[column]); | |
// all the columns before the last column | |
if (column < last) { | |
if (key == null) { | |
continue descending; | |
} | |
if ((context = find_context(parent, key)) === undefined) { | |
break descending; | |
} | |
value = find_value(context); | |
if (isArray(value)) { | |
do { | |
interrupt(); | |
} while (isArray(value = find_value(context))); | |
type = undefined; | |
continue descending; | |
} else if (type !== undefined) { | |
break descending; | |
} else if (interrupted === false) { | |
contexts[column] = context; | |
} | |
type = undefined; | |
parent = context; | |
continue descending; | |
} | |
// last column | |
if (key != null) { | |
context = find_context(parent, key); | |
} | |
value = find_value(context); | |
if (interrupted === true) { | |
if (context == null || type === "error") { | |
break descending; | |
} | |
reset_path_from_ref(); | |
contexts[column] = parent = context; | |
if (isArray(value)) { | |
interrupt(); | |
} | |
type = undefined; | |
continue descending; | |
} | |
break descending; | |
} | |
} | |
/** @inline */ | |
function init_context(paths, context) { | |
return contexts === undefined ? | |
((paths.contexts = contexts = [])[-1] = context) : | |
((contexts[-1])); | |
} | |
/** @inline */ | |
function interrupt() { | |
refs[column] = ref = value; | |
if ((context = value._context) !== undefined) { | |
contexts[column] = parent = context; | |
} else { | |
prevs[interrupts] = path; | |
cols[interrupts++] = column; | |
interrupted = true; | |
path = value; | |
last = path.length - 1; | |
column = -1; | |
parent = cache; | |
context = value = undefined; | |
} | |
} | |
/** @inline */ | |
function unlock() { | |
var x; | |
if (context !== undefined) { | |
sizeOffset = context.$size; | |
// timeExpireList[timeExpireListLength++] = context; | |
do { | |
x = context.__parent; | |
if ((context.$size -= sizeOffset) <= 0 && context !== cache) { | |
// mark the node as invalidated so the collect | |
// algorithm will give it the lowest score. | |
context.__invalidated = true; | |
if (x !== undefined) { | |
delete x[context.__key]; | |
delete context.__parent; | |
} | |
} | |
} while ((context = x) !== undefined); | |
context = parent[key]; | |
sizeOffset = 0; | |
} | |
} | |
} | |
function optimize(path, cache) { | |
var pbv = findPath.call(this, this.path.concat(path || []), cache); | |
return pbv ? pbv.optimized : path; | |
} | |
function value(path, cache) { | |
var pbv = findPath.call(this, this.path.concat(path || []), cache); | |
return pbv ? pbv.value : null; | |
} | |
function context(path, cache) { | |
return this._context ? { | |
path: this.path.concat(), | |
value: this._context | |
} : | |
findPath.call(this, this.path.concat(path), cache); | |
} | |
function findPath(the_path, from_cache) { | |
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW, | |
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER, | |
self, streaming, connected, max, | |
batches, batch, observers, observer, | |
contexts, messages, pathSets, misses, errors, | |
cache, context, parent, value, type, size, expires, timestamp, | |
messageParent, message, messageValue, messageType, messageSize, | |
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive, | |
sizeOffset = 0, | |
bound, original, optimized, offset, | |
path, key, column, last, ref, now, | |
refs, cols, prevs, interrupts, interrupted, | |
generations, generationsLen, backRefs, pathSet, index, total, miss; | |
var timeExpireList = this.timeExpireList, | |
sizeExpireList = this.sizeExpireList, | |
timeExpireListLength = timeExpireList.length, | |
sizeExpireListLength = sizeExpireList.length; | |
now = Date.now(); | |
cache = from_cache || this.cache; | |
path = the_path; | |
refs = []; | |
cols = []; | |
prevs = []; | |
interrupts = 0; | |
interrupted = false; | |
original = []; | |
optimized = []; | |
var pbv = { | |
path: original, | |
optimized: optimized | |
}; | |
last = path.length - 1; | |
column = offset = 0; | |
parent = context = value = cache; | |
descend(); | |
unlock(); | |
return pbv; | |
/** @inline */ | |
function ascend(path, column, lower) { | |
var key; | |
ascending: for (; column >= lower; --column) { | |
key = path[column]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
if (isArray(key)) { | |
if (++key.index === key.length) { | |
key = key[key.index = offset = 0]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
} else { | |
break ascending; | |
} | |
} | |
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) { | |
offset = 0; | |
key.offset = key.from; | |
continue ascending; | |
} | |
break ascending; | |
} | |
return column; | |
} | |
/** @inline */ | |
function reset_cols() { | |
var i = cols[interrupts - 1]; | |
while (i >= column) { | |
if (--interrupts >= 0) { | |
i = cols[interrupts - 1]; | |
} else { | |
break; | |
} | |
} | |
interrupted = interrupts > 0; | |
} | |
/** @inline */ | |
function reset_refs() { | |
ref = refs[column - 1]; | |
if (ref !== undefined) { | |
offset = reset_optimized_from_ref() - column; | |
} | |
} | |
/** @inline */ | |
function find_key(key) { | |
if (is_complex_key(key)) { | |
if (isArray(key)) { | |
key = find_segment_key(key); | |
if (is_complex_key(key)) { | |
key = find_range_key(key); | |
} | |
} else { | |
key = find_range_key(key); | |
} | |
} | |
return key; | |
} | |
/** @inline */ | |
function find_segment_key(key) { | |
return key[key.index || (key.index = 0)]; | |
} | |
/** @inline */ | |
function find_range_key(key) { | |
return key.offset || (key.offset = key.from || (key.from = 0)); | |
} | |
/** @inline */ | |
function is_simple_key(key) { | |
return (typeof key !== 'object' || key == null); | |
} | |
/** @inline */ | |
function is_complex_key(key) { | |
return (typeof key === 'object' && key != null); | |
} | |
/** @inline */ | |
function find_context() { | |
return parent[key]; | |
} | |
/** @inline */ | |
function find_leaf_context() { | |
return ( | |
(context = parent[key]) !== undefined && ( | |
((expires = context.$expires) === undefined && context) || | |
((expires === EXPIRES_NOW && context)) && | |
((expires === EXPIRES_NEVER && context)) && | |
((expires > now && context))) || | |
// (timeExpireList[timeExpireListLength++] = context) && | |
// (context = undefined))) || | |
(context = undefined) | |
); | |
} | |
/** @inline */ | |
function find_type() { | |
return (type = context && context.$type || undefined); | |
} | |
/** @inline */ | |
function find_value() { | |
return (value = ( | |
context !== undefined && | |
find_type() === "sentinel" | |
) ? context.value : context); | |
} | |
/** @inline */ | |
function reset_path_from_ref() { | |
if (path._context === undefined) { | |
set_back_reference(); | |
} | |
while (interrupted === true && column === last) { | |
path = prevs[--interrupts]; | |
column = cols[interrupts]; | |
interrupted = interrupts > 0; | |
offset = last - column; | |
last = path.length - 1; | |
} | |
} | |
/** @inline */ | |
function reset_optimized_from_ref() { | |
var n = optimized.length = ref.length; | |
for (var i = -1; ++i < n;) { | |
optimized[i] = ref[i]; | |
} | |
return n; | |
} | |
/** @inline */ | |
function save_optimized(optimized, column, offset, key) { | |
return (optimized[optimized.length = column + offset] = key); | |
} | |
/** @inline */ | |
function save_original(original, column, key) { | |
return (original[column] = key); | |
} | |
/** @inline */ | |
function set_back_reference() { | |
// create a back reference | |
backRefs = context.__refsLength || 0; | |
context['__ref' + backRefs] = path; | |
context.__refsLength = backRefs + 1; | |
// create a hard reference | |
path._context = context; | |
} | |
/** @inline */ | |
function stamp() { | |
context.__access_time = now; | |
context.__access_count = (context.__access_count || 0) + 1; | |
} | |
/** @inline */ | |
function descend() { | |
descending: for (; column <= last; ++column) { | |
key = find_key(path[column]); | |
// all the columns before the last column | |
if (column < last) { | |
if (key == null) { | |
continue descending; | |
} | |
save_optimized(optimized, column, offset, key); | |
if (interrupted === false) { | |
save_original(original, column, key); | |
} | |
if ((context = find_context(parent, key)) === undefined) { | |
short_circuit(); | |
break descending; | |
} | |
value = find_value(context); | |
if (isArray(value)) { | |
do { | |
stamp(); | |
interrupt(); | |
} while (isArray(value = find_value(context))); | |
type = undefined; | |
continue descending; | |
} else if (type !== undefined) { | |
short_circuit(); | |
break descending; | |
} | |
type = undefined; | |
parent = context; | |
continue descending; | |
} | |
// last column | |
if (key != null) { | |
save_optimized(optimized, column, offset, key); | |
save_original(original, column, key); | |
context = find_leaf_context(parent, key); | |
} | |
value = find_value(context); | |
if (interrupted === true) { | |
if (context == null || type === "error") { | |
short_circuit_int(); | |
break descending; | |
} | |
reset_path_from_ref(); | |
parent = context; | |
if (isArray(value)) { | |
interrupt(); | |
} | |
type = undefined; | |
continue descending; | |
} | |
break descending; | |
} | |
} | |
/** @inline */ | |
function interrupt() { | |
refs[column] = ref = value; | |
if ((context = value._context) !== undefined) { | |
offset = reset_optimized_from_ref() - column - 1; | |
parent = context; | |
} else { | |
prevs[interrupts] = path; | |
cols[interrupts++] = column; | |
interrupted = true; | |
path = value; | |
last = path.length - 1; | |
offset = 0; | |
column = -1; | |
parent = cache; | |
context = value = undefined; | |
} | |
} | |
/** @inline */ | |
function save_missing() { | |
var i, j, nulls = 0, | |
n = optimized.length, | |
miss = new Array(n + last - column); | |
for (i = j = -1; ++i < n;) { | |
key = optimized[i]; | |
if (key != null) { | |
miss[++j] = key; | |
} else { | |
--nulls; | |
} | |
} | |
i = column; | |
while (++i <= last) { | |
key = path[i]; | |
if (key != null) { | |
miss[++j] = key; | |
} else { | |
--nulls; | |
} | |
} | |
miss.length += nulls; | |
return miss; | |
} | |
/** @inline */ | |
function short_circuit() { | |
if (interrupted === true) { | |
short_circuit_int(); | |
} else { | |
optimized.length = column + offset + 1; | |
} | |
} | |
/** @inline */ | |
function short_circuit_path() { | |
original.length = column + 1; | |
optimized.length = column + offset + 1; | |
} | |
/** @inline */ | |
function short_circuit_int() { | |
path = prevs[0] || path; | |
column = cols[0]; | |
last = path.length - 1; | |
optimized.length = column + offset + 1; | |
} | |
/** @inline */ | |
function unlock() { | |
if (context == null) { | |
pbv.value = undefined; | |
pbv.optimized = save_missing(); | |
} else { | |
stamp(); | |
pbv.value = value; | |
} | |
} | |
} | |
function insert(pathOrPBV, value, cache) { | |
var path; | |
if (arguments.length === 1) { | |
value = pathOrPBV.value; | |
path = pathOrPBV.path; | |
} else if (arguments.length === 2 && pathOrPBV.path !== undefined) { | |
cache = value; | |
value = pathOrPBV.value; | |
path = pathOrPBV.path; | |
} else { | |
path = pathOrPBV; | |
} | |
var generations = path.generations || []; | |
path = this.path.concat(path); | |
path.generations = generations; | |
var pbv = setPath.call(this, path, value, cache || this.cache), | |
generationsLen = generations.length; | |
update_generations(); | |
return pbv; /** @inline */ | |
function update_generations() { | |
var i = generations.length, | |
ref; | |
while ((ref = generations[--i]) !== undefined) { | |
ref.__tagged = undefined; | |
ref.__generation = (ref.__generation || 0) + 1; | |
} | |
generations.length = generationsLen = 0; | |
} | |
} | |
function setPath(the_path, newValue, from_cache) { | |
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW, | |
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER, | |
self, streaming, connected, max, | |
batches, batch, observers, observer, | |
contexts, messages, pathSets, misses, errors, | |
cache, context, parent, value, type, size, expires, timestamp, | |
messageParent, message, messageValue, messageType, messageSize, | |
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive, | |
sizeOffset = 0, | |
bound, original, optimized, offset, | |
path, key, column, last, ref, now, | |
refs, cols, prevs, interrupts, interrupted, | |
generations, generationsLen, backRefs, pathSet, index, total, miss; | |
var timeExpireList = this.timeExpireList, | |
sizeExpireList = this.sizeExpireList, | |
timeExpireListLength = timeExpireList.length, | |
sizeExpireListLength = sizeExpireList.length; | |
cache = from_cache || this.cache; | |
path = the_path; | |
refs = []; | |
cols = []; | |
prevs = []; | |
interrupts = 0; | |
interrupted = false; | |
original = []; | |
optimized = []; | |
generations = path.generations || []; | |
generationsLen = generations.length; | |
var pbv = { | |
path: original, | |
optimized: optimized | |
}; | |
now = Date.now(); | |
parent = context = value = cache; | |
message = newValue; | |
last = path.length - 1; | |
column = offset = 0; | |
descend(); | |
unlock(); | |
pbv.value = value; | |
return pbv; | |
/** @inline */ | |
function ascend(path, column, lower) { | |
var key; | |
ascending: for (; column >= lower; --column) { | |
key = path[column]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
if (isArray(key)) { | |
if (++key.index === key.length) { | |
key = key[key.index = offset = 0]; | |
if (is_simple_key(key)) { | |
continue ascending; | |
} | |
} else { | |
break ascending; | |
} | |
} | |
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) { | |
offset = 0; | |
key.offset = key.from; | |
continue ascending; | |
} | |
break ascending; | |
} | |
return column; | |
} | |
/** @inline */ | |
function reset_cols() { | |
var i = cols[interrupts - 1]; | |
while (i >= column) { | |
if (--interrupts >= 0) { | |
i = cols[interrupts - 1]; | |
} else { | |
break; | |
} | |
} | |
interrupted = interrupts > 0; | |
} | |
/** @inline */ | |
function reset_refs() { | |
ref = refs[column - 1]; | |
if (ref !== undefined) { | |
offset = reset_optimized_from_ref() - column; | |
} | |
} | |
/** @inline */ | |
function find_key(key) { | |
if (is_complex_key(key)) { | |
if (isArray(key)) { | |
key = find_segment_key(key); | |
if (is_complex_key(key)) { | |
key = find_range_key(key); | |
} | |
} else { | |
key = find_range_key(key); | |
} | |
} | |
return key; | |
} | |
/** @inline */ | |
function find_segment_key(key) { | |
return key[key.index || (key.index = 0)]; | |
} | |
/** @inline */ | |
function find_range_key(key) { | |
return key.offset || (key.offset = key.from || (key.from = 0)); | |
} | |
/** @inline */ | |
function is_simple_key(key) { | |
return (typeof key !== 'object' || key == null); | |
} | |
/** @inline */ | |
function is_complex_key(key) { | |
return (typeof key === 'object' && key != null); | |
} | |
/** @inline */ | |
function find_context() { | |
return parent[key]; | |
} | |
/** @inline */ | |
function find_leaf_context() { | |
return ( | |
(context = parent[key]) !== undefined && ( | |
((expires = context.$expires) === undefined && context) || | |
((expires === EXPIRES_NOW && context)) && | |
((expires === EXPIRES_NEVER && context)) && | |
((expires > now && context))) || | |
// (timeExpireList[timeExpireListLength++] = context) && | |
// (context = undefined))) || | |
(context = undefined) | |
); | |
} | |
/** @inline */ | |
function find_type() { | |
return (type = context && context.$type || undefined); | |
} | |
/** @inline */ | |
function find_value() { | |
return (value = ( | |
context !== undefined && | |
find_type() === "sentinel" | |
) ? context.value : context); | |
} | |
/** @inline */ | |
function reset_path_from_ref() { | |
if (path._context === undefined) { | |
set_back_reference(); | |
} | |
while (interrupted === true && column === last) { | |
path = prevs[--interrupts]; | |
column = cols[interrupts]; | |
interrupted = interrupts > 0; | |
offset = last - column; | |
last = path.length - 1; | |
} | |
} | |
/** @inline */ | |
function reset_optimized_from_ref() { | |
var n = optimized.length = ref.length; | |
for (var i = -1; ++i < n;) { | |
optimized[i] = ref[i]; | |
} | |
return n; | |
} | |
/** @inline */ | |
function save_optimized(optimized, column, offset, key) { | |
return (optimized[optimized.length = column + offset] = key); | |
} | |
/** @inline */ | |
function save_original(original, column, key) { | |
return (original[column] = key); | |
} | |
/** @inline */ | |
function set_back_reference() { | |
// create a back reference | |
backRefs = context.__refsLength || 0; | |
context['__ref' + backRefs] = path; | |
context.__refsLength = backRefs + 1; | |
// create a hard reference | |
path._context = context; | |
} | |
/** @inline */ | |
function stamp() { | |
context.__access_time = now; | |
context.__access_count = (context.__access_count || 0) + 1; | |
} | |
/** @inline */ | |
function adjust_contexts() { | |
context.__generation = (context.__generation || 0) + 1; | |
do { | |
context.$size = (context.$size || 0) + sizeOffset; | |
context = context.__parent; | |
} while (context !== undefined); | |
context = parent[key]; | |
var stack = [], | |
frame, refs, ref, | |
depth = 0, | |
i, n; | |
adjusting: while (depth >= 0) { | |
if ((frame = stack[depth]) === undefined) { | |
i = -1; | |
n = context.__refsLength || 0; | |
refs = []; | |
while (++i < n) { | |
ref = context['__ref' + i]; | |
if (ref && ref.__tagged === undefined) { | |
ref.__tagged = true; | |
generations[generationsLen++] = refs[i] = ref; | |
} | |
} | |
if ((ref = context.__parent) !== undefined && ref.__tagged === undefined) { | |
ref.__tagged = true; | |
generations[generationsLen++] = refs[i] = ref; | |
} | |
frame = stack[depth] = { | |
context: context, | |
refs: refs | |
}; | |
} | |
refs = frame.refs; | |
if ((context = refs[refs.length - 1]) !== undefined) { | |
refs.length -= 1; | |
++depth; | |
continue adjusting; | |
} | |
stack[depth--] = undefined; | |
} | |
context = parent[key]; | |
sizeOffset = 0; | |
} | |
/** @inline */ | |
function descend() { | |
descending: for (; column <= last; ++column) { | |
key = find_key(path[column]); | |
// all the columns before the last column | |
if (column < last) { | |
if (key == null) { | |
continue descending; | |
} | |
save_optimized(optimized, column, offset, key); | |
if (interrupted === false) { | |
save_original(original, column, key); | |
} | |
if ((context = find_context(parent, key)) === undefined) { | |
insert_empty_branch(); | |
} | |
value = find_value(context); | |
if (isArray(value)) { | |
interrupt(); | |
type = undefined; | |
continue descending; | |
} else if (type !== undefined) { | |
insert_empty_branch(); | |
} | |
type = undefined; | |
parent = context; | |
continue descending; | |
} | |
// last column | |
if (key != null) { | |
save_optimized(optimized, column, offset, key); | |
context = find_leaf_context(parent, key); | |
if (interrupted === false) { | |
if (context === undefined) { | |
size = 0; | |
} else { | |
replace_context(message); | |
} | |
insert_message(); | |
if (interrupted === false && type === undefined) { | |
context.$type = type = "leaf"; | |
} | |
} | |
} | |
value = find_value(context); | |
if (interrupted === true) { | |
if (context == null || type === "error") { | |
insert_empty_branch(); | |
} | |
reset_path_from_ref(); | |
parent = context; | |
if (isArray(value)) { | |
interrupt(); | |
} | |
type = undefined; | |
continue descending; | |
} | |
save_original(original, column, key); | |
break descending; | |
} | |
} | |
/** @inline */ | |
function find_message() { | |
return messageParent && messageParent[key]; | |
} | |
/** @inline */ | |
function find_message_value() { | |
return (messageValue = ( | |
(message !== undefined) && | |
find_message_type() === "sentinel" | |
) ? message.value : message); | |
} | |
/** @inline */ | |
function find_message_type() { | |
return (messageType = message && message.$type || undefined); | |
} | |
/** @inline */ | |
function find_message_size() { | |
messageSize = 1; | |
if (message_value_has_length()) { | |
messageSize = messageValue.length; | |
} else if (message !== messageValue && typeofMessageValue === "object" && messageValue !== null) { | |
messageSize = 0; | |
} | |
if (messageType !== undefined) { | |
messageSize += sentinelSize; | |
} else if (message_value_is_primitive()) { | |
messageType = "sentinel"; | |
messageSize += sentinelSize; | |
message = { | |
"$type": messageType, | |
"value": messageValue | |
}; | |
} else if (!message_value_is_array()) { | |
messageSize = message.$size || sentinelSize; | |
} | |
type = messageType; | |
return messageSize; | |
} | |
/** @inline */ | |
function link_context() { | |
// link the child to the parent | |
context.__parent = parent; | |
context.__key = key; | |
} | |
/** @inline */ | |
function message_value_is_leaf() { | |
return (message_value_is_primitive() || message_value_is_array()); | |
} | |
/** @inline */ | |
function message_value_has_length() { | |
return ((typeof_message_value() === 'string') || message_value_is_array()); | |
} | |
/** @inline */ | |
function message_value_is_array() { | |
return (isArray(messageValue) && (typeofMessageValue = "array")); | |
} | |
/** @inline */ | |
function message_value_is_primitive() { | |
return (messageValueIsPrimitive = (typeof_message_value() !== 'object' || messageValue === null)); | |
} | |
/** @inline */ | |
function init_stamp() { | |
sizeExpireList[sizeExpireListLength++] = context; | |
expires = context.$expires; | |
if (expires !== undefined && | |
expires !== EXPIRES_NEVER && | |
expires !== EXPIRES_NOW) { | |
if (expires < 0) { | |
expires = now + (expires * -1); | |
} | |
context.$expires = expires; | |
} | |
stamp(); | |
} | |
/** @inline */ | |
function insert_empty_branch() { | |
parent[key] = context = { | |
"$size": 0 | |
}; | |
link_context(); | |
} | |
/** @inline */ | |
function insert_message() { | |
value = find_message_value(); | |
messageSize = find_message_size(); | |
message.$size = size; | |
sizeOffset += (messageSize - size); | |
parent[key] = context = message; | |
link_context(); | |
adjust_contexts(); | |
context.$type = type = (type || "leaf"); | |
if (context.__access_time === undefined) { | |
init_stamp(); | |
} else { | |
stamp(); | |
} | |
} | |
/** @inline */ | |
function interrupt() { | |
refs[column] = value; | |
prevs[interrupts] = path; | |
cols[interrupts++] = column; | |
interrupted = true; | |
path = value; | |
last = path.length - 1; | |
offset = 0; | |
column = -1; | |
parent = cache; | |
} | |
/** @inline */ | |
function replace_context(message) { | |
size = context.$size || 0; | |
timestamp = context.$timestamp || 0; | |
if (message != null) { | |
migrate_references(context, message); | |
} | |
if (isArray(value)) { | |
delete_hard_link(context); | |
} | |
// context.$expires = -1; | |
// timeExpireList[timeExpireListLength++] = context; | |
context = undefined; | |
} | |
/** @inline */ | |
function migrate_references(context, message) { | |
var mBackRefs = message.__refsLength || 0, | |
cBackRefs = context.__refsLength || 0, | |
refs = -1, | |
refKey, ref; | |
while (++refs < cBackRefs) { | |
refKey = "__ref" + refs; | |
ref = context[refKey]; | |
ref._context = message; | |
message["__ref" + (mBackRefs + refs)] = ref; | |
delete context[refKey]; | |
} | |
} | |
/** @inline */ | |
function delete_hard_link(reference) { | |
var destination = reference._context; | |
if (destination != null) { | |
var refIndex = (reference.__refIndex || 0) - 1, | |
refsLen = (destination.__refsLength || 0) - 1; | |
while (++refIndex <= refsLen) { | |
destination["__ref" + refIndex] = destination["__ref" + refIndex + 1]; | |
} | |
destination.__refsLength = refsLen; | |
if (refsLen < 0) { | |
delete destination.__ref0; | |
delete destination.__refsLength; | |
} | |
delete reference.__refIndex; | |
delete reference._context; | |
} | |
} | |
/** @inline */ | |
function typeof_message_value() { | |
return (typeofMessageValue = typeof find_message_value()); | |
} | |
/** @inline */ | |
function unlock() { | |
if (context != null) { | |
if (context.__access_time === undefined) { | |
init_stamp(); | |
} else { | |
stamp(); | |
} | |
} | |
} | |
} | |
function call() { | |
return this._lazy ? | |
callLazily.apply(this, arguments) : | |
callImmediately.apply( | |
this, | |
arguments | |
); | |
} | |
var callLazily = immediateToLazy(callImmediately); | |
function callImmediately(path, callArgs, suffixes, paths, pbv, onNext, onError, onCompleted) { | |
var a = args(arguments); | |
if (a.length === 6) { | |
onCompleted = a.pop(); | |
onError = a.pop(); | |
onNext = a.pop(); | |
pbv = a.pop(); | |
suffixes = []; | |
paths = []; | |
} else if (a.length === 7) { | |
onCompleted = a.pop(); | |
onError = a.pop(); | |
onNext = a.pop(); | |
pbv = a.pop(); | |
paths = []; | |
} | |
suffixes = suffixes || []; | |
paths = paths || []; | |
var self = this, | |
bound = pbv.optimized || pbv.path || []; | |
pbv = { | |
path: [], | |
value: this.cache | |
}; | |
var extras = paths.map(function(x) { | |
return bound.concat(x); | |
}), | |
invalidateSubscription = Disposable.empty, | |
setSubscription = Disposable.empty, | |
loadSubscription = this.loader. | |
call(bound.concat(path), callArgs, suffixes, extras). | |
subscribe(function(pbf) { | |
var invalidated = pbf.invalidated || []; | |
if (invalidated.length > 0) { | |
// remove elements at the invalidated paths | |
return (invalidateSubscription = invalidatePaths.call(self, invalidated, pbv, function(self) { | |
return (setSubscription = setCallResponse.call(self, pbf)); | |
}, onError, noop)); | |
} | |
return (setSubscription = setCallResponse.call(self, pbf)); | |
}, onError, noop); | |
return Disposable.create(function(x) { | |
loadSubscription.dispose(); | |
invalidateSubscription.dispose(); | |
setSubscription.dispose(); | |
}); | |
function setCallResponse(pbf) { | |
pbf = Object.create(pbf); | |
var error = pbf.error, | |
serverErrors = []; | |
// TODO: retry certain errors | |
while (error !== undefined) { | |
if (error.innerErrors) { | |
serverErrors.push.apply(serverErrors, error.innerErrors); | |
} else { | |
error.$type = "error"; | |
setPath.call(self, error.path || error.pql, error, pbf.value); | |
} | |
error = serverErrors.pop(); | |
} | |
pbf.paths.errors = []; | |
pbf.paths.pathSet = undefined; | |
pbf.paths.observers = undefined; | |
return setPBFRoot.call(self, pbf, onNext, onError, onCompleted); | |
} | |
} | |
function collapse(list) { | |
return rangeCollapse(buildQueries(buildTree(list))); | |
} | |
/** | |
* Collapse ranges, e.g. when there is a continuous range | |
* in an array, turn it into an object instead | |
* | |
* [1,2,3,4,5,6] => {"from":1, "to":6} | |
* | |
*/ | |
function rangeCollapse(paths) { | |
paths.forEach(function(path) { | |
path.forEach(function(elt, index) { | |
var range; | |
if (Array.isArray(elt) && elt.every(isNumber) && allUnique(elt)) { | |
elt.sort(function(a, b) { | |
return a - b; | |
}); | |
if (elt[elt.length - 1] - elt[0] === elt.length - 1) { | |
// create range | |
range = {}; | |
range.from = elt[0]; | |
range.to = elt[elt.length - 1]; | |
path[index] = range; | |
} | |
} | |
}); | |
}); | |
return paths; | |
} | |
/** | |
* Return true if argument is a number | |
*/ | |
function isNumber(val) { | |
return typeof val === "number"; | |
} | |
/** | |
* allUnique | |
* return true if every number in an array is unique | |
*/ | |
function allUnique(arr) { | |
var hash = {}, | |
index, | |
len; | |
for (index = 0, len = arr.length; index < len; index++) { | |
if (hash[arr[index]]) { | |
return false; | |
} | |
hash[arr[index]] = true; | |
} | |
return true; | |
} | |
/** | |
* Build the tree associated with | |
* all queries. Only requires | |
* traversing the list of queries | |
* once | |
*/ | |
function buildTree(list) { | |
return list.reduce(insertPath, {}); | |
} | |
/** | |
* A helper function for inserting a | |
* path into the tree. If the path | |
* has a grouping (i.e. it's already | |
* partially collapsed) it adds the | |
* elements individually to the tree | |
*/ | |
function insertPath(root, path) { | |
var children, child, i, n, j, k, | |
rest = path.slice(1); | |
if (path.length !== 0) { | |
if ((child = path[0]) == null) { | |
return root; | |
} | |
if (typeof child !== 'object') { | |
insertPath(root[child] || (root[child] = {}), rest); | |
} else if (Array.isArray(child) && (children = child)) { | |
i = -1; | |
n = children.length; | |
while (++i < n) { | |
if (typeof(child = children[i]) === 'object') { | |
j = child.from || 0; | |
k = child.to || (j + child.length); | |
while (j <= k) { | |
insertPath(root[j] || (root[j] = {}), rest); | |
++j; | |
} | |
} else { | |
insertPath(root[child] || (root[child] = {}), rest); | |
} | |
} | |
} else { | |
i = child.from || 0; | |
n = child.to || (i + child.length); | |
while (i <= n) { | |
insertPath(root[i] || (root[i] = {}), rest); | |
++i; | |
} | |
} | |
} | |
return root; | |
} | |
/** | |
* Sort a list-of-lists | |
* Used for generating a unique hash | |
* key for each subtree; used by the | |
* memoization | |
*/ | |
function sortLol(lol) { | |
return lol.reduce(function(result, curr) { | |
if (curr instanceof Array) { | |
result.push(sortLol(curr).slice(0).sort()); | |
return result; | |
} | |
return result.concat(curr); | |
}, []).slice(0).sort(); | |
} | |
/** | |
* Create a unique hash key for a set | |
* of paths | |
*/ | |
function createKey(list) { | |
return JSON.stringify(sortLol(list)); | |
} | |
/** | |
* Builds the set of collapsed | |
* queries by traversing the tree | |
* once | |
*/ | |
var charPattern = /\D/i; | |
/* jshint forin: false */ | |
function buildQueries(root) { | |
var children = Object.keys(root).filter(function(key) { | |
return key !== '__observers'; | |
}), | |
child, memo, paths, key, childIsNum, | |
list, head, tail, copy, results, | |
i = -1, | |
n = children.length, | |
j, k, x; | |
if (n === 0 || Array.isArray(root) === true) { | |
return [ | |
[] | |
]; | |
} | |
memo = {}; | |
while (++i < n) { | |
child = children[i]; | |
paths = buildQueries(root[child]); | |
key = createKey(paths); | |
childIsNum = typeof child === 'string' && !charPattern.test(child); | |
if ((list = memo[key]) && (head = list.head)) { | |
head[head.length] = childIsNum ? parseInt(child, 10) : child; | |
} else { | |
memo[key] = { | |
head: [childIsNum ? parseInt(child, 10) : child], | |
tail: paths | |
}; | |
} | |
} | |
results = []; | |
for (x in memo) { | |
head = (list = memo[x]).head; | |
tail = list.tail; | |
i = -1; | |
n = tail.length; | |
while (++i < n) { | |
list = tail[i]; | |
j = -1; | |
k = list.length; | |
if (head[0] === '') { | |
copy = []; | |
} else { | |
copy = [head.length === 1 ? head[0] : head]; | |
while (++j < k) { | |
copy[j + 1] = list[j]; | |
} | |
} | |
results[results.length] = copy; | |
} | |
} | |
return results; | |
} | |
function collect(nodes, now, max, total, T, R, S) { | |
// console.log("Falkor GC: Running GC routine on " + nodes.length + " items with " + total + " total size at " + Date.now()); | |
var to = 0; | |
nodes. | |
sort(function(a, b) { | |
return a.__invalidated === true ? | |
-1 : b.invalidated === true ? | |
1 : a.__access_time - b.__access_time; | |
}). | |
every(function(x, i) { | |
var offset = x.$size, | |
backRefs, ref, y; | |
total -= offset; | |
to = i; | |
x.__invalidated = true; | |
do { | |
y = x.__parent; | |
if (x.__invalidated === true) { | |
// Remove x from the falkor cache. | |
if (y !== undefined) { | |
// console.log("Falkor GC: Removing " + stringify(x)); | |
delete y[x.__key]; | |
delete x.__parent; | |
} | |
// Remove all back references. | |
backRefs = (x.__refsLength || 0); | |
while (--backRefs >= 0) { | |
if ((ref = x['__ref' + backRefs]) !== undefined) { | |
delete ref._context; | |
delete x['__ref' + backRefs]; | |
} | |
} | |
delete x.__refsLength; | |
} | |
x.$size = (x.$size - offset); | |
} while ((x = y) !== undefined); | |
return total > max; | |
}); | |
// console.log("Falkor GC: removed " + to + " elements."); | |
// console.log("Falkor GC: new size is " + total + "."); | |
return nodes.slice(to); | |
// return nodes; | |
// console.log("Falkor GC: Running GC routine on " + nodes.length + " items with " + total + " total size."); | |
/* | |
var from = 0, to = nodes.length - 1, k = to >>> 1, | |
x, y, r, w, m, mid, | |
scores = [], score, offset, backRefs; | |
// if from == to we reached the kth element | |
while(from < to) { | |
r = from; | |
w = to; | |
// choose an arbitrary pivot. | |
// an unsigned bitshift divides by 2 and discards the remainder. | |
m = (r + w) >>> 1; | |
// compute a score for the pivot | |
mid = scores[m] || (scores[m] = getScore(nodes[m])); | |
// stop if the reader and writer meet | |
while (r < w) { | |
// compute a score for the node we're comparing against | |
score = scores[r] || (scores[r] = getScore(nodes[r])); | |
if (score >= mid) { | |
x = nodes[r]; | |
// put the large values at the end | |
scores[r] = scores[w]; | |
scores[w] = score; | |
nodes[r] = nodes[w]; | |
nodes[w] = x; | |
--w; | |
} else { | |
// the value is smaller than the pivot, skip | |
++r; | |
} | |
} | |
// compute a score for the evaluated reader | |
score = scores[r] || (scores[r] = getScore(nodes[r])); | |
// if we stepped up (++r) we need to step one down | |
if (score > mid) { | |
--r; | |
} | |
// the r pointer is on the end of the first k elements | |
if (k <= r) { | |
to = r; | |
} else { | |
from = r + 1; | |
} | |
} | |
from = -1; | |
to = nodes.length; | |
// remove elements until we've hit our target | |
// cache size, or there are no more elements | |
// to remove. | |
while(total > max && ++from < to) { | |
total -= (offset = (x = nodes[from]).$size); | |
x.__invalidated = true; | |
do { | |
y = x.__parent; | |
x.$size = (x.$size - offset); | |
if (x.__invalidated === true) { | |
// Remove x from the falkor cache. | |
if(y !== undefined) { | |
// console.log("Falkor GC: Removing " + stringify(x) + " at " + x.__access_time); | |
delete y[x.__key]; | |
delete x.__parent; | |
} | |
// Remove all back references. | |
backRefs = (x.__refsLength || 0); | |
while (--backRefs >= 0) { | |
delete x['__ref' + backRefs]._context; | |
delete x['__ref' + backRefs]; | |
} | |
delete x.__refsLength; | |
} | |
} while ((x = y) !== undefined); | |
} | |
// console.log("Falkor GC: removed " + from + " elements."); | |
// console.log("Falkor GC: new size is " + total + "."); | |
nodes = nodes.slice(from); | |
nodes.total = total; | |
return nodes; | |
*/ | |
/** @inline */ | |
/* | |
function getScore(x) { | |
return (x.__invalidated === true || x.$expires <= now) ? | |
MIN_SAFE_INTEGER : | |
-Math.floor(Math.sqrt( | |
Math.pow(T * (now - x.__access_time), 2) + | |
Math.pow(Math.pow(R * x.__access_count, 3) + Math.pow(S * x.$size, 3), 2) | |
)); | |
} | |
*/ | |
} | |
module.exports = PathEvaluator; | |
},{"../src/rx.ultralite":2}],2:[function(_dereq_,module,exports){ | |
(function (global){ | |
/** | |
Rx Ultralite! | |
Rx on the Roku Tyler throws this (possibly related to browserify-ing Rx): | |
Error: 'TypeError: 'undefined' is not a function (evaluating 'root.document.createElement('script')')' | |
*/ | |
var Rx; | |
if (typeof window !== "undefined" && typeof window["Rx"] !== "undefined") { | |
// Browser environment | |
Rx = window["Rx"]; | |
} else if(typeof global !== "undefined" && typeof global["Rx"] !== "undefined") { | |
// Node.js environment | |
Rx = global["Rx"]; | |
} else { | |
if(typeof global !== "undefined" && typeof global.require === "function") { | |
try { | |
// Node.js environment with rx module | |
Rx = global["require"]("rx"); | |
} catch(e) { | |
Rx = undefined; | |
} | |
} | |
} | |
if(Rx === undefined) { | |
Rx = { | |
I: function() { return arguments[0]; }, | |
Disposable: (function() { | |
function Disposable(a) { | |
this.action = a; | |
} | |
Disposable.create = function(a) { | |
return new Disposable(a); | |
} | |
Disposable.empty = new Disposable(function(){}); | |
Disposable.prototype.dispose = function() { | |
if(typeof this.action === 'function') { | |
this.action(); | |
} | |
} | |
return Disposable; | |
})(), | |
Observable: (function() { | |
function Observable(s) { | |
this.s = s; | |
} | |
Observable.create = Observable.createWithDisposable = function(s) { | |
return new Observable(s); | |
} | |
Observable.fastCreateWithDisposable = Observable.create; | |
Observable.fastReturnValue = function(value) { | |
return Observable.create(function(observer) { | |
observer.onNext(value); | |
observer.onCompleted(); | |
}); | |
} | |
Observable.prototype.subscribe = function(n, e, c) { | |
return this.s( | |
(n != null && typeof n === 'object') ? | |
n : | |
Rx.Observer.create(n, e, c) | |
); | |
} | |
Observable.prototype.catchException = function(next) { | |
var self = this; | |
return Observable.create(function(o) { | |
return self.subscribe( | |
function(x) { o.onNext(x); }, | |
function(e) { | |
return ( | |
(typeof next === 'function') ? | |
next(e) : next | |
).subscribe(o); | |
}, | |
function() { o.onCompleted(); }); | |
}); | |
} | |
return Observable; | |
})(), | |
Observer: (function() { | |
function Observer(n, e, c) { | |
this.onNext = n || Rx.I; | |
this.onError = e || Rx.I; | |
this.onCompleted = c || Rx.I; | |
} | |
Observer.create = function(n, e, c) { | |
return new Observer(n, e, c); | |
} | |
return Observer; | |
})(), | |
Subject: (function(){ | |
function Subject() { | |
this.observers = []; | |
} | |
Subject.prototype.subscribe = function(subscriber) { | |
var a = this.observers, | |
n = a.length; | |
a[n] = subscriber; | |
return { | |
dispose: function() { | |
a.splice(n, 1); | |
} | |
} | |
}; | |
Subject.prototype.onNext = function(x) { | |
var listeners = this.observers.concat(), | |
i = -1, n = listeners.length; | |
while(++i < n) { | |
listeners[i].onNext(x); | |
} | |
}; | |
Subject.prototype.onError = function(e) { | |
var listeners = this.observers.concat(), | |
i = -1, n = listeners.length; | |
this.observers.length = 0; | |
while(++i < n) { | |
listeners[i].onError(e); | |
} | |
}; | |
Subject.prototype.onCompleted = function() { | |
var listeners = this.observers.concat(), | |
i = -1, n = listeners.length; | |
this.observers.length = 0; | |
while(++i < n) { | |
listeners[i].onCompleted(); | |
} | |
}; | |
})() | |
}; | |
} | |
module.exports = Rx; | |
}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
},{}]},{},[1]) | |
(1) | |
}); | |
alert(falkor.PathEvaluator); | |
var pathEvaluator = new falkor.PathEvaluator(); | |
alert(); | |
pathEvaluator.deserialize({ | |
videos: { | |
"123": { | |
name: "Die Hard" | |
} | |
} | |
}); | |
var result = pathEvaluator.get(["videos",123,"name"]); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type==="error"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}else{throw TypeError('Uncaught, unspecified "error" event.')}return false}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:len=arguments.length;args=new Array(len-1);for(i=1;i<len;i++)args[i-1]=arguments[i];handler.apply(this,args)}}else if(isObject(handler)){len=arguments.length;args=new Array(len-1);for(i=1;i<len;i++)args[i-1]=arguments[i];listeners=handler.slice();len=listeners.length;for(i=0;i<len;i++)listeners[i].apply(this,args)}return true};EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events)this._events={};if(this._events.newListener)this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener);if(!this._events[type])this._events[type]=listener;else if(isObject(this._events[type]))this._events[type].push(listener);else this._events[type]=[this._events[type],listener];if(isObject(this._events[type])&&!this._events[type].warned){var m;if(!isUndefined(this._maxListeners)){m=this._maxListeners}else{m=EventEmitter.defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);console.trace()}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-->0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else{while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.listenerCount=function(emitter,type){var ret;if(!emitter._events||!emitter._events[type])ret=0;else if(isFunction(emitter._events[type]))ret=1;else ret=emitter._events[type].length;return ret};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],2:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.once=noop;process.off=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],3:[function(require,module,exports){(function(process,global){(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};var sequenceContainsNoElements="Sequence contains no elements.";var argumentOutOfRange="Argument out of range";var objectDisposed="Object has been disposed";function checkDisposed(){if(this.isDisposed){throw new Error(objectDisposed)}}var $iterator$=typeof Symbol==="function"&&Symbol.iterator||"_es6shim_iterator_";if(root.Set&&typeof(new root.Set)["@@iterator"]==="function"){$iterator$="@@iterator"}var doneEnumerator={done:true,value:undefined};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,suportNodeClass,errorProto=Error.prototype,objectProto=Object.prototype,propertyIsEnumerable=objectProto.propertyIsEnumerable;try{suportNodeClass=!(toString.call(document)==objectClass&&!({toString:0}+""))}catch(e){suportNodeClass=true}var shadowedProps=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"];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);function isObject(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=shadowedProps.length;if(object===(ctor&&ctor.prototype)){var className=object===stringProto?stringClass:object===errorProto?errorClass:toString.call(object),nonEnum=nonEnumProps[className]}while(++index<length){key=shadowedProps[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"}function isArguments(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}}function isFunction(value){return typeof value=="function"||false}if(isFunction(/x/)){isFunction=function(value){return typeof value=="function"&&toString.call(value)==funcClass}}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;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 slice=Array.prototype.slice;function argsOrArray(args,idx){return args.length===1&&Array.isArray(args[idx])?args[idx]:slice.call(args)}var hasProp={}.hasOwnProperty;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){var sources=slice.call(arguments,1);for(var i=0,len=sources.length;i<len;i++){var source=sources[i];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 IndexedItem=function(id,value){this.id=id;this.value=value};IndexedItem.prototype.compareTo=function(other){var c=this.value.compareTo(other.value);if(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){if(index===undefined){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];delete this.items[this.length];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(){this.disposables=argsOrArray(arguments,0);this.isDisposed=false;this.length=this.disposables.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 currentDisposables=this.disposables.slice(0);this.disposables=[];this.length=0;for(var i=0,len=currentDisposables.length;i<len;i++){currentDisposables[i].dispose()}}};CompositeDisposablePrototype.clear=function(){var currentDisposables=this.disposables.slice(0);this.disposables=[];this.length=0;for(var i=0,len=currentDisposables.length;i<len;i++){currentDisposables[i].dispose()}};CompositeDisposablePrototype.contains=function(item){return this.disposables.indexOf(item)!==-1};CompositeDisposablePrototype.toArray=function(){return this.disposables.slice(0)};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 BooleanDisposable=function(){function BooleanDisposable(isSingle){this.isSingle=isSingle;this.isDisposed=false;this.current=null}var booleanDisposablePrototype=BooleanDisposable.prototype;booleanDisposablePrototype.getDisposable=function(){return this.current};booleanDisposablePrototype.setDisposable=function(value){if(this.current&&this.isSingle){throw new Error("Disposable has already been assigned")}var shouldDispose=this.isDisposed,old;if(!shouldDispose){old=this.current;this.current=value}if(old){old.dispose()}if(shouldDispose&&value){value.dispose()}};booleanDisposablePrototype.dispose=function(){var old;if(!this.isDisposed){this.isDisposed=true;old=this.current;this.current=null}if(old){old.dispose()}};return BooleanDisposable}();var SingleAssignmentDisposable=Rx.SingleAssignmentDisposable=function(super_){inherits(SingleAssignmentDisposable,super_);function SingleAssignmentDisposable(){super_.call(this,true)}return SingleAssignmentDisposable}(BooleanDisposable);var SerialDisposable=Rx.SerialDisposable=function(super_){inherits(SerialDisposable,super_);function SerialDisposable(){super_.call(this,false)}return SerialDisposable}(BooleanDisposable);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){if(!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){if(!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}ScheduledDisposable.prototype.dispose=function(){var parent=this;this.scheduler.schedule(function(){if(!parent.isDisposed){parent.isDisposed=true;parent.disposable.dispose()}})};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 invokeRecImmediate(scheduler,pair){var state=pair.first,action=pair.second,group=new CompositeDisposable,recursiveAction=function(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.first,action=pair.second,group=new CompositeDisposable,recursiveAction=function(state1){action(state1,function(state2,dueTime1){var isAdded=false,isDone=false,d=scheduler[method].call(scheduler,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 invokeAction(scheduler,action){action();return disposableEmpty}var schedulerProto=Scheduler.prototype;schedulerProto.catchException=schedulerProto["catch"]=function(handler){return new CatchScheduler(this,handler)};schedulerProto.schedulePeriodic=function(period,action){return this.schedulePeriodicWithState(null,period,function(){action()})};schedulerProto.schedulePeriodicWithState=function(state,period,action){var s=state,id=setInterval(function(){s=action(s)},period);return disposableCreate(function(){clearInterval(id)})};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)};schedulerProto.scheduleRecursive=function(action){return this.scheduleRecursiveWithState(action,function(_action,self){_action(function(){self(_action)})})};schedulerProto.scheduleRecursiveWithState=function(state,action){return this.scheduleWithState({first:state,second:action},function(s,p){return invokeRecImmediate(s,p)})};schedulerProto.scheduleRecursiveWithRelative=function(dueTime,action){return this.scheduleRecursiveWithRelativeAndState(action,dueTime,function(_action,self){_action(function(dt){self(_action,dt)})})};schedulerProto.scheduleRecursiveWithRelativeAndState=function(state,dueTime,action){return this._scheduleRelative({first:state,second:action},dueTime,function(s,p){return invokeRecDate(s,p,"scheduleWithRelativeAndState")})};schedulerProto.scheduleRecursiveWithAbsolute=function(dueTime,action){return this.scheduleRecursiveWithAbsoluteAndState(action,dueTime,function(_action,self){_action(function(dt){self(_action,dt)})})};schedulerProto.scheduleRecursiveWithAbsoluteAndState=function(state,dueTime,action){return this._scheduleAbsolute({first:state,second:action},dueTime,function(s,p){return invokeRecDate(s,p,"scheduleWithAbsoluteAndState")})};Scheduler.now=defaultNow;Scheduler.normalize=function(timeSpan){if(timeSpan<0){timeSpan=0}return timeSpan};return Scheduler}();var normalizeTime=Scheduler.normalize;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)}function scheduleRelative(state,dueTime,action){var dt=normalizeTime(dt);while(dt-this.now()>0){}return action(this,state)}function scheduleAbsolute(state,dueTime,action){return this.scheduleWithRelativeAndState(state,dueTime-this.now(),action)}return new Scheduler(defaultNow,scheduleNow,scheduleRelative,scheduleAbsolute)}();var currentThreadScheduler=Scheduler.currentThread=function(){var queue;function runTrampoline(q){var item;while(q.length>0){item=q.dequeue();if(!item.isCancelled()){while(item.dueTime-Scheduler.now()>0){}if(!item.isCancelled()){item.invoke()}}}}function scheduleNow(state,action){return this.scheduleWithRelativeAndState(state,0,action)}function scheduleRelative(state,dueTime,action){var dt=this.now()+Scheduler.normalize(dueTime),si=new ScheduledItem(this,state,action,dt);if(!queue){queue=new PriorityQueue(4);queue.enqueue(si);try{runTrampoline(queue)}catch(e){throw e}finally{queue=null}}else{queue.enqueue(si)}return si.disposable}function scheduleAbsolute(state,dueTime,action){return this.scheduleWithRelativeAndState(state,dueTime-this.now(),action)}var currentScheduler=new Scheduler(defaultNow,scheduleNow,scheduleRelative,scheduleAbsolute);currentScheduler.scheduleRequired=function(){return!queue};currentScheduler.ensureTrampoline=function(action){if(!queue){this.schedule(action)}else{action()}};return currentScheduler}();var scheduleMethod,clearMethod=noop;(function(){var reNative=RegExp("^"+String(toString).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$");var setImmediate=typeof(setImmediate=freeGlobal&&moduleExports&&freeGlobal.setImmediate)=="function"&&!reNative.test(setImmediate)&&setImmediate,clearImmediate=typeof(clearImmediate=freeGlobal&&moduleExports&&freeGlobal.clearImmediate)=="function"&&!reNative.test(clearImmediate)&&clearImmediate;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(typeof process!=="undefined"&&{}.toString.call(process)==="[object process]"){scheduleMethod=process.nextTick}else if(typeof setImmediate==="function"){scheduleMethod=setImmediate;clearMethod=clearImmediate}else if(postMessageSupported()){var MSG_PREFIX="ms.rx.schedule"+Math.random(),tasks={},taskId=0;function onGlobalPostMessage(event){if(typeof event.data==="string"&&event.data.substring(0,MSG_PREFIX.length)===MSG_PREFIX){var handleId=event.data.substring(MSG_PREFIX.length),action=tasks[handleId];action();delete tasks[handleId]}}if(root.addEventListener){root.addEventListener("message",onGlobalPostMessage,false)}else{root.attachEvent("onmessage",onGlobalPostMessage,false)}scheduleMethod=function(action){var currentId=taskId++;tasks[currentId]=action;root.postMessage(MSG_PREFIX+currentId,"*")}}else if(!!root.MessageChannel){var channel=new root.MessageChannel,channelTasks={},channelTaskId=0;channel.port1.onmessage=function(event){var id=event.data,action=channelTasks[id];action();delete channelTasks[id]};scheduleMethod=function(action){var id=channelTaskId++;channelTasks[id]=action;channel.port2.postMessage(id)}}else if("document"in root&&"onreadystatechange"in root.document.createElement("script")){scheduleMethod=function(action){var scriptElement=root.document.createElement("script");scriptElement.onreadystatechange=function(){action();scriptElement.onreadystatechange=null;scriptElement.parentNode.removeChild(scriptElement);scriptElement=null};root.document.documentElement.appendChild(scriptElement)}}else{scheduleMethod=function(action){return setTimeout(action,0)};clearMethod=clearTimeout}})();var timeoutScheduler=Scheduler.timeout=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=setTimeout(function(){if(!disposable.isDisposed){disposable.setDisposable(action(scheduler,state))}},dt);return new CompositeDisposable(disposable,disposableCreate(function(){clearTimeout(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 localNow(){return this._scheduler.now()}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,localNow,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,hasValue){this.hasValue=hasValue==null?false:hasValue;this.kind=kind}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 notification=this; | |
isScheduler(scheduler)||(scheduler=immediateScheduler);return new AnonymousObservable(function(observer){return scheduler.schedule(function(){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){var notification=new Notification("N",true);notification.value=value;notification._accept=_accept;notification._acceptObservable=_acceptObservable;notification.toString=toString;return notification}}();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(exception){var notification=new Notification("E");notification.exception=exception;notification._accept=_accept;notification._acceptObservable=_acceptObservable;notification.toString=toString;return notification}}();var notificationCreateOnCompleted=Notification.createOnCompleted=function(){function _accept(onNext,onError,onCompleted){return onCompleted()}function _acceptObservable(observer){return observer.onCompleted()}function toString(){return"OnCompleted()"}return function(){var notification=new Notification("C");notification._accept=_accept;notification._acceptObservable=_acceptObservable;notification.toString=toString;return notification}}();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(observer){var e;try{e=sources[$iterator$]()}catch(err){observer.onError();return}var isDisposed,subscription=new SerialDisposable;var cancelable=immediateScheduler.scheduleRecursive(function(self){var currentItem;if(isDisposed){return}try{currentItem=e.next()}catch(ex){observer.onError(ex);return}if(currentItem.done){observer.onCompleted();return}var currentValue=currentItem.value;isPromise(currentValue)&&(currentValue=observableFromPromise(currentValue));var d=new SingleAssignmentDisposable;subscription.setDisposable(d);d.setDisposable(currentValue.subscribe(observer.onNext.bind(observer),observer.onError.bind(observer),function(){self()}))});return new CompositeDisposable(subscription,cancelable,disposableCreate(function(){isDisposed=true}))})};Enumerable.prototype.catchException=function(){var sources=this;return new AnonymousObservable(function(observer){var e;try{e=sources[$iterator$]()}catch(err){observer.onError();return}var isDisposed,lastException,subscription=new SerialDisposable;var cancelable=immediateScheduler.scheduleRecursive(function(self){if(isDisposed){return}var currentItem;try{currentItem=e.next()}catch(ex){observer.onError(ex);return}if(currentItem.done){if(lastException){observer.onError(lastException)}else{observer.onCompleted()}return}var currentValue=currentItem.value;isPromise(currentValue)&&(currentValue=observableFromPromise(currentValue));var d=new SingleAssignmentDisposable;subscription.setDisposable(d);d.setDisposable(currentValue.subscribe(observer.onNext.bind(observer),function(exn){lastException=exn;self()},observer.onCompleted.bind(observer)))});return new CompositeDisposable(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 enumerableFor=Enumerable.forEach=function(source,selector,thisArg){selector||(selector=identity);return new Enumerable(function(){var index=-1;return new Enumerator(function(){return++index<source.length?{done:false,value:selector.call(thisArg,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){return new AnonymousObserver(function(x){return handler(notificationCreateOnNext(x))},function(exception){return handler(notificationCreateOnError(exception))},function(){return handler(notificationCreateOnCompleted())})};Observer.notifyOn=function(scheduler){return new ObserveOnObserver(scheduler,this)};var AbstractObserver=Rx.internals.AbstractObserver=function(_super){inherits(AbstractObserver,_super);function AbstractObserver(){this.isStopped=false;_super.call(this)}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(exception){this._onError(exception)};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();try{this._observer.onNext(value)}catch(e){throw e}finally{this._state=0}};CheckedObserverPrototype.onError=function(err){this.checkAccess();try{this._observer.onError(err)}catch(e){throw e}finally{this._state=2}};CheckedObserverPrototype.onCompleted=function(){this.checkAccess();try{this._observer.onCompleted()}catch(e){throw e}finally{this._state=2}};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(exception){var self=this;this.queue.push(function(){self.observer.onError(exception)})};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(){_super.apply(this,arguments)}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()};return ObserveOnObserver}(ScheduledObserver);var observableProto;var Observable=Rx.Observable=function(){function Observable(subscribe){this._subscribe=subscribe}observableProto=Observable.prototype;observableProto.subscribe=observableProto.forEach=function(observerOrOnNext,onError,onCompleted){var subscriber=typeof observerOrOnNext==="object"?observerOrOnNext:observerCreate(observerOrOnNext,onError,onCompleted);return this._subscribe(subscriber)};return Observable}();observableProto.observeOn=function(scheduler){var source=this;return new AnonymousObservable(function(observer){return source.subscribe(new ObserveOnObserver(scheduler,observer))})};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})};var observableFromPromise=Observable.fromPromise=function(promise){return new AnonymousObservable(function(observer){promise.then(function(value){observer.onNext(value);observer.onCompleted()},function(reason){observer.onError(reason)});return function(){if(promise&&promise.abort){promise.abort()}}})};observableProto.toPromise=function(promiseCtor){promiseCtor||(promiseCtor=Rx.config.Promise);if(!promiseCtor){throw new Error("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},function(err){reject(err)},function(){if(hasValue){resolve(value)}})})};observableProto.toArray=function(){var self=this;return new AnonymousObservable(function(observer){var arr=[];return self.subscribe(arr.push.bind(arr),observer.onError.bind(observer),function(){observer.onNext(arr);observer.onCompleted()})})};Observable.create=Observable.createWithDisposable=function(subscribe){return new AnonymousObservable(subscribe)};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.schedule(function(){observer.onCompleted()})})};var maxSafeInteger=Math.pow(2,53)-1;function numberIsFinite(value){return typeof value==="number"&&root.isFinite(value)}function isNan(n){return n!==n}function isIterable(o){return o[$iterator$]!==undefined}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}function isCallable(f){return Object.prototype.toString.call(f)==="[object Function]"&&typeof f==="function"}Observable.from=function(iterable,mapFn,thisArg,scheduler){if(iterable==null){throw new Error("iterable cannot be null.")}if(mapFn&&!isCallable(mapFn)){throw new Error("mapFn when provided must be a function")}isScheduler(scheduler)||(scheduler=currentThreadScheduler);return new AnonymousObservable(function(observer){var list=Object(iterable),objIsIterable=isIterable(list),len=objIsIterable?0:toLength(list),it=objIsIterable?list[$iterator$]():null,i=0;return scheduler.scheduleRecursive(function(self){if(i<len||objIsIterable){var result;if(objIsIterable){var next=it.next();if(next.done){observer.onCompleted();return}result=next.value}else{result=list[i]}if(mapFn&&isCallable(mapFn)){try{result=thisArg?mapFn.call(thisArg,result,i):mapFn(result,i)}catch(e){observer.onError(e);return}}observer.onNext(result);i++;self()}else{observer.onCompleted()}})})};var observableFromArray=Observable.fromArray=function(array,scheduler){isScheduler(scheduler)||(scheduler=currentThreadScheduler);return new AnonymousObservable(function(observer){var count=0,len=array.length;return scheduler.scheduleRecursive(function(self){if(count<len){observer.onNext(array[count++]);self()}else{observer.onCompleted()}})})};Observable.generate=function(initialState,condition,iterate,resultSelector,scheduler){isScheduler(scheduler)||(scheduler=currentThreadScheduler);return new AnonymousObservable(function(observer){var first=true,state=initialState;return scheduler.scheduleRecursive(function(self){var hasResult,result;try{if(first){first=false}else{state=iterate(state)}hasResult=condition(state);if(hasResult){result=resultSelector(state)}}catch(exception){observer.onError(exception);return}if(hasResult){observer.onNext(result);self()}else{observer.onCompleted()}})})};Observable.of=function(){var len=arguments.length,args=new Array(len);for(var i=0;i<len;i++){args[i]=arguments[i]}return observableFromArray(args)};var observableOf=Observable.ofWithScheduler=function(scheduler){var len=arguments.length-1,args=new Array(len);for(var i=0;i<len;i++){args[i]=arguments[i+1]}return observableFromArray(args,scheduler)};var observableNever=Observable.never=function(){return new AnonymousObservable(function(){return disposableEmpty})};Observable.range=function(start,count,scheduler){isScheduler(scheduler)||(scheduler=currentThreadScheduler);return new AnonymousObservable(function(observer){return scheduler.scheduleRecursiveWithState(0,function(i,self){if(i<count){observer.onNext(start+i);self(i+1)}else{observer.onCompleted()}})})};Observable.repeat=function(value,repeatCount,scheduler){isScheduler(scheduler)||(scheduler=currentThreadScheduler);return observableReturn(value,scheduler).repeat(repeatCount==null?-1:repeatCount)};var observableReturn=Observable["return"]=Observable.returnValue=Observable.just=function(value,scheduler){isScheduler(scheduler)||(scheduler=immediateScheduler);return new AnonymousObservable(function(observer){return scheduler.schedule(function(){observer.onNext(value);observer.onCompleted()})})};var observableThrow=Observable["throw"]=Observable.throwException=function(exception,scheduler){isScheduler(scheduler)||(scheduler=immediateScheduler);return new AnonymousObservable(function(observer){return scheduler.schedule(function(){observer.onError(exception)})})};Observable.using=function(resourceFactory,observableFactory){return new AnonymousObservable(function(observer){var disposable=disposableEmpty,resource,source;try{resource=resourceFactory();if(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=argsOrArray(arguments,0);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(observer){var d1=new SingleAssignmentDisposable,subscription=new SerialDisposable;subscription.setDisposable(d1);d1.setDisposable(source.subscribe(observer.onNext.bind(observer),function(exception){var d,result;try{result=handler(exception)}catch(ex){observer.onError(ex);return}isPromise(result)&&(result=observableFromPromise(result));d=new SingleAssignmentDisposable;subscription.setDisposable(d);d.setDisposable(result.subscribe(observer))},observer.onCompleted.bind(observer)));return subscription})}observableProto["catch"]=observableProto.catchException=function(handlerOrSecond){return typeof handlerOrSecond==="function"?observableCatchHandler(this,handlerOrSecond):observableCatch([this,handlerOrSecond])};var observableCatch=Observable.catchException=Observable["catch"]=function(){var items=argsOrArray(arguments,0);return enumerableFor(items).catchException()};observableProto.combineLatest=function(){var args=slice.call(arguments);if(Array.isArray(args[0])){args[0].unshift(this)}else{args.unshift(this)}return combineLatest.apply(this,args)};var combineLatest=Observable.combineLatest=function(){var args=slice.call(arguments),resultSelector=args.pop();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,isDone=arrayInitialize(n,falseFactory),values=new Array(n);function next(i){var res;hasValue[i]=true;if(hasValueAll||(hasValueAll=hasValue.every(identity))){try{res=resultSelector.apply(null,values)}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(identity)){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){values[i]=x;next(i)},observer.onError.bind(observer),function(){done(i)}));subscriptions[i]=sad})(idx)}return new CompositeDisposable(subscriptions)})};observableProto.concat=function(){var items=slice.call(arguments,0);items.unshift(this);return observableConcat.apply(this,items)};var observableConcat=Observable.concat=function(){var sources=argsOrArray(arguments,0);return enumerableFor(sources).concat()};observableProto.concatObservable=observableProto.concatAll=function(){return this.merge(1)};observableProto.merge=function(maxConcurrentOrOther){if(typeof maxConcurrentOrOther!=="number"){return observableMerge(this,maxConcurrentOrOther)}var sources=this;return new AnonymousObservable(function(observer){var activeCount=0,group=new CompositeDisposable,isStopped=false,q=[],subscribe=function(xs){var subscription=new SingleAssignmentDisposable;group.add(subscription);if(isPromise(xs)){xs=observableFromPromise(xs)}subscription.setDisposable(xs.subscribe(observer.onNext.bind(observer),observer.onError.bind(observer),function(){var s;group.remove(subscription);if(q.length>0){s=q.shift();subscribe(s)}else{activeCount--;if(isStopped&&activeCount===0){observer.onCompleted()}}}))};group.add(sources.subscribe(function(innerSource){if(activeCount<maxConcurrentOrOther){activeCount++;subscribe(innerSource)}else{q.push(innerSource)}},observer.onError.bind(observer),function(){isStopped=true;if(activeCount===0){observer.onCompleted()}}));return group})};var observableMerge=Observable.merge=function(){var scheduler,sources;if(!arguments[0]){scheduler=immediateScheduler;sources=slice.call(arguments,1)}else if(arguments[0].now){scheduler=arguments[0];sources=slice.call(arguments,1)}else{scheduler=immediateScheduler;sources=slice.call(arguments,0)}if(Array.isArray(sources[0])){sources=sources[0]}return observableFromArray(sources,scheduler).mergeObservable()};observableProto.mergeObservable=observableProto.mergeAll=function(){var sources=this;return new AnonymousObservable(function(observer){var group=new CompositeDisposable,isStopped=false,m=new SingleAssignmentDisposable;group.add(m);m.setDisposable(sources.subscribe(function(innerSource){var innerSubscription=new SingleAssignmentDisposable;group.add(innerSubscription);if(isPromise(innerSource)){innerSource=observableFromPromise(innerSource)}innerSubscription.setDisposable(innerSource.subscribe(function(x){observer.onNext(x)},observer.onError.bind(observer),function(){group.remove(innerSubscription);if(isStopped&&group.length===1){observer.onCompleted()}}))},observer.onError.bind(observer),function(){isStopped=true;if(group.length===1){observer.onCompleted()}}));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=argsOrArray(arguments,0);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),function(){self()},function(){self()}))}else{observer.onCompleted()}});return new CompositeDisposable(subscription,cancelable)})};observableProto.skipUntil=function(other){var source=this;return new AnonymousObservable(function(observer){var isOpen=false;var disposables=new CompositeDisposable(source.subscribe(function(left){isOpen&&observer.onNext(left)},observer.onError.bind(observer),function(){isOpen&&observer.onCompleted()}));isPromise(other)&&(other=observableFromPromise(other));var rightSubscription=new SingleAssignmentDisposable;disposables.add(rightSubscription);rightSubscription.setDisposable(other.subscribe(function(){isOpen=true;rightSubscription.dispose()},observer.onError.bind(observer),function(){rightSubscription.dispose()}));return disposables})};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);if(isPromise(innerSource)){innerSource=observableFromPromise(innerSource)}d.setDisposable(innerSource.subscribe(function(x){if(latest===id){observer.onNext(x)}},function(e){if(latest===id){observer.onError(e)}},function(){if(latest===id){hasLatest=false;if(isStopped){observer.onCompleted()}}}))},observer.onError.bind(observer),function(){isStopped=true;if(!hasLatest){observer.onCompleted()}});return new CompositeDisposable(subscription,innerSubscription)})};observableProto.takeUntil=function(other){var source=this;return new AnonymousObservable(function(observer){isPromise(other)&&(other=observableFromPromise(other));return new CompositeDisposable(source.subscribe(observer),other.subscribe(observer.onCompleted.bind(observer),observer.onError.bind(observer),noop))})};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){observer.onError(e);return}observer.onNext(result)}else{observer.onCompleted()}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})}observableProto.zip=function(){if(Array.isArray(arguments[0])){return zipArray.apply(this,arguments)}var parent=this,sources=slice.call(arguments),resultSelector=sources.pop();sources.unshift(parent);return new AnonymousObservable(function(observer){var n=sources.length,queues=arrayInitialize(n,function(){return[]}),isDone=arrayInitialize(n,function(){return false});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=sources[i],sad=new SingleAssignmentDisposable;isPromise(source)&&(source=observableFromPromise(source));sad.setDisposable(source.subscribe(function(x){queues[i].push(x);next(i)},observer.onError.bind(observer),function(){done(i)}));subscriptions[i]=sad})(idx)}return new CompositeDisposable(subscriptions)})};Observable.zip=function(){var args=slice.call(arguments,0),first=args.shift();return first.zip.apply(first,args)};Observable.zipArray=function(){var sources=argsOrArray(arguments,0);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)},observer.onError.bind(observer),function(){done(i)}))})(idx)}var compositeDisposable=new CompositeDisposable(subscriptions);compositeDisposable.add(disposableCreate(function(){for(var qIdx=0,qLen=queues.length;qIdx<qLen;qIdx++){queues[qIdx]=[]}}));return compositeDisposable})};observableProto.asObservable=function(){var source=this;return new AnonymousObservable(function(observer){return source.subscribe(observer)})};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(observer){return source.subscribe(function(x){return x.accept(observer)},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.distinctUntilChanged=function(keySelector,comparer){var source=this;keySelector||(keySelector=identity);comparer||(comparer=defaultComparer);return new AnonymousObservable(function(observer){var hasCurrentKey=false,currentKey;return source.subscribe(function(value){var comparerEquals=false,key;try{key=keySelector(value)}catch(exception){observer.onError(exception);return}if(hasCurrentKey){try{comparerEquals=comparer(currentKey,key)}catch(exception){observer.onError(exception);return}}if(!hasCurrentKey||!comparerEquals){hasCurrentKey=true;currentKey=key;observer.onNext(value)}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto["do"]=observableProto.doAction=observableProto.tap=function(observerOrOnNext,onError,onCompleted){var source=this,onNextFunc;if(typeof observerOrOnNext==="function"){onNextFunc=observerOrOnNext}else{onNextFunc=observerOrOnNext.onNext.bind(observerOrOnNext);onError=observerOrOnNext.onError.bind(observerOrOnNext);onCompleted=observerOrOnNext.onCompleted.bind(observerOrOnNext)}return new AnonymousObservable(function(observer){return source.subscribe(function(x){try{onNextFunc(x)}catch(e){observer.onError(e)}observer.onNext(x)},function(err){if(!onError){observer.onError(err)}else{try{onError(err)}catch(e){observer.onError(e)}observer.onError(err)}},function(){if(!onCompleted){observer.onCompleted()}else{try{onCompleted()}catch(e){observer.onError(e)}observer.onCompleted()}})})};observableProto["finally"]=observableProto.finallyAction=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()}})})};observableProto.ignoreElements=function(){var source=this;return new AnonymousObservable(function(observer){return source.subscribe(noop,observer.onError.bind(observer),observer.onCompleted.bind(observer))})};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()})})};observableProto.repeat=function(repeatCount){return enumerableRepeat(this,repeatCount).concat()};observableProto.retry=function(retryCount){return enumerableRepeat(this,retryCount).catchException()};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(observer){var hasAccumulation,accumulation,hasValue;return source.subscribe(function(x){try{if(!hasValue){hasValue=true}if(hasAccumulation){accumulation=accumulator(accumulation,x)}else{accumulation=hasSeed?accumulator(seed,x):x;hasAccumulation=true}}catch(e){observer.onError(e);return}observer.onNext(accumulation)},observer.onError.bind(observer),function(){if(!hasValue&&hasSeed){observer.onNext(seed)}observer.onCompleted()})})};observableProto.skipLast=function(count){var source=this;return new AnonymousObservable(function(observer){var q=[];return source.subscribe(function(x){q.push(x);if(q.length>count){observer.onNext(q.shift())}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.startWith=function(){var values,scheduler,start=0;if(!!arguments.length&&"now"in Object(arguments[0])){scheduler=arguments[0];start=1}else{scheduler=immediateScheduler}values=slice.call(arguments,start);return enumerableFor([observableFromArray(values,scheduler),this]).concat()};observableProto.takeLast=function(count,scheduler){return this.takeLastBuffer(count).selectMany(function(xs){return observableFromArray(xs,scheduler) | |
})};observableProto.takeLastBuffer=function(count){var source=this;return new AnonymousObservable(function(observer){var q=[];return source.subscribe(function(x){q.push(x);if(q.length>count){q.shift()}},observer.onError.bind(observer),function(){observer.onNext(q);observer.onCompleted()})})};observableProto.windowWithCount=function(count,skip){var source=this;if(count<=0){throw new Error(argumentOutOfRange)}if(arguments.length===1){skip=count}if(skip<=0){throw new Error(argumentOutOfRange)}return new AnonymousObservable(function(observer){var m=new SingleAssignmentDisposable,refCountDisposable=new RefCountDisposable(m),n=0,q=[],createWindow=function(){var s=new Subject;q.push(s);observer.onNext(addRef(s,refCountDisposable))};createWindow();m.setDisposable(source.subscribe(function(x){var s;for(var i=0,len=q.length;i<len;i++){q[i].onNext(x)}var c=n-count+1;if(c>=0&&c%skip===0){s=q.shift();s.onCompleted()}n++;if(n%skip===0){createWindow()}},function(exception){while(q.length>0){q.shift().onError(exception)}observer.onError(exception)},function(){while(q.length>0){q.shift().onCompleted()}observer.onCompleted()}));return refCountDisposable})};function concatMap(selector){return this.map(function(x,i){var result=selector(x,i);return isPromise(result)?observableFromPromise(result):result}).concatAll()}function concatMapObserver(onNext,onError,onCompleted){var source=this;return new AnonymousObservable(function(observer){var index=0;return source.subscribe(function(x){observer.onNext(onNext(x,index++))},function(err){observer.onNext(onError(err));observer.completed()},function(){observer.onNext(onCompleted());observer.onCompleted()})}).concatAll()}observableProto.selectConcat=observableProto.concatMap=function(selector,resultSelector){if(resultSelector){return this.concatMap(function(x,i){var selectorResult=selector(x,i),result=isPromise(selectorResult)?observableFromPromise(selectorResult):selectorResult;return result.map(function(y){return resultSelector(x,y,i)})})}if(typeof selector==="function"){return concatMap.call(this,selector)}return concatMap.call(this,function(){return selector})};observableProto.defaultIfEmpty=function(defaultValue){var source=this;if(defaultValue===undefined){defaultValue=null}return new AnonymousObservable(function(observer){var found=false;return source.subscribe(function(x){found=true;observer.onNext(x)},observer.onError.bind(observer),function(){if(!found){observer.onNext(defaultValue)}observer.onCompleted()})})};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(observer){var hashSet=new HashSet(comparer);return source.subscribe(function(x){var key=x;if(keySelector){try{key=keySelector(x)}catch(e){observer.onError(e);return}}hashSet.push(key)&&observer.onNext(x)},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};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){var map=new Dictionary,groupDisposable=new CompositeDisposable,refCountDisposable=new RefCountDisposable(groupDisposable);groupDisposable.add(source.subscribe(function(x){var key,i,len,items;try{key=keySelector(x)}catch(e){items=map.getValues();for(i=0,len=items.length;i<len;i++){items[i].onError(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){items=map.getValues();for(i=0,len=items.length;i<len;i++){items[i].onError(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){items=map.getValues();for(i=0,len=items.length;i<len;i++){items[i].onError(exn)}observer.onError(exn)},expire))}var element;try{element=elementSelector(x)}catch(e){items=map.getValues();for(i=0,len=items.length;i<len;i++){items[i].onError(e)}observer.onError(e);return}writer.onNext(element)},function(ex){var items=map.getValues();for(var i=0,len=items.length;i<len;i++){items[i].onError(ex)}observer.onError(ex)},function(){var items=map.getValues();for(var i=0,len=items.length;i<len;i++){items[i].onCompleted()}observer.onCompleted()}));return refCountDisposable})};observableProto.select=observableProto.map=function(selector,thisArg){var parent=this;return new AnonymousObservable(function(observer){var count=0;return parent.subscribe(function(value){var result;try{result=selector.call(thisArg,value,count++,parent)}catch(exception){observer.onError(exception);return}observer.onNext(result)},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.pluck=function(property){return this.select(function(x){return x[property]})};function selectMany(selector){return this.select(function(x,i){var result=selector(x,i);return isPromise(result)?observableFromPromise(result):result}).mergeObservable()}function selectManyObserver(onNext,onError,onCompleted){var source=this;return new AnonymousObservable(function(observer){var index=0;return source.subscribe(function(x){observer.onNext(onNext(x,index++))},function(err){observer.onNext(onError(err));observer.completed()},function(){observer.onNext(onCompleted());observer.onCompleted()})}).mergeAll()}observableProto.selectMany=observableProto.flatMap=function(selector,resultSelector){if(resultSelector){return this.selectMany(function(x,i){var selectorResult=selector(x,i),result=isPromise(selectorResult)?observableFromPromise(selectorResult):selectorResult;return result.select(function(y){return resultSelector(x,y,i)})})}if(typeof selector==="function"){return selectMany.call(this,selector)}return selectMany.call(this,function(){return selector})};observableProto.selectSwitch=observableProto.flatMapLatest=observableProto.switchMap=function(selector,thisArg){return this.select(selector,thisArg).switchLatest()};observableProto.skip=function(count){if(count<0){throw new Error(argumentOutOfRange)}var observable=this;return new AnonymousObservable(function(observer){var remaining=count;return observable.subscribe(function(x){if(remaining<=0){observer.onNext(x)}else{remaining--}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.skipWhile=function(predicate,thisArg){var source=this;return new AnonymousObservable(function(observer){var i=0,running=false;return source.subscribe(function(x){if(!running){try{running=!predicate.call(thisArg,x,i++,source)}catch(e){observer.onError(e);return}}if(running){observer.onNext(x)}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.take=function(count,scheduler){if(count<0){throw new Error(argumentOutOfRange)}if(count===0){return observableEmpty(scheduler)}var observable=this;return new AnonymousObservable(function(observer){var remaining=count;return observable.subscribe(function(x){if(remaining>0){remaining--;observer.onNext(x);if(remaining===0){observer.onCompleted()}}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.takeWhile=function(predicate,thisArg){var observable=this;return new AnonymousObservable(function(observer){var i=0,running=true;return observable.subscribe(function(x){if(running){try{running=predicate.call(thisArg,x,i++,observable)}catch(e){observer.onError(e);return}if(running){observer.onNext(x)}else{observer.onCompleted()}}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.where=observableProto.filter=function(predicate,thisArg){var parent=this;return new AnonymousObservable(function(observer){var count=0;return parent.subscribe(function(value){var shouldRun;try{shouldRun=predicate.call(thisArg,value,count++,parent)}catch(exception){observer.onError(exception);return}if(shouldRun){observer.onNext(value)}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.finalValue=function(){var source=this;return new AnonymousObservable(function(observer){var hasValue=false,value;return source.subscribe(function(x){hasValue=true;value=x},observer.onError.bind(observer),function(){if(!hasValue){observer.onError(new Error(sequenceContainsNoElements))}else{observer.onNext(value);observer.onCompleted()}})})};function extremaBy(source,keySelector,comparer){return new AnonymousObservable(function(observer){var hasValue=false,lastKey=null,list=[];return source.subscribe(function(x){var comparison,key;try{key=keySelector(x)}catch(ex){observer.onError(ex);return}comparison=0;if(!hasValue){hasValue=true;lastKey=key}else{try{comparison=comparer(key,lastKey)}catch(ex1){observer.onError(ex1);return}}if(comparison>0){lastKey=key;list=[]}if(comparison>=0){list.push(x)}},observer.onError.bind(observer),function(){observer.onNext(list);observer.onCompleted()})})}function firstOnly(x){if(x.length===0){throw new Error(sequenceContainsNoElements)}return x[0]}observableProto.aggregate=function(){var seed,hasSeed,accumulator;if(arguments.length===2){seed=arguments[0];hasSeed=true;accumulator=arguments[1]}else{accumulator=arguments[0]}return hasSeed?this.scan(seed,accumulator).startWith(seed).finalValue():this.scan(accumulator).finalValue()};observableProto.reduce=function(accumulator){var seed,hasSeed;if(arguments.length===2){hasSeed=true;seed=arguments[1]}return hasSeed?this.scan(seed,accumulator).startWith(seed).finalValue():this.scan(accumulator).finalValue()};observableProto.some=observableProto.any=function(predicate,thisArg){var source=this;return predicate?source.where(predicate,thisArg).any():new AnonymousObservable(function(observer){return source.subscribe(function(){observer.onNext(true);observer.onCompleted()},observer.onError.bind(observer),function(){observer.onNext(false);observer.onCompleted()})})};observableProto.isEmpty=function(){return this.any().select(function(b){return!b})};observableProto.every=observableProto.all=function(predicate,thisArg){return this.where(function(v){return!predicate(v)},thisArg).any().select(function(b){return!b})};observableProto.contains=function(value,comparer){comparer||(comparer=defaultComparer);return this.where(function(v){return comparer(v,value)}).any()};observableProto.count=function(predicate,thisArg){return predicate?this.where(predicate,thisArg).count():this.aggregate(0,function(count){return count+1})};observableProto.sum=function(keySelector,thisArg){return keySelector?this.select(keySelector,thisArg).sum():this.aggregate(0,function(prev,curr){return prev+curr})};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).select(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).select(function(x){return firstOnly(x)})};observableProto.average=function(keySelector,thisArg){return keySelector?this.select(keySelector,thisArg).average():this.scan({sum:0,count:0},function(prev,cur){return{sum:prev.sum+cur,count:prev.count+1}}).finalValue().select(function(s){if(s.count===0){throw new Error("The input sequence was empty")}return s.sum/s.count})};function sequenceEqualArray(first,second,comparer){return new AnonymousObservable(function(observer){var count=0,len=second.length;return first.subscribe(function(value){var equal=false;try{if(count<len){equal=comparer(value,second[count++])}}catch(e){observer.onError(e);return}if(!equal){observer.onNext(false);observer.onCompleted()}},observer.onError.bind(observer),function(){observer.onNext(count===len);observer.onCompleted()})})}observableProto.sequenceEqual=function(second,comparer){var first=this;comparer||(comparer=defaultComparer);if(Array.isArray(second)){return sequenceEqualArray(first,second,comparer)}return new AnonymousObservable(function(observer){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){observer.onError(e);return}if(!equal){observer.onNext(false);observer.onCompleted()}}else if(doner){observer.onNext(false);observer.onCompleted()}else{ql.push(x)}},observer.onError.bind(observer),function(){donel=true;if(ql.length===0){if(qr.length>0){observer.onNext(false);observer.onCompleted()}else if(doner){observer.onNext(true);observer.onCompleted()}}});isPromise(second)&&(second=observableFromPromise(second));var subscription2=second.subscribe(function(x){var equal,v;if(ql.length>0){v=ql.shift();try{equal=comparer(v,x)}catch(exception){observer.onError(exception);return}if(!equal){observer.onNext(false);observer.onCompleted()}}else if(donel){observer.onNext(false);observer.onCompleted()}else{qr.push(x)}},observer.onError.bind(observer),function(){doner=true;if(qr.length===0){if(ql.length>0){observer.onNext(false);observer.onCompleted()}else if(donel){observer.onNext(true);observer.onCompleted()}}});return new CompositeDisposable(subscription1,subscription2)})};function elementAtOrDefault(source,index,hasDefault,defaultValue){if(index<0){throw new Error(argumentOutOfRange)}return new AnonymousObservable(function(observer){var i=index;return source.subscribe(function(x){if(i===0){observer.onNext(x);observer.onCompleted()}i--},observer.onError.bind(observer),function(){if(!hasDefault){observer.onError(new Error(argumentOutOfRange))}else{observer.onNext(defaultValue);observer.onCompleted()}})})}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(observer){var value=defaultValue,seenValue=false;return source.subscribe(function(x){if(seenValue){observer.onError(new Error("Sequence contains more than one element"))}else{value=x;seenValue=true}},observer.onError.bind(observer),function(){if(!seenValue&&!hasDefault){observer.onError(new Error(sequenceContainsNoElements))}else{observer.onNext(value);observer.onCompleted()}})})}observableProto.single=function(predicate,thisArg){return predicate?this.where(predicate,thisArg).single():singleOrDefaultAsync(this,false)};observableProto.singleOrDefault=function(predicate,defaultValue,thisArg){return predicate?this.where(predicate,thisArg).singleOrDefault(null,defaultValue):singleOrDefaultAsync(this,true,defaultValue)};function firstOrDefaultAsync(source,hasDefault,defaultValue){return new AnonymousObservable(function(observer){return source.subscribe(function(x){observer.onNext(x);observer.onCompleted()},observer.onError.bind(observer),function(){if(!hasDefault){observer.onError(new Error(sequenceContainsNoElements))}else{observer.onNext(defaultValue);observer.onCompleted()}})})}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(observer){var value=defaultValue,seenValue=false;return source.subscribe(function(x){value=x;seenValue=true},observer.onError.bind(observer),function(){if(!seenValue&&!hasDefault){observer.onError(new Error(sequenceContainsNoElements))}else{observer.onNext(value);observer.onCompleted()}})})}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){return new AnonymousObservable(function(observer){var i=0;return source.subscribe(function(x){var shouldRun;try{shouldRun=predicate.call(thisArg,x,i,source)}catch(e){observer.onError(e);return}if(shouldRun){observer.onNext(yieldIndex?i:x);observer.onCompleted()}else{i++}},observer.onError.bind(observer),function(){observer.onNext(yieldIndex?-1:undefined);observer.onCompleted()})})}observableProto.find=function(predicate,thisArg){return findValue(this,predicate,thisArg,false)};observableProto.findIndex=function(predicate,thisArg){return findValue(this,predicate,thisArg,true)};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 args=slice.call(arguments,0);return new AnonymousObservable(function(observer){function handler(e){var results=e;if(selector){try{results=selector(arguments)}catch(err){observer.onError(err);return}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)})}};Observable.fromNodeCallback=function(func,context,selector){return function(){var args=slice.call(arguments,0);return new AnonymousObservable(function(observer){function handler(err){if(err){observer.onError(err);return}var results=slice.call(arguments,1);if(selector){try{results=selector(results)}catch(e){observer.onError(e);return}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)})}};function createListener(element,name,handler){if(element.addListener){element.addListener(name,handler);return disposableCreate(function(){element.removeListener(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(typeof el.item==="function"&&typeof el.length==="number"){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}var jq=!!root.angular&&!!angular.element?angular.element:!!root.jQuery?root.jQuery:!!root.Zepto?root.Zepto:null;var ember=!!root.Ember&&typeof root.Ember.addListener==="function";Observable.fromEvent=function(element,eventName,selector){if(ember){return fromEventPattern(function(h){Ember.addListener(element,eventName,h)},function(h){Ember.removeListener(element,eventName,h)},selector)}if(jq){var $elem=jq(element);return fromEventPattern(function(h){$elem.on(eventName,h)},function(h){$elem.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){observer.onError(err);return}}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){observer.onError(err);return}}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.subject.distinctUntilChanged().subscribe(function(b){if(b){connection=conn.connect()}else{connection.dispose();connection=disposableEmpty}});return new CompositeDisposable(subscription,connection,pausable)}function PausableObservable(source,subject){this.source=source;this.subject=subject||new Subject;this.isPaused=true;_super.call(this,subscribe)}PausableObservable.prototype.pause=function(){if(this.isPaused===true){return}this.isPaused=true;this.subject.onNext(false)};PausableObservable.prototype.resume=function(){if(this.isPaused===false){return}this.isPaused=false;this.subject.onNext(true)};return PausableObservable}(Observable);observableProto.pausable=function(pauser){return new PausableObservable(this,pauser)};function combineLatestSource(source,subject,resultSelector){return new AnonymousObservable(function(observer){var n=2,hasValue=[false,false],hasValueAll=false,isDone=false,values=new Array(n);function next(x,i){values[i]=x;var res;hasValue[i]=true;if(hasValueAll||(hasValueAll=hasValue.every(identity))){try{res=resultSelector.apply(null,values)}catch(ex){observer.onError(ex);return}observer.onNext(res)}else if(isDone){observer.onCompleted()}}return new CompositeDisposable(source.subscribe(function(x){next(x,0)},observer.onError.bind(observer),function(){isDone=true;observer.onCompleted()}),subject.subscribe(function(x){next(x,1)},observer.onError.bind(observer)))})}var PausableBufferedObservable=function(_super){inherits(PausableBufferedObservable,_super);function subscribe(observer){var q=[],previous=true;var subscription=combineLatestSource(this.source,this.subject.distinctUntilChanged(),function(data,shouldFire){return{data:data,shouldFire:shouldFire}}).subscribe(function(results){if(results.shouldFire&&previous){observer.onNext(results.data)}if(results.shouldFire&&!previous){while(q.length>0){observer.onNext(q.shift())}previous=true}else if(!results.shouldFire&&!previous){q.push(results.data)}else if(!results.shouldFire&&previous){previous=false}},function(err){while(q.length>0){observer.onNext(q.shift())}observer.onError(err)},function(){while(q.length>0){observer.onNext(q.shift())}observer.onCompleted()});this.subject.onNext(false);return subscription}function PausableBufferedObservable(source,subject){this.source=source;this.subject=subject||new Subject;this.isPaused=true;_super.call(this,subscribe)}PausableBufferedObservable.prototype.pause=function(){if(this.isPaused===true){return}this.isPaused=true;this.subject.onNext(false)};PausableBufferedObservable.prototype.resume=function(){if(this.isPaused===false){return}this.isPaused=false;this.subject.onNext(true)};return PausableBufferedObservable}(Observable);observableProto.pausableBuffered=function(subject){return new PausableBufferedObservable(this,subject)};observableProto.controlled=function(enableQueue){if(enableQueue==null){enableQueue=true}return new ControlledObservable(this,enableQueue)};var ControlledObservable=function(_super){inherits(ControlledObservable,_super);function subscribe(observer){return this.source.subscribe(observer)}function ControlledObservable(source,enableQueue){_super.call(this,subscribe);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=Rx.ControlledSubject=function(_super){function subscribe(observer){return this.subject.subscribe(observer)}inherits(ControlledSubject,_super);function ControlledSubject(enableQueue){if(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;this.controlledDisposable=disposableEmpty}addProperties(ControlledSubject.prototype,Observer,{onCompleted:function(){checkDisposed.call(this);this.hasCompleted=true;if(!this.enableQueue||this.queue.length===0){this.subject.onCompleted()}},onError:function(error){checkDisposed.call(this);this.hasFailed=true;this.error=error;if(!this.enableQueue||this.queue.length===0){this.subject.onError(error)}},onNext:function(value){checkDisposed.call(this);var hasRequested=false;if(this.requestedCount===0){if(this.enableQueue){this.queue.push(value)}}else{if(this.requestedCount!==-1){if(this.requestedCount--===0){this.disposeCurrentRequest()}}hasRequested=true}if(hasRequested){this.subject.onNext(value)}},_processRequest:function(numberOfItems){if(this.enableQueue){while(this.queue.length>=numberOfItems&&numberOfItems>0){this.subject.onNext(this.queue.shift());numberOfItems--}if(this.queue.length!==0){return{numberOfItems:numberOfItems,returnValue:true}}else{return{numberOfItems:numberOfItems,returnValue:false}}}if(this.hasFailed){this.subject.onError(this.error);this.controlledDisposable.dispose();this.controlledDisposable=disposableEmpty}else if(this.hasCompleted){this.subject.onCompleted();this.controlledDisposable.dispose();this.controlledDisposable=disposableEmpty}return{numberOfItems:numberOfItems,returnValue:false}},request:function(number){checkDisposed.call(this);this.disposeCurrentRequest();var self=this,r=this._processRequest(number);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},dispose:function(){this.isDisposed=true;this.error=null;this.subject.dispose();this.requestedDisposable.dispose()}});return ControlledSubject}(Observable);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())}):new ConnectableObservable(source,subjectOrSubjectSelector)};observableProto.publish=function(selector){return!selector?this.multicast(new Subject):this.multicast(function(){return new Subject},selector)};observableProto.share=function(){return this.publish(null).refCount()};observableProto.publishLast=function(selector){return!selector?this.multicast(new AsyncSubject):this.multicast(function(){return new AsyncSubject},selector)};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,window,scheduler){return!selector?this.multicast(new ReplaySubject(bufferSize,window,scheduler)):this.multicast(function(){return new ReplaySubject(bufferSize,window,scheduler)},selector)};observableProto.shareReplay=function(bufferSize,window,scheduler){return this.replay(null,bufferSize,window,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.call(this);if(!this.isStopped){this.observers.push(observer);observer.onNext(this.value);return new InnerSubscription(this,observer)}var ex=this.exception;if(ex){observer.onError(ex)}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.exception=null}addProperties(BehaviorSubject.prototype,Observer,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;for(var i=0,len=os.length;i<len;i++){os[i].onCompleted()}this.observers=[]}},onError:function(error){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;this.exception=error;for(var i=0,len=os.length;i<len;i++){os[i].onError(error)}this.observers=[]}},onNext:function(value){checkDisposed.call(this);if(!this.isStopped){this.value=value;var os=this.observers.slice(0);for(var i=0,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){function RemovableDisposable(subject,observer){this.subject=subject;this.observer=observer}RemovableDisposable.prototype.dispose=function(){this.observer.dispose();if(!this.subject.isDisposed){var idx=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(idx,1)}};function subscribe(observer){var so=new ScheduledObserver(this.scheduler,observer),subscription=new RemovableDisposable(this,so);checkDisposed.call(this);this._trim(this.scheduler.now());this.observers.push(so);var n=this.q.length;for(var i=0,len=this.q.length;i<len;i++){so.onNext(this.q[i].value)}if(this.hasError){n++;so.onError(this.error)}else if(this.isStopped){n++;so.onCompleted()}so.ensureActive(n);return subscription}inherits(ReplaySubject,_super);function ReplaySubject(bufferSize,windowSize,scheduler){this.bufferSize=bufferSize==null?Number.MAX_VALUE:bufferSize;this.windowSize=windowSize==null?Number.MAX_VALUE: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,{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){var observer;checkDisposed.call(this);if(!this.isStopped){var now=this.scheduler.now(); | |
this.q.push({interval:now,value:value});this._trim(now);var o=this.observers.slice(0);for(var i=0,len=o.length;i<len;i++){observer=o[i];observer.onNext(value);observer.ensureActive()}}},onError:function(error){var observer;checkDisposed.call(this);if(!this.isStopped){this.isStopped=true;this.error=error;this.hasError=true;var now=this.scheduler.now();this._trim(now);var o=this.observers.slice(0);for(var i=0,len=o.length;i<len;i++){observer=o[i];observer.onError(error);observer.ensureActive()}this.observers=[]}},onCompleted:function(){var observer;checkDisposed.call(this);if(!this.isStopped){this.isStopped=true;var now=this.scheduler.now();this._trim(now);var o=this.observers.slice(0);for(var i=0,len=o.length;i<len;i++){observer=o[i];observer.onCompleted();observer.ensureActive()}this.observers=[]}},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;this.connect=function(){if(!hasSubscription){hasSubscription=true;subscription=new CompositeDisposable(source.subscribe(subject),disposableCreate(function(){hasSubscription=false}))}return subscription};__super__.call(this,subject.subscribe.bind(subject))}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=668265261;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 obj==="string"){return stringHashFn(valueOf)}}if(obj.getHashCode){return obj.getHashCode()}var id=17*uniqueIdCounter++;obj.getHashCode=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 Error("out of range")}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){return 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,leftDone=false,leftId=0,leftMap=new Dictionary,rightDone=false,rightId=0,rightMap=new Dictionary;group.add(left.subscribe(function(value){var duration,expire,id=leftId++,md=new SingleAssignmentDisposable,result,values;leftMap.add(id,value);group.add(md);expire=function(){if(leftMap.remove(id)&&leftMap.count()===0&&leftDone){observer.onCompleted()}return group.remove(md)};try{duration=leftDurationSelector(value)}catch(e){observer.onError(e);return}md.setDisposable(duration.take(1).subscribe(noop,observer.onError.bind(observer),function(){expire()}));values=rightMap.getValues();for(var i=0;i<values.length;i++){try{result=resultSelector(value,values[i])}catch(exception){observer.onError(exception);return}observer.onNext(result)}},observer.onError.bind(observer),function(){leftDone=true;if(rightDone||leftMap.count()===0){observer.onCompleted()}}));group.add(right.subscribe(function(value){var duration,expire,id=rightId++,md=new SingleAssignmentDisposable,result,values;rightMap.add(id,value);group.add(md);expire=function(){if(rightMap.remove(id)&&rightMap.count()===0&&rightDone){observer.onCompleted()}return group.remove(md)};try{duration=rightDurationSelector(value)}catch(exception){observer.onError(exception);return}md.setDisposable(duration.take(1).subscribe(noop,observer.onError.bind(observer),function(){expire()}));values=leftMap.getValues();for(var i=0;i<values.length;i++){try{result=resultSelector(values[i],value)}catch(exception){observer.onError(exception);return}observer.onNext(result)}},observer.onError.bind(observer),function(){rightDone=true;if(leftDone||rightMap.count()===0){observer.onCompleted()}}));return group})};observableProto.groupJoin=function(right,leftDurationSelector,rightDurationSelector,resultSelector){var left=this;return new AnonymousObservable(function(observer){var nothing=function(){};var group=new CompositeDisposable;var r=new RefCountDisposable(group);var leftMap=new Dictionary;var rightMap=new Dictionary;var leftID=0;var rightID=0;group.add(left.subscribe(function(value){var s=new Subject;var id=leftID++;leftMap.add(id,s);var i,len,leftValues,rightValues;var result;try{result=resultSelector(value,addRef(s,r))}catch(e){leftValues=leftMap.getValues();for(i=0,len=leftValues.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e);return}observer.onNext(result);rightValues=rightMap.getValues();for(i=0,len=rightValues.length;i<len;i++){s.onNext(rightValues[i])}var md=new SingleAssignmentDisposable;group.add(md);var expire=function(){if(leftMap.remove(id)){s.onCompleted()}group.remove(md)};var duration;try{duration=leftDurationSelector(value)}catch(e){leftValues=leftMap.getValues();for(i=0,len=leftMap.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e);return}md.setDisposable(duration.take(1).subscribe(nothing,function(e){leftValues=leftMap.getValues();for(i=0,len=leftValues.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e)},expire))},function(e){var leftValues=leftMap.getValues();for(var i=0,len=leftValues.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e)},observer.onCompleted.bind(observer)));group.add(right.subscribe(function(value){var leftValues,i,len;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){leftValues=leftMap.getValues();for(i=0,len=leftMap.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e);return}md.setDisposable(duration.take(1).subscribe(nothing,function(e){leftValues=leftMap.getValues();for(i=0,len=leftMap.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e)},expire));leftValues=leftMap.getValues();for(i=0,len=leftValues.length;i<len;i++){leftValues[i].onNext(value)}},function(e){var leftValues=leftMap.getValues();for(var i=0,len=leftValues.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e)}));return r})};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 observableWindowWithBounaries.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,function(){return observableEmpty()},function(_,window){return window})}function observableWindowWithBounaries(windowBoundaries){var source=this;return new AnonymousObservable(function(observer){var window=new Subject,d=new CompositeDisposable,r=new RefCountDisposable(d);observer.onNext(addRef(window,r));d.add(source.subscribe(function(x){window.onNext(x)},function(err){window.onError(err);observer.onError(err)},function(){window.onCompleted();observer.onCompleted()}));d.add(windowBoundaries.subscribe(function(w){window.onCompleted();window=new Subject;observer.onNext(addRef(window,r))},function(err){window.onError(err);observer.onError(err)},function(){window.onCompleted();observer.onCompleted()}));return r})}function observableWindowWithClosingSelector(windowClosingSelector){var source=this;return new AnonymousObservable(function(observer){var createWindowClose,m=new SerialDisposable,d=new CompositeDisposable(m),r=new RefCountDisposable(d),window=new Subject;observer.onNext(addRef(window,r));d.add(source.subscribe(function(x){window.onNext(x)},function(ex){window.onError(ex);observer.onError(ex)},function(){window.onCompleted();observer.onCompleted()}));createWindowClose=function(){var m1,windowClose;try{windowClose=windowClosingSelector()}catch(exception){observer.onError(exception);return}m1=new SingleAssignmentDisposable;m.setDisposable(m1);m1.setDisposable(windowClose.take(1).subscribe(noop,function(ex){window.onError(ex);observer.onError(ex)},function(){window.onCompleted();window=new Subject;observer.onNext(addRef(window,r));createWindowClose()}))};createWindowClose();return r})}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))})};observableProto.partition=function(predicate,thisArg){var published=this.publish().refCount();return[published.filter(predicate,thisArg),published.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){return enumerableFor(sources,resultSelector).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})};Observable.forkJoin=function(){var allSources=argsOrArray(arguments,0);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)})};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)})};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.mergeObservable().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.throwException(e))},onNext:function(v){this.tail.onNext(v);this.tail.onCompleted()}});return ChainObservable}(Observable);var Map=function(){function Map(){this.keys=[];this.values=[]}Map.prototype["delete"]=function(key){var i=this.keys.indexOf(key);if(i!==-1){this.keys.splice(i,1);this.values.splice(i,1)}return i!==-1};Map.prototype.get=function(key,fallback){var i=this.keys.indexOf(key);return i!==-1?this.values[i]:fallback};Map.prototype.set=function(key,value){var i=this.keys.indexOf(key);if(i!==-1){this.values[i]=value}this.values[this.keys.push(key)-1]=value};Map.prototype.size=function(){return this.keys.length};Map.prototype.has=function(key){return this.keys.indexOf(key)!==-1};Map.prototype.getKeys=function(){return this.keys.slice(0)};Map.prototype.getValues=function(){return this.values.slice(0)};return Map}();function Pattern(patterns){this.patterns=patterns}Pattern.prototype.and=function(other){var patterns=this.patterns.slice(0);patterns.push(other);return new Pattern(patterns)};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(exception){observer.onError(exception);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){var i,joinObserver;this.joinObserverArray=joinObserverArray;this.onNext=onNext;this.onCompleted=onCompleted;this.joinObservers=new Map;for(i=0;i<this.joinObserverArray.length;i++){joinObserver=this.joinObserverArray[i];this.joinObservers.set(joinObserver,joinObserver)}}ActivePlan.prototype.dequeue=function(){var values=this.joinObservers.getValues();for(var i=0,len=values.length;i<len;i++){values[i].queue.shift()}};ActivePlan.prototype.match=function(){var firstValues,i,len,isCompleted,values,hasValues=true;for(i=0,len=this.joinObserverArray.length;i<len;i++){if(this.joinObserverArray[i].queue.length===0){hasValues=false;break}}if(hasValues){firstValues=[];isCompleted=false;for(i=0,len=this.joinObserverArray.length;i<len;i++){firstValues.push(this.joinObserverArray[i].queue[0]);if(this.joinObserverArray[i].queue[0].kind==="C"){isCompleted=true}}if(isCompleted){this.onCompleted()}else{this.dequeue();values=[];for(i=0;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"){this.onError(notification.exception);return}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){var idx=this.activePlans.indexOf(activePlan);this.activePlans.splice(idx,1);if(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 plans=argsOrArray(arguments,0);return new AnonymousObservable(function(observer){var activePlans=[],externalSubscriptions=new Map,group,i,len,joinObserver,joinValues,outObserver;outObserver=observerCreate(observer.onNext.bind(observer),function(exception){var values=externalSubscriptions.getValues();for(var j=0,jlen=values.length;j<jlen;j++){values[j].onError(exception)}observer.onError(exception)},observer.onCompleted.bind(observer));try{for(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);if(activePlans.length===0){outObserver.onCompleted()}}))}}catch(e){observableThrow(e).subscribe(observer)}group=new CompositeDisposable;joinValues=externalSubscriptions.getValues();for(i=0,len=joinValues.length;i<len;i++){joinObserver=joinValues[i];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){var p=normalizeTime(period);return new AnonymousObservable(function(observer){var count=0,d=dueTime;return scheduler.scheduleRecursiveWithAbsolute(d,function(self){var now;if(p>0){now=scheduler.now();d=d+p;if(d<=now){d=now+p}}observer.onNext(count++);self(d)})})}function observableTimerTimeSpan(dueTime,scheduler){var d=normalizeTime(dueTime);return new AnonymousObservable(function(observer){return scheduler.scheduleWithRelative(d,function(){observer.onNext(0);observer.onCompleted()})})}function observableTimerTimeSpanAndPeriod(dueTime,period,scheduler){if(dueTime===period){return new AnonymousObservable(function(observer){return scheduler.schedulePeriodicWithState(0,period,function(count){observer.onNext(count);return count+1})})}return 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(periodOrScheduler!==undefined&&typeof periodOrScheduler==="object"){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)})}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.throttle=function(dueTime,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);return this.throttleWithSelector(function(){return observableTimer(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(typeof timeShiftOrScheduler==="object"){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);q.push(new Subject);observer.onNext(addRef(q[0],refCountDisposable));createTimer();groupDisposable.add(source.subscribe(function(x){var i,len;for(i=0,len=q.length;i<len;i++){q[i].onNext(x)}},function(e){var i,len;for(i=0,len=q.length;i<len;i++){q[i].onError(e)}observer.onError(e)},function(){var i,len;for(i=0,len=q.length;i<len;i++){q[i].onCompleted()}observer.onCompleted()}));return refCountDisposable;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;isSpan&&(nextSpan+=timeShift);isShift&&(nextShift+=timeShift);m.setDisposable(scheduler.scheduleWithRelative(ts,function(){var s;if(isShift){s=new Subject;q.push(s);observer.onNext(addRef(s,refCountDisposable))}if(isSpan){s=q.shift();s.onCompleted()}createTimer()}))}})};observableProto.windowWithTimeOrCount=function(timeSpan,count,scheduler){var source=this;isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){var createTimer,groupDisposable,n=0,refCountDisposable,s=new Subject;timerD=new SerialDisposable,windowId=0;groupDisposable=new CompositeDisposable(timerD);refCountDisposable=new RefCountDisposable(groupDisposable);observer.onNext(addRef(s,refCountDisposable));createTimer(0);groupDisposable.add(source.subscribe(function(x){var newId=0,newWindow=false;s.onNext(x);n++;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;function createTimer(id){var m=new SingleAssignmentDisposable;timerD.setDisposable(m);m.setDisposable(scheduler.scheduleWithRelative(timeSpan,function(){var newId;if(id!==windowId){return}n=0;newId=++windowId;s.onCompleted();s=new Subject;observer.onNext(addRef(s,refCountDisposable));createTimer(newId)}))}})};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))})}observableProto.sample=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||(other=observableThrow(new Error("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);var createTimer=function(){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)})};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(function(){start()},observer.onError.bind(observer),function(){start()}))}return new CompositeDisposable(subscription,delays)})};observableProto.timeoutWithSelector=function(firstTimeout,timeoutdurationSelector,other){if(arguments.length===1){timeoutdurationSelector=firstTimeout;var 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,setTimer=function(timeout){var myId=id,timerWins=function(){return id===myId};var d=new SingleAssignmentDisposable;timer.setDisposable(d);d.setDisposable(timeout.subscribe(function(){if(timerWins()){subscription.setDisposable(other.subscribe(observer))}d.dispose()},function(e){if(timerWins()){observer.onError(e)}},function(){if(timerWins()){subscription.setDisposable(other.subscribe(observer))}}))};setTimer(firstTimeout);var observerWins=function(){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(timeout)}},function(e){if(observerWins()){observer.onError(e)}},function(){if(observerWins()){observer.onCompleted()}}));return new CompositeDisposable(subscription,timer)})};observableProto.throttleWithSelector=function(throttleDurationSelector){var source=this;return new AnonymousObservable(function(observer){var value,hasValue=false,cancelable=new SerialDisposable,id=0,subscription=source.subscribe(function(x){var throttle;try{throttle=throttleDurationSelector(x)}catch(e){observer.onError(e);return}hasValue=true;value=x;id++;var currentid=id,d=new SingleAssignmentDisposable;cancelable.setDisposable(d);d.setDisposable(throttle.subscribe(function(){if(hasValue&&id===currentid){observer.onNext(value)}hasValue=false;d.dispose()},observer.onError.bind(observer),function(){if(hasValue&&id===currentid){observer.onNext(value)}hasValue=false;d.dispose()}))},function(e){cancelable.dispose();observer.onError(e);hasValue=false;id++},function(){cancelable.dispose();if(hasValue){observer.onNext(value)}observer.onCompleted();hasValue=false;id++});return new CompositeDisposable(subscription,cancelable)})};observableProto.skipLastWithTime=function(duration,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);var source=this;return new AnonymousObservable(function(observer){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){observer.onNext(q.shift().value)}},observer.onError.bind(observer),function(){var now=scheduler.now();while(q.length>0&&now-q[0].interval>=duration){observer.onNext(q.shift().value)}observer.onCompleted()})})};observableProto.takeLastWithTime=function(duration,timerScheduler,loopScheduler){return this.takeLastBufferWithTime(duration,timerScheduler).selectMany(function(xs){return observableFromArray(xs,loopScheduler)})};observableProto.takeLastBufferWithTime=function(duration,scheduler){var source=this;isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){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()}},observer.onError.bind(observer),function(){var now=scheduler.now(),res=[];while(q.length>0){var next=q.shift();if(now-next.interval<=duration){res.push(next.value)}}observer.onNext(res);observer.onCompleted()})})};observableProto.takeWithTime=function(duration,scheduler){var source=this;isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){return new CompositeDisposable(scheduler.scheduleWithRelative(duration,observer.onCompleted.bind(observer)),source.subscribe(observer))})};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)))})};observableProto.skipUntilWithTime=function(startTime,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);var source=this,schedulerMethod=startTime instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new AnonymousObservable(function(observer){var open=false;return new CompositeDisposable(scheduler[schedulerMethod](startTime,function(){open=true}),source.subscribe(function(x){open&&observer.onNext(x)},observer.onError.bind(observer),observer.onCompleted.bind(observer)))})};observableProto.takeUntilWithTime=function(endTime,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);var source=this,schedulerMethod=endTime instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new AnonymousObservable(function(observer){return new CompositeDisposable(scheduler[schedulerMethod](endTime,function(){observer.onCompleted()}),source.subscribe(observer))})};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})};observableProto.exclusiveMap=function(selector,thisArg){var sources=this;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=selector.call(thisArg,x,index++,innerSource)}catch(e){observer.onError(e);return}observer.onNext(result)},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(g.length===1&&!hasCurrent){observer.onCompleted()}}));return g})};Rx.VirtualTimeScheduler=function(_super){function notImplemented(){throw new Error("Not implemented")}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(){var next;if(!this.isEnabled){this.isEnabled=true;do{next=this.getNext();if(next!==null){if(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 next;var dueToClock=this.comparer(this.clock,time);if(this.comparer(this.clock,time)>0){throw new Error(argumentOutOfRange)}if(dueToClock===0){return}if(!this.isEnabled){this.isEnabled=true;do{next=this.getNext();if(next!==null&&this.comparer(next.dueTime,time)<=0){if(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);var dueToClock=this.comparer(this.clock,dt);if(dueToClock>0){throw new Error(argumentOutOfRange)}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 Error(argumentOutOfRange)}this.clock=dt};VirtualTimeSchedulerPrototype.getNext=function(){var next;while(this.queue.length>0){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,run=function(scheduler,state1){self.queue.remove(si);return action(scheduler,state1)},si=new ScheduledItem(self,state,run,dueTime,self.comparer);self.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){if(typeof subscriber==="undefined"){subscriber=disposableEmpty}else if(typeof subscriber==="function"){subscriber=disposableCreate(subscriber)}return subscriber}function AnonymousObservable(subscribe){if(!(this instanceof AnonymousObservable)){return new AnonymousObservable(subscribe)}function s(observer){var setDisposable=function(){try{autoDetachObserver.setDisposable(fixSubscriber(subscribe(autoDetachObserver)))}catch(e){if(!autoDetachObserver.fail(e)){throw e}}};var autoDetachObserver=new AutoDetachObserver(observer);if(currentThreadScheduler.scheduleRequired()){currentThreadScheduler.schedule(setDisposable)}else{setDisposable()}return autoDetachObserver}__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 noError=false;try{this.observer.onNext(value);noError=true}catch(e){throw e}finally{if(!noError){this.dispose()}}};AutoDetachObserverPrototype.error=function(exn){try{this.observer.onError(exn)}catch(e){throw e}finally{this.dispose()}};AutoDetachObserverPrototype.completed=function(){try{this.observer.onCompleted()}catch(e){throw e}finally{this.dispose()}};AutoDetachObserverPrototype.setDisposable=function(value){this.m.setDisposable(value)};AutoDetachObserverPrototype.getDisposable=function(value){return this.m.getDisposable()};AutoDetachObserverPrototype.disposable=function(value){return arguments.length?this.getDisposable():setDisposable(value)};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.call(this);if(!this.isStopped){this.observers.push(observer);return new InnerSubscription(this,observer)}if(this.exception){observer.onError(this.exception);return disposableEmpty}observer.onCompleted();return disposableEmpty}inherits(Subject,_super);function Subject(){_super.call(this,subscribe);this.isDisposed=false,this.isStopped=false,this.observers=[]}addProperties(Subject.prototype,Observer,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;for(var i=0,len=os.length;i<len;i++){os[i].onCompleted()}this.observers=[]}},onError:function(exception){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;this.exception=exception;for(var i=0,len=os.length;i<len;i++){os[i].onError(exception)}this.observers=[]}},onNext:function(value){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);for(var i=0,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.call(this);if(!this.isStopped){this.observers.push(observer);return new InnerSubscription(this,observer)}var ex=this.exception,hv=this.hasValue,v=this.value;if(ex){observer.onError(ex)}else if(hv){observer.onNext(v);observer.onCompleted()}else{observer.onCompleted()}return disposableEmpty}inherits(AsyncSubject,_super);function AsyncSubject(){_super.call(this,subscribe);this.isDisposed=false;this.isStopped=false;this.value=null;this.hasValue=false;this.observers=[];this.exception=null}addProperties(AsyncSubject.prototype,Observer,{hasObservers:function(){checkDisposed.call(this);return this.observers.length>0},onCompleted:function(){var o,i,len;checkDisposed.call(this);if(!this.isStopped){this.isStopped=true;var os=this.observers.slice(0),v=this.value,hv=this.hasValue;if(hv){for(i=0,len=os.length;i<len;i++){o=os[i];o.onNext(v);o.onCompleted()}}else{for(i=0,len=os.length;i<len;i++){os[i].onCompleted()}}this.observers=[]}},onError:function(exception){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;this.exception=exception;for(var i=0,len=os.length;i<len;i++){os[i].onError(exception)}this.observers=[]}},onNext:function(value){checkDisposed.call(this);if(!this.isStopped){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=function(_super){inherits(AnonymousSubject,_super);function subscribe(observer){return this.observable.subscribe(observer)}function AnonymousSubject(observer,observable){_super.call(this,subscribe);this.observer=observer;this.observable=observable}addProperties(AnonymousSubject.prototype,Observer,{onCompleted:function(){this.observer.onCompleted()},onError:function(exception){this.observer.onError(exception)},onNext:function(value){this.observer.onNext(value)}});return AnonymousSubject}(Observable);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}}).call(this)}).call(this,require("/home/admin/browserify-cdn/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"),typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"/home/admin/browserify-cdn/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":2}],4:[function(require,module,exports){(function(global){(function(factory){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}if(typeof define==="function"&&define.amd){define(["rx.virtualtime","exports"],function(Rx,exports){root.Rx=factory(root,exports,Rx);return root.Rx})}else if(typeof module==="object"&&module&&module.exports===freeExports){module.exports=factory(root,module.exports,require("./rx.all"))}else{root.Rx=factory(root,{},root.Rx)}}).call(this,function(root,exp,Rx,undefined){var Observer=Rx.Observer,Observable=Rx.Observable,Notification=Rx.Notification,VirtualTimeScheduler=Rx.VirtualTimeScheduler,Disposable=Rx.Disposable,disposableEmpty=Disposable.empty,disposableCreate=Disposable.create,CompositeDisposable=Rx.CompositeDisposable,SingleAssignmentDisposable=Rx.SingleAssignmentDisposable,slice=Array.prototype.slice,inherits=Rx.internals.inherits,defaultComparer=Rx.internals.isEqual;function argsOrArray(args,idx){return args.length===1&&Array.isArray(args[idx])?args[idx]:slice.call(args)}function OnNextPredicate(predicate){this.predicate=predicate}OnNextPredicate.prototype.equals=function(other){if(other===this){return true}if(other==null){return false}if(other.kind!=="N"){return false}return this.predicate(other.value)};function OnErrorPredicate(predicate){this.predicate=predicate}OnErrorPredicate.prototype.equals=function(other){if(other===this){return true}if(other==null){return false}if(other.kind!=="E"){return false}return this.predicate(other.exception)};var ReactiveTest=Rx.ReactiveTest={created:100,subscribed:200,disposed:1e3,onNext:function(ticks,value){if(typeof value==="function"){return new Recorded(ticks,new OnNextPredicate(value))}return new Recorded(ticks,Notification.createOnNext(value))},onError:function(ticks,exception){if(typeof exception==="function"){return new Recorded(ticks,new OnErrorPredicate(exception))}return new Recorded(ticks,Notification.createOnError(exception))},onCompleted:function(ticks){return new Recorded(ticks,Notification.createOnCompleted())},subscribe:function(start,end){return new Subscription(start,end)}};var Recorded=Rx.Recorded=function(time,value,comparer){this.time=time;this.value=value;this.comparer=comparer||defaultComparer};Recorded.prototype.equals=function(other){return this.time===other.time&&this.comparer(this.value,other.value)};Recorded.prototype.toString=function(){return this.value.toString()+"@"+this.time};var Subscription=Rx.Subscription=function(start,end){this.subscribe=start;this.unsubscribe=end||Number.MAX_VALUE};Subscription.prototype.equals=function(other){return this.subscribe===other.subscribe&&this.unsubscribe===other.unsubscribe};Subscription.prototype.toString=function(){return"("+this.subscribe+", "+this.unsubscribe===Number.MAX_VALUE?"Infinite":this.unsubscribe+")"};var MockDisposable=Rx.MockDisposable=function(scheduler){this.scheduler=scheduler;this.disposes=[];this.disposes.push(this.scheduler.clock)};MockDisposable.prototype.dispose=function(){this.disposes.push(this.scheduler.clock)};var MockObserver=function(_super){inherits(MockObserver,_super);function MockObserver(scheduler){_super.call(this);this.scheduler=scheduler;this.messages=[]}var MockObserverPrototype=MockObserver.prototype;MockObserverPrototype.onNext=function(value){this.messages.push(new Recorded(this.scheduler.clock,Notification.createOnNext(value)))};MockObserverPrototype.onError=function(exception){this.messages.push(new Recorded(this.scheduler.clock,Notification.createOnError(exception)))};MockObserverPrototype.onCompleted=function(){this.messages.push(new Recorded(this.scheduler.clock,Notification.createOnCompleted()))};return MockObserver}(Observer);var HotObservable=function(_super){function subscribe(observer){var observable=this;this.observers.push(observer);this.subscriptions.push(new Subscription(this.scheduler.clock));var index=this.subscriptions.length-1;return disposableCreate(function(){var idx=observable.observers.indexOf(observer);observable.observers.splice(idx,1);observable.subscriptions[index]=new Subscription(observable.subscriptions[index].subscribe,observable.scheduler.clock)})}inherits(HotObservable,_super);function HotObservable(scheduler,messages){_super.call(this,subscribe);var message,notification,observable=this;this.scheduler=scheduler;this.messages=messages;this.subscriptions=[];this.observers=[];for(var i=0,len=this.messages.length;i<len;i++){message=this.messages[i];notification=message.value;(function(innerNotification){scheduler.scheduleAbsoluteWithState(null,message.time,function(){var obs=observable.observers.slice(0);for(var j=0,jLen=obs.length;j<jLen;j++){innerNotification.accept(obs[j])}return disposableEmpty})})(notification)}}return HotObservable}(Observable);var ColdObservable=function(_super){function subscribe(observer){var message,notification,observable=this;this.subscriptions.push(new Subscription(this.scheduler.clock));var index=this.subscriptions.length-1;var d=new CompositeDisposable;for(var i=0,len=this.messages.length;i<len;i++){message=this.messages[i];notification=message.value;(function(innerNotification){d.add(observable.scheduler.scheduleRelativeWithState(null,message.time,function(){innerNotification.accept(observer);return disposableEmpty}))})(notification)}return disposableCreate(function(){observable.subscriptions[index]=new Subscription(observable.subscriptions[index].subscribe,observable.scheduler.clock);d.dispose()})}inherits(ColdObservable,_super);function ColdObservable(scheduler,messages){_super.call(this,subscribe);this.scheduler=scheduler;this.messages=messages;this.subscriptions=[]}return ColdObservable}(Observable);Rx.TestScheduler=function(_super){inherits(TestScheduler,_super);function baseComparer(x,y){return x>y?1:x<y?-1:0}function TestScheduler(){_super.call(this,0,baseComparer)}TestScheduler.prototype.scheduleAbsoluteWithState=function(state,dueTime,action){if(dueTime<=this.clock){dueTime=this.clock+1}return _super.prototype.scheduleAbsoluteWithState.call(this,state,dueTime,action)};TestScheduler.prototype.add=function(absolute,relative){return absolute+relative};TestScheduler.prototype.toDateTimeOffset=function(absolute){return new Date(absolute).getTime()};TestScheduler.prototype.toRelative=function(timeSpan){return timeSpan};TestScheduler.prototype.startWithTiming=function(create,created,subscribed,disposed){var observer=this.createObserver(),source,subscription;this.scheduleAbsoluteWithState(null,created,function(){source=create();return disposableEmpty});this.scheduleAbsoluteWithState(null,subscribed,function(){subscription=source.subscribe(observer);return disposableEmpty});this.scheduleAbsoluteWithState(null,disposed,function(){subscription.dispose();return disposableEmpty});this.start();return observer};TestScheduler.prototype.startWithDispose=function(create,disposed){return this.startWithTiming(create,ReactiveTest.created,ReactiveTest.subscribed,disposed)};TestScheduler.prototype.startWithCreate=function(create){return this.startWithTiming(create,ReactiveTest.created,ReactiveTest.subscribed,ReactiveTest.disposed)};TestScheduler.prototype.createHotObservable=function(){var messages=argsOrArray(arguments,0);return new HotObservable(this,messages)};TestScheduler.prototype.createColdObservable=function(){var messages=argsOrArray(arguments,0);return new ColdObservable(this,messages)};TestScheduler.prototype.createObserver=function(){return new MockObserver(this)};return TestScheduler}(VirtualTimeScheduler);return Rx})}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./rx.all":3}],"Vc+y1C":[function(require,module,exports){var Rx=require("./dist/rx.all");require("./dist/rx.testing");var EventEmitter=require("events").EventEmitter,Observable=Rx.Observable;Rx.Node={fromCallback:function(func,scheduler,context,selector){return Observable.fromCallback(func,scheduler,context,selector)},fromNodeCallback:function(func,scheduler,context,selector){return Observable.fromNodeCallback(func,scheduler,context,selector)},fromEvent:function(eventEmitter,eventName,selector){return Observable.fromEvent(eventEmitter,eventName,selector)},toEventEmitter:function(observable,eventName,selector){var e=new EventEmitter;selector||(selector=function(x){return x});e.publish=function(){e.subscription=observable.subscribe(function(x){e.emit(eventName,selector(x))},function(err){e.emit("error",err)},function(){e.emit("end")})};return e},fromStream:function(stream){return Observable.create(function(observer){function dataHandler(data){observer.onNext(data) | |
}function errorHandler(err){observer.onError(err)}function endHandler(){observer.onCompleted()}stream.addListener("data",dataHandler);stream.addListener("error",errorHandler);stream.addListener("end",endHandler);return function(){stream.removeListener("data",dataHandler);stream.removeListener("error",errorHandler);stream.removeListener("end",endHandler)}}).publish().refCount()},writeToStream:function(observable,stream,encoding){return observable.subscribe(function(x){stream.write(x,encoding)},function(err){stream.emit("error",err)},function(){!stream._isStdio&&stream.end()})}};module.exports=Rx},{"./dist/rx.all":3,"./dist/rx.testing":4,events:1}],rx:[function(require,module,exports){module.exports=require("Vc+y1C")},{}]},{},[]);var Rx=require("rx");window.Rx=Rx;!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),(f.falkor||(f.falkor={})).PathEvaluator=e()}}(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(_dereq_,module,exports){var Rx=_dereq_("../src/rx.ultralite");var Observable=Rx.Observable,Disposable=Rx.Disposable,sentinelSize=50,isArray=Array.isArray;var µTime=1,µRate=.25,µSize=.25,MIN_SAFE_INTEGER=-Math.pow(2,53)-1;PathEvaluator.internals={getPaths:getPaths,setPaths:setPaths,setPBF:setPBF,setPBFRoot:setPBFRoot,setPathsRoot:setPathsRoot,stringify:stringify};PathEvaluator.EXPIRES_NOW=0;PathEvaluator.EXPIRES_NEVER=1;PathEvaluator.lazy=true;PathEvaluator.connected=true;PathEvaluator.streaming=true;PathEvaluator.refreshing=false;PathEvaluator.prototype.get=get;PathEvaluator.prototype.set=set;PathEvaluator.prototype.call=call;PathEvaluator.prototype.invalidate=invalidate;PathEvaluator.prototype.value=value;PathEvaluator.prototype.optimize=optimize;PathEvaluator.prototype.context=context;PathEvaluator.prototype.insert=insert;PathEvaluator.prototype.getValueSync=value;PathEvaluator.prototype.setValueSync=insert;PathEvaluator.prototype.bind=bind;PathEvaluator.prototype.hardBind=hardBind;PathEvaluator.prototype.deferBind=deferBind;PathEvaluator.prototype.serialize=serialize;PathEvaluator.prototype.deserialize=immediateToLazy(deserialize);PathEvaluator.prototype.toBatched=toBatched;PathEvaluator.prototype.toIndependent=toIndependent;PathEvaluator.prototype.toLazy=toLazy;PathEvaluator.prototype.toEager=toEager;PathEvaluator.prototype.toRemote=toRemote;PathEvaluator.prototype.toLocal=toLocal;PathEvaluator.prototype.toProgressive=toProgressive;PathEvaluator.prototype.toAggregate=toAggregate;PathEvaluator.prototype.toCached=toCached;PathEvaluator.prototype.toRefreshed=toRefreshed;function PathEvaluator(maxSize,loader,cache,lazy,batches,streaming,connected,refreshing){this.loader=loader||{get:function(){return Observable.create(function(o){o.onCompleted();return function(){}})}};if(typeof maxSize!=="number"){throw new Error("PathEvaluator: maxSize must be a number.")}this.maxSize=maxSize;this.cache=cache||{};this.path=[];this.timeExpireList=[];this.sizeExpireList=[];this.root=this;this._batches=batches;this._lazy=lazy!==undefined?lazy:PathEvaluator.lazy;this._streaming=streaming!==undefined?streaming:PathEvaluator.streaming;this._connected=connected!==undefined?connected:PathEvaluator.connected;this._refreshing=refreshing!==undefined?refreshing:PathEvaluator.refreshing;return this}function toBatched(newBatch){if(this._batches==null)delete this._batches;return this._batches!==undefined&&newBatch===undefined?this:clone(this,undefined,newBatch||[])}function toIndependent(){return this._batches===undefined?this:clone(this,undefined,null)}function toLazy(){return this._lazy===true?this:clone(this,undefined,undefined,true)}function toEager(){return this._lazy===false?this:clone(this,undefined,undefined,false)}function toProgressive(){return this._streaming===true?this:clone(this,undefined,undefined,undefined,true)}function toAggregate(){return this._streaming===false?this:clone(this,undefined,undefined,undefined,false)}function toRemote(){return this._connected===true?this:clone(this,undefined,undefined,undefined,undefined,true)}function toLocal(){return this._connected===false?this:clone(this,undefined,undefined,undefined,undefined,false)}function toCached(){return this._refreshing===false?this:clone(this,undefined,undefined,undefined,undefined,undefined,false)}function toRefreshed(){return this._refreshing===true?this:clone(this,undefined,undefined,undefined,undefined,undefined,true)}function noop(){}function clone(evaluator,path,batches,lazy,streaming,connected,refreshing){var pe=Object.create(evaluator);if(path!==undefined)pe.path=path;if(batches!==undefined)pe._batches=batches;if(lazy!==undefined)pe._lazy=lazy;if(streaming!==undefined)pe._streaming=streaming;if(connected!==undefined)pe._connected=connected;if(refreshing!==undefined)pe._refreshing=refreshing;return pe}function immediateToLazy(immediateFn){return function lazyImpl(){var self=this,lazyArgs=args(arguments);return Observable.createWithDisposable(function(observer){return immediateFn.apply(self,lazyArgs.concat(self.context(),onNext,onError,onCompleted));function onNext(pbvf){if(self._streaming===false||pbvf===self){observer.onNext(pbvf)}else{var pbv={},path=pbvf.path,value=pbvf.value,i=-1,n=path.length,a=new Array(n);if(typeof value==="object"&&!Array.isArray(value)&&value!=null){value=Object.create(value)}pbv.value=value;while(++i<n){a[i]=path[i]}pbv.path=path;path=pbvf.optimized;i=-1;n=path.length;a=new Array(n);while(++i<n){a[i]=path[i]}pbv.optimized=a;observer.onNext(pbv)}}function onError(e){observer.onError(e)}function onCompleted(){observer.onCompleted()}})}}function args(list){for(var a=[],i=0,n=list.length;i<n;++i){a[i]=list[i]}return a}function serialize(cache){var frame,key,context=cache||this.cache,message={},depth=0,stack=[],keys;descending:while(depth>=0){frame=stack[depth]||(stack[depth]={context:context,message:message,keys:Object.keys(context).filter(internalKeys).sort()});context=frame.context;message=frame.message;keys=frame.keys;while(key=keys.shift()){context=context[key];if(context==null||Array.isArray(context)||typeof context!=="object"){message[key]=context;context=frame.context}else{message=message[key]||(message[key]={});++depth;continue descending}}stack[depth--]=undefined}return message;function internalKeys(x){return x.indexOf("__")!==0}}function deserialize(cache,pbv,onNext,onError,onCompleted){var self=this,frame,key,context=cache,depth=0,path=[],paths=[],stack=[],keys;descending:while(depth>=0){frame=stack[depth]||(stack[depth]={context:context,keys:Object.keys(context).filter(internalKeys).sort()});context=frame.context;keys=frame.keys;while(key=keys.shift()){path[depth]=key;context=context[key];if(context==null||Array.isArray(context)||typeof context!=="object"||context.$type!==undefined){context=frame.context;paths.push(path.slice(0,depth+1))}else{++depth;continue descending}}stack[depth--]=undefined}return setPBFRoot.call(self,{paths:paths,value:cache},noop,finished,finished);function internalKeys(x){return x[0]!=="$"&&x.indexOf("__")!==0}function finished(){onNext(self);onCompleted()}}function stringify(obj,replacer,space){return JSON.stringify(flatten(obj),replacer,space)}function flatten(obj){var flattenedObject,keys,keyCount,key;if(obj===null||typeof obj!=="object"){return obj}else if(obj instanceof Array){flattenedObject=[];for(keyCount=0;keyCount<obj.length;keyCount++){flattenedObject.push(flatten(obj[keyCount]))}return flattenedObject}else{flattenedObject={};do{keys=Object.keys(obj);keys.sort();for(keyCount=0;keyCount<keys.length;keyCount++){key=keys[keyCount];if(key.substring(0,2)!=="__"){flattenedObject[key]=flatten(obj[key])}}obj=Object.getPrototypeOf(obj)}while(obj!==undefined&&obj!==null);return flattenedObject}}function bind(path){var pe=clone(this,this.path.concat(path));pe._context=null;return pe}function hardBind(path){var branch=findPath.call(this,this.path.concat(path,null)),context=branch.value,backRefsLength,evaluator;if(context){evaluator=clone(this,branch.optimized);backRefsLength=context.__refsLength||0;context["__ref"+backRefsLength]=evaluator;context.__refsLength=backRefsLength+1;evaluator._context=context}else{evaluator=clone(this,this.path.concat(path))}return evaluator}function deferBind(path){var self=this;return Observable.create(function(observer){observer.onNext(self.hardBind(path));observer.onCompleted();return noop})}function get(){var a=args(arguments);if(this._lazy){if(this._refreshing){return refreshLazily.call(this,a)}return getLazily.call(this,a)}var pbv=this.context(),onNext=a[a.length-3],onError=a[a.length-2],onCompleted=a[a.length-1];a=a.slice(0,-3);if(this._refreshing){return refreshPaths.call(this,a,pbv,onNext,onError,onCompleted)}return getPaths.call(this,a,pbv,onNext,onError,onCompleted)}var getLazily=immediateToLazy(getPaths),refreshLazily=immediateToLazy(refreshPaths);function getPaths(paths,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};getting:for(;index<total;++index){original.length=0;path=paths[paths.index=index];last=path.length-1;column=path.index||(path.index=0);reset_refs();reset_cols();unlocking:while(column>=0){parent=contexts[column-1];descend();unlock();path.index=column=ascend(path,column,0);reset_refs();reset_cols()}path.index=0}paths.index=0;if(connected===true&&misses.length>0){return batch_or_load_paths()}finish();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function build_path_set(paths,pathSet,observer){var contexts=[],context,xs,index=-1,total=paths.length,path,column,last,obs;contexts[-1]=pathSet||(pathSet={__observers:[]});building:while(++index<total){path=paths[index];obs=observer||path.observer;last=path.length-1;column=0;unlocking:while(column>=0){context=contexts[column-1];(xs=context.__observers)[xs.length]=obs;for(;column<=last;++column){key=find_key(path[column]);if(key!=null){contexts[column]=context=context[key]||(context[key]={__observers:[]});(xs=context.__observers)[xs.length]=obs}}obs.paths=(obs.paths||0)+1;column=ascend(path,column,0)}}return pathSet}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}save_optimized(optimized,column,offset,key);if(interrupted===false){save_original(original,column,key)}if((context=find_context(parent,key))===undefined){short_circuit();break descending}value=find_value(context);if(isArray(value)){do{stamp();interrupt()}while(isArray(value=find_value(context)));type=undefined;continue descending}else if(type!==undefined){short_circuit();break descending}else if(interrupted===false){contexts[column]=context}type=undefined;parent=context;continue descending}if(key!=null){save_optimized(optimized,column,offset,key);context=find_leaf_context(parent,key)}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){short_circuit_int();break descending}reset_path_from_ref();contexts[column]=parent=context;if(isArray(value)){stamp();interrupt()}type=undefined;continue descending}save_original(original,column,key);break descending}}function unlock(){if(context==null){miss=save_missing();miss.observer=observer;misses[misses.length]=miss}else if(type==="error"){stamp();save_error()}else{stamp();if(streaming===true&&value!==undefined){pbv.value=value;onNext(pbv)}}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function interrupt(){refs[column]=ref=value;if((context=value._context)!==undefined){offset=reset_optimized_from_ref()-column-1;contexts[column]=parent=context}else{prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache;context=value=undefined}}function save_missing(){var i,j,nulls=0,n=optimized.length,miss=new Array(n+last-column);for(i=j=-1;++i<n;){key=optimized[i];if(key!=null){miss[++j]=key}else{--nulls}}i=column;while(++i<=last){key=path[i];if(key!=null){miss[++j]=key}else{--nulls}}miss.length+=nulls;return miss}function batch_or_load_paths(){var loadDisposable=Disposable.empty;if(batches===undefined){pathSet=build_path_set(misses,null,observer);misses=rangeCollapse(buildQueries(pathSet));loadDisposable=self.loader.get(misses).subscribe(function(pbf){pbf=Object.create(pbf);var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=errors;pbf.paths.pathSet=undefined;pbf.paths.observers=undefined;setPBFRoot.call(self,pbf,onNext,onError,onCompleted)},onError,noop);return loadDisposable}else{batch=batches[batches.length-1];if(batch===undefined||batch.pendingLoad===true){batch=Disposable.create(function(){var i=batches.indexOf(batch);if(i!==-1){batches.splice(i,1)}if(batch.batchID!==undefined){clearTimeout(batch.batchID);batch.batchID=undefined}if(batch.pendingLoad===true){loadDisposable.dispose()}batch.pendingLoad=false});batch.batchIndex=batches.length;batch.batchID=setTimeout(function(){var i=batches.indexOf(batch);if(i!==-1){batches.splice(i,1)}batch.batchID=undefined;batch.pendingLoad=true;batch.pathSet=build_path_set(batch.misses);batch.misses=rangeCollapse(buildQueries(batch.pathSet));loadDisposable=self.loader.get(batch.misses).subscribe(function(pbf){pbf=Object.create(pbf);batch.pendingLoad=false;var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=[];pbf.paths.pathSet=batch.pathSet;pbf.paths.observers=batch.observers.concat();setPBFRoot.call(self,pbf,noop,noop,noop)},onError,noop)},16);batch.pendingLoad=false;batches.push(batch)}var batchMisses=batch.misses||(batch.misses=[]);var batchObservers=batch.observers||(batch.observers=[]);batchMisses.push.apply(batchMisses,misses);batchObservers.push(observer);batch.pathSet=batch.pathSet||(batch.pathSet={__observers:[]});return Disposable.create(function(){var batchObservers=batch.observers,i=batchObservers.indexOf(observer);if(i!==-1){batchObservers.splice(i,1)}if(batchObservers.length===0){batch.dispose()}})}}function finish(){if(streaming===false&&onNext!==undefined){onNext({paths:paths,value:self.context().value})}if(errors.length>0&&onError!==undefined){onError({innerErrors:errors})}else if(onCompleted!==undefined){onCompleted()}}function save_error(){errors[errors.length]={optimized:optimized.concat(),path:original.concat(),value:value}}function short_circuit(){if(interrupted===true){short_circuit_int()}else{short_circuit_path()}}function short_circuit_path(){original.length=column+1;optimized.length=column+offset+1}function short_circuit_int(){path=prevs[0]||path;column=cols[0];last=path.length-1;original.length=column+2;original[column+1]=null;optimized.length=column+offset+1}}function refreshPaths(paths,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};getting:for(;index<total;++index){original.length=0;path=paths[paths.index=index];last=path.length-1;column=path.index||(path.index=0);reset_refs();reset_cols();unlocking:while(column>=0){parent=contexts[column-1];descend();unlock();path.index=column=ascend(path,column,0);reset_refs();reset_cols()}path.index=0}paths.index=0;if(connected===true){return batch_or_load_paths()}finish();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function build_path_set(paths,pathSet,observer){var contexts=[],context,xs,index=-1,total=paths.length,path,column,last,obs;contexts[-1]=pathSet||(pathSet={__observers:[]});building:while(++index<total){path=paths[index];obs=observer||path.observer;last=path.length-1;column=0;unlocking:while(column>=0){context=contexts[column-1];(xs=context.__observers)[xs.length]=obs;for(;column<=last;++column){key=find_key(path[column]);if(key!=null){contexts[column]=context=context[key]||(context[key]={__observers:[]});(xs=context.__observers)[xs.length]=obs}}obs.paths=(obs.paths||0)+1;column=ascend(path,column,0)}}return pathSet}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}save_optimized(optimized,column,offset,key);if(interrupted===false){save_original(original,column,key)}if((context=find_context(parent,key))===undefined){short_circuit();break descending}value=find_value(context);if(isArray(value)){do{stamp();interrupt()}while(isArray(value=find_value(context)));type=undefined;continue descending}else if(type!==undefined){short_circuit();break descending}else if(interrupted===false){contexts[column]=context}type=undefined;parent=context;continue descending}if(key!=null){save_optimized(optimized,column,offset,key);context=find_leaf_context(parent,key)}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){short_circuit_int();break descending}reset_path_from_ref();contexts[column]=parent=context;if(isArray(value)){stamp();interrupt()}type=undefined;continue descending}save_original(original,column,key);break descending}}function unlock(){miss=save_missing();miss.observer=observer;misses[misses.length]=miss;if(context!=null){if(type==="error"){stamp();save_error()}else{stamp();if(streaming===true&&value!==undefined){pbv.value=value;onNext(pbv)}}}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function interrupt(){refs[column]=ref=value;if((context=value._context)!==undefined){offset=reset_optimized_from_ref()-column-1;contexts[column]=parent=context}else{prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache;context=value=undefined}}function save_missing(){var i,j,nulls=0,n=optimized.length,miss=new Array(n+last-column);for(i=j=-1;++i<n;){key=optimized[i];if(key!=null){miss[++j]=key}else{--nulls}}i=column;while(++i<=last){key=path[i];if(key!=null){miss[++j]=key}else{--nulls}}miss.length+=nulls;return miss}function batch_or_load_paths(){var loadDisposable=Disposable.empty;if(batches===undefined){pathSet=build_path_set(misses,null,observer);misses=rangeCollapse(buildQueries(pathSet));loadDisposable=self.loader.get(misses).subscribe(function(pbf){pbf=Object.create(pbf);var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=errors;pbf.paths.pathSet=undefined;pbf.paths.observers=undefined;setPBFRoot.call(self,pbf,onNext,onError,onCompleted)},onError,noop);return loadDisposable}else{batch=batches[batches.length-1];if(batch===undefined||batch.pendingLoad===true){batch=Disposable.create(function(){var i=batches.indexOf(batch);if(i!==-1){batches.splice(i,1)}if(batch.batchID!==undefined){clearTimeout(batch.batchID);batch.batchID=undefined}if(batch.pendingLoad===true){loadDisposable.dispose()}batch.pendingLoad=false});batch.batchIndex=batches.length;batch.batchID=setTimeout(function(){var i=batches.indexOf(batch);if(i!==-1){batches.splice(i,1)}batch.batchID=undefined;batch.pendingLoad=true;batch.pathSet=build_path_set(batch.misses);batch.misses=rangeCollapse(buildQueries(batch.pathSet));loadDisposable=self.loader.get(batch.misses).subscribe(function(pbf){pbf=Object.create(pbf);batch.pendingLoad=false;var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=[];pbf.paths.pathSet=batch.pathSet;pbf.paths.observers=batch.observers.concat();setPBFRoot.call(self,pbf,noop,noop,noop)},onError,noop)},16);batch.pendingLoad=false;batches.push(batch)}var batchMisses=batch.misses||(batch.misses=[]);var batchObservers=batch.observers||(batch.observers=[]);batchMisses.push.apply(batchMisses,misses);batchObservers.push(observer);batch.pathSet=batch.pathSet||(batch.pathSet={__observers:[]});return Disposable.create(function(){var batchObservers=batch.observers,i=batchObservers.indexOf(observer);if(i!==-1){batchObservers.splice(i,1)}if(batchObservers.length===0){batch.dispose()}})}}function finish(){if(streaming===false&&onNext!==undefined){onNext({paths:paths,value:self.context().value})}if(errors.length>0&&onError!==undefined){onError({innerErrors:errors})}else if(onCompleted!==undefined){onCompleted()}}function save_error(){errors[errors.length]={optimized:optimized.concat(),path:original.concat(),value:value}}function short_circuit(){if(interrupted===true){short_circuit_int()}else{short_circuit_path()}}function short_circuit_path(){original.length=column+1;optimized.length=column+offset+1}function short_circuit_int(){path=prevs[0]||path;column=cols[0];last=path.length-1;original.length=column+2;original[column+1]=null;optimized.length=column+offset+1}}function set(){var a=args(arguments);if(this._lazy){if(this._streaming){return setPathsLazily.call(this,a)}return setPBFLazily.call(this,a[0])}var pbv=this.context(),onNext=a[a.length-3],onError=a[a.length-2],onCompleted=a[a.length-1];a=a.slice(0,-3);if(this._streaming){return setPaths.call(this,a,pbv,onNext,onError,onCompleted)}return setPBF.call(this,a[0].paths,a[0].value,pbv,onNext,onError,onCompleted)}var setPBFLazily=immediateToLazy(function(pbf,pbv,n,e,c){return setPBF.call(this,pbf.paths,pbf.value,pbv,n,e,c)});var setPathsLazily=immediateToLazy(setPaths);function setPBFRoot(pbf,onNext,onError,onCompleted){return setPBF.call(this,pbf.paths,pbf.value,{path:[],value:this.cache},onNext,onError,onCompleted)}function setPathsRoot(paths,onNext,onError,onCompleted){return setPaths.call(this,paths,{path:[],value:this.cache},onNext,onError,onCompleted)}function setPBF(paths,messageCache,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]); | |
errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};generations=paths.generations||(paths.generations=[]);generationsLen=generations.length;message=init_message(paths,paths.messages,messageCache);messages=paths.messages;pathSets=paths.pathSets||(paths.pathSets=[]);pathSets[-1]=pathSet=build_path_set(paths,paths.pathSet||{__observers:[]},observer);setting:for(;index<total;++index){original.length=0;path=paths[paths.index=index];last=path.length-1;column=path.index||(path.index=0);reset_refs();reset_cols();unlocking:while(column>=0){parent=contexts[column-1];messageParent=messages[column-1];pathSet=pathSets[column-1];descend();unlock();path.index=column=ascend(path,column,0);reset_refs();reset_cols()}path.index=0}paths.index=0;update_generations();finish(pathSet);cleanup();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function adjust_contexts(){context.__generation=(context.__generation||0)+1;do{context.$size=(context.$size||0)+sizeOffset;context=context.__parent}while(context!==undefined);context=parent[key];var stack=[],frame,refs,ref,depth=0,i,n;adjusting:while(depth>=0){if((frame=stack[depth])===undefined){i=-1;n=context.__refsLength||0;refs=[];while(++i<n){ref=context["__ref"+i];if(ref&&ref.__tagged===undefined){ref.__tagged=true;generations[generationsLen++]=refs[i]=ref}}if((ref=context.__parent)!==undefined&&ref.__tagged===undefined){ref.__tagged=true;generations[generationsLen++]=refs[i]=ref}frame=stack[depth]={context:context,refs:refs}}refs=frame.refs;if((context=refs[refs.length-1])!==undefined){refs.length-=1;++depth;continue adjusting}stack[depth--]=undefined}context=parent[key];sizeOffset=0}function update_generations(){var i=generations.length,ref;while((ref=generations[--i])!==undefined){ref.__tagged=undefined;ref.__generation=(ref.__generation||0)+1}generations.length=generationsLen=0}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function build_path_set(paths,pathSet,observer){var contexts=[],context,xs,index=-1,total=paths.length,path,column,last,obs;contexts[-1]=pathSet||(pathSet={__observers:[]});building:while(++index<total){path=paths[index];obs=observer||path.observer;last=path.length-1;column=0;unlocking:while(column>=0){context=contexts[column-1];(xs=context.__observers)[xs.length]=obs;for(;column<=last;++column){key=find_key(path[column]);if(key!=null){contexts[column]=context=context[key]||(context[key]={__observers:[]});(xs=context.__observers)[xs.length]=obs}}obs.paths=(obs.paths||0)+1;column=ascend(path,column,0)}}return pathSet}function check_observer_finished(observers,observer){var j;if(--observer.paths===0){if(observer.errors.length>0){observer.onError({innerErrors:observer.errors})}else{observer.onCompleted()}j=observers.indexOf(observer);if(j!==-1){observers.splice(j,1)}}}function descend(){var i,n;descending:for(;column<=last;++column){if(interrupted===false){key=find_key(path[column]);if(key!=null){save_original(original,column,key);pathSet=find_path_set();pathSets[column]=pathSet}else if(column<last){continue descending}else{save_original(original,column,key)}}else{key=path[column];if(key==null&&column<last){continue descending}}if(key!=null){save_optimized(optimized,column,offset,key);context=column<last?find_context():find_leaf_context();message=find_message();if(context===undefined||message===context){size=timestamp=0}else if(message_value_is_leaf()||interrupted===false&&column===last){replace_context(message)}if(context===undefined){if(message===undefined){short_circuit();insert_missing_sentinel();break descending}else{if(message==null){messageExpires=messageTimestamp=2}else{messageTimestamp=message.$timestamp;messageExpires=message.$expires}if(messageTimestamp<timestamp){short_circuit();value=find_value(context);context=undefined;break descending}else if(messageExpires===EXPIRES_NOW){short_circuit();value=find_message_value();context=undefined;break descending}else if(column<last){if(message_value_is_leaf()){insert_message()}else{insert_empty_branch()}}else if(interrupted===true){insert_empty_branch();reset_path_from_ref();contexts[column]=parent=context;messages[column]=messageParent=message;type=undefined;continue descending}else{insert_message();break descending}}}else if(typeof context==="object"){link_context()}}if(isArray(find_value())){stamp();interrupt();messageParent=messageCache;type=undefined;continue descending}else if(type!==undefined){short_circuit();break descending}else if(interrupted===false){contexts[column]=context;messages[column]=message}else if(column===last){if(context===undefined||type==="error"){short_circuit();break descending}reset_path_from_ref();contexts[column]=parent=context;messages[column]=messageParent=message;if(isArray(value)){stamp();interrupt();messageParent=messageCache}type=undefined;continue descending}parent=context;messageParent=message}}function find_message(){return messageParent&&messageParent[key]}function find_message_value(){return messageValue=message!==undefined&&find_message_type()==="sentinel"?message.value:message}function find_message_size(){messageSize=1;if(message_value_has_length()){messageSize=messageValue.length}else if(message!==messageValue&&typeofMessageValue==="object"&&messageValue!==null){messageSize=0}if(messageType!==undefined){messageSize+=sentinelSize}else if(message_value_is_primitive()){messageType="sentinel";messageSize+=sentinelSize;message={$type:messageType,value:messageValue}}else if(!message_value_is_array()){messageSize=message.$size||sentinelSize}type=messageType;return messageSize}function find_message_type(){return messageType=message&&message.$type||undefined}function find_path_set(){return pathSet[key]}function finish(pathSet){var x=observers.concat(),i=-1,n=x.length;while(++i<n){if((observer=x[i]).streaming===false){observer.onNext({paths:observer.misses,value:findPath.call(self,observer.path,self.cache).value})}if(observer.errors.length>0){observer.onError({innerErrors:observer.errors})}else{observer.onCompleted()}}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function init_message(paths,messages,message){return messages===undefined?(paths.messages=[])[-1]=message:messages[-1]}function init_stamp(){sizeExpireList[sizeExpireListLength++]=context;expires=context.$expires;if(expires!==undefined&&expires!==EXPIRES_NEVER&&expires!==EXPIRES_NOW){if(expires<0){expires=now+expires*-1}context.$expires=expires}stamp()}function insert_missing_sentinel(){messageSize=sentinelSize+1;messageValue=value=undefined;messageType=type="sentinel";message={$type:messageType,value:messageValue};sizeOffset+=messageSize;parent[key]=context=message;link_context();adjust_contexts()}function insert_empty_branch(){parent[key]=context={$size:0};link_context()}function insert_message(){value=find_message_value();messageSize=find_message_size();message.$size=size;sizeOffset+=messageSize-size;parent[key]=context=message;link_context();adjust_contexts();context.$type=type=type||"leaf";if(context.__access_time===undefined){init_stamp()}else{stamp()}}function interrupt(){refs[column]=value;prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache}function link_context(){context.__parent=parent;context.__key=key}function message_value_is_leaf(){return message_value_is_primitive()||message_value_is_array()}function message_value_has_length(){return typeof_message_value()==="string"||message_value_is_array()}function message_value_is_array(){return isArray(messageValue)&&(typeofMessageValue="array")}function message_value_is_primitive(){return messageValueIsPrimitive=typeof_message_value()!=="object"||messageValue===null}function replace_context(message){size=context.$size||0;timestamp=context.$timestamp||0;if(message!=null){migrate_references(context,message)}if(isArray(value)){delete_hard_link(context)}context=undefined}function migrate_references(context,message){var mBackRefs=message.__refsLength||0,cBackRefs=context.__refsLength||0,refs=-1,refKey,ref;while(++refs<cBackRefs){refKey="__ref"+refs;ref=context[refKey];ref._context=message;message["__ref"+(mBackRefs+refs)]=ref;delete context[refKey]}}function delete_hard_link(reference){var destination=reference._context;if(destination!=null){var refIndex=(reference.__refIndex||0)-1,refsLen=(destination.__refsLength||0)-1;while(++refIndex<=refsLen){destination["__ref"+refIndex]=destination["__ref"+refIndex+1]}destination.__refsLength=refsLen;if(refsLen<0){delete destination.__ref0;delete destination.__refsLength}delete reference.__refIndex;delete reference._context}}function short_circuit(){if(interrupted===true){short_circuit_int()}else{short_circuit_path()}}function short_circuit_path(){original.length=column+1;optimized.length=column+offset+1}function short_circuit_int(){path=prevs[0]||path;column=cols[0];last=path.length-1;original.length=column+2;original[column+1]=null;optimized.length=column+offset+1}function typeof_message_value(){return typeofMessageValue=typeof find_message_value()}function unlock(){var i,n,x;if(type==="error"){var error={optimized:optimized.concat(),path:original.concat(),value:value};for(i=-1,x=pathSet.__observers,n=x.length;++i<n;){observer=x[i];if(observers.indexOf(observer)!==-1){errors=observer.errors;errors[errors.length]=error;if(observer.streaming===true){check_observer_finished(observers,observer)}}}}else{if(value!==undefined||type==="sentinel"&&column<last){pbv.value=value;for(i=-1,x=pathSet.__observers,n=x.length;++i<n;){observer=x[i];if(observers.indexOf(observer)!==-1){if(observer.streaming===true){observer.onNext(pbv);check_observer_finished(observers,observer)}}}x.length=0}}}}function setPaths(paths,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};generations=paths.generations||(paths.generations=[]);generationsLen=generations.length;cache=context;for(;index<total;++index){pbv=paths[paths.index=index];pbv.path.generations=generations;pbv=this.insert(pbv,cache);value=find_value(context=pbv.value);unlock()}paths.index=0;update_generations();finish();cleanup();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function update_generations(){var i=generations.length,ref;while((ref=generations[--i])!==undefined){ref.__tagged=undefined;ref.__generation=(ref.__generation||0)+1}generations.length=generationsLen=0}function finish(){if(streaming===false&&onNext!==undefined){onNext({paths:paths,value:self.context().value})}if(errors.length>0&&onError!==undefined){onError({innerErrors:errors})}else if(onCompleted!==undefined){onCompleted()}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function unlock(){if(type==="error"){errors[errors.length]={optimized:pbv.optimized.concat(),path:pbv.path.concat(),value:value}}else{if(streaming===true&&(value!==undefined||type==="sentinel"&&column<last)){pbv.value=value;onNext(pbv)}}}}function invalidate(){var a=args(arguments);if(this._lazy){return invalidateLazily.call(this,a)}var pbv=this.context(),onNext=a[a.length-3],onError=a[a.length-2],onCompleted=a[a.length-1];a=a.slice(0,-3);return invalidatePaths.call(this,a,pbv,onNext,onError,onCompleted)}var invalidateLazily=immediateToLazy(invalidatePaths);function invalidatePaths(paths,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};invalidating:for(;index<total;++index){path=paths[paths.index=index];last=path.length-1;column=path.index||(path.index=0);reset_cols();unlocking:while(column>=0){parent=contexts[column-1];descend();unlock();path.index=column=ascend(path,column,0);reset_cols()}path.index=0}paths.index=0;cleanup();onNext(self);onCompleted();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}if((context=find_context(parent,key))===undefined){break descending}value=find_value(context);if(isArray(value)){do{interrupt()}while(isArray(value=find_value(context)));type=undefined;continue descending}else if(type!==undefined){break descending}else if(interrupted===false){contexts[column]=context}type=undefined;parent=context;continue descending}if(key!=null){context=find_context(parent,key)}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){break descending}reset_path_from_ref();contexts[column]=parent=context;if(isArray(value)){interrupt()}type=undefined;continue descending}break descending}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function interrupt(){refs[column]=ref=value;if((context=value._context)!==undefined){contexts[column]=parent=context}else{prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;column=-1;parent=cache;context=value=undefined}}function unlock(){var x;if(context!==undefined){sizeOffset=context.$size;do{x=context.__parent;if((context.$size-=sizeOffset)<=0&&context!==cache){context.__invalidated=true;if(x!==undefined){delete x[context.__key];delete context.__parent}}}while((context=x)!==undefined);context=parent[key];sizeOffset=0}}}function optimize(path,cache){var pbv=findPath.call(this,this.path.concat(path||[]),cache);return pbv?pbv.optimized:path}function value(path,cache){var pbv=findPath.call(this,this.path.concat(path||[]),cache);return pbv?pbv.value:null}function context(path,cache){return this._context?{path:this.path.concat(),value:this._context}:findPath.call(this,this.path.concat(path),cache)}function findPath(the_path,from_cache){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;now=Date.now();cache=from_cache||this.cache;path=the_path;refs=[];cols=[];prevs=[];interrupts=0;interrupted=false;original=[];optimized=[];var pbv={path:original,optimized:optimized};last=path.length-1;column=offset=0;parent=context=value=cache;descend();unlock();return pbv;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}save_optimized(optimized,column,offset,key);if(interrupted===false){save_original(original,column,key)}if((context=find_context(parent,key))===undefined){short_circuit();break descending}value=find_value(context);if(isArray(value)){do{stamp();interrupt()}while(isArray(value=find_value(context)));type=undefined;continue descending}else if(type!==undefined){short_circuit();break descending}type=undefined;parent=context;continue descending}if(key!=null){save_optimized(optimized,column,offset,key);save_original(original,column,key);context=find_leaf_context(parent,key)}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){short_circuit_int();break descending}reset_path_from_ref();parent=context;if(isArray(value)){interrupt()}type=undefined;continue descending}break descending}}function interrupt(){refs[column]=ref=value;if((context=value._context)!==undefined){offset=reset_optimized_from_ref()-column-1;parent=context}else{prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache;context=value=undefined}}function save_missing(){var i,j,nulls=0,n=optimized.length,miss=new Array(n+last-column);for(i=j=-1;++i<n;){key=optimized[i];if(key!=null){miss[++j]=key}else{--nulls}}i=column;while(++i<=last){key=path[i];if(key!=null){miss[++j]=key}else{--nulls}}miss.length+=nulls;return miss}function short_circuit(){if(interrupted===true){short_circuit_int()}else{optimized.length=column+offset+1}}function short_circuit_path(){original.length=column+1;optimized.length=column+offset+1}function short_circuit_int(){path=prevs[0]||path;column=cols[0];last=path.length-1;optimized.length=column+offset+1}function unlock(){if(context==null){pbv.value=undefined;pbv.optimized=save_missing()}else{stamp();pbv.value=value}}}function insert(pathOrPBV,value,cache){var path;if(arguments.length===1){value=pathOrPBV.value;path=pathOrPBV.path}else if(arguments.length===2&&pathOrPBV.path!==undefined){cache=value;value=pathOrPBV.value;path=pathOrPBV.path}else{path=pathOrPBV}var generations=path.generations||[];path=this.path.concat(path);path.generations=generations;var pbv=setPath.call(this,path,value,cache||this.cache),generationsLen=generations.length;update_generations();return pbv;function update_generations(){var i=generations.length,ref;while((ref=generations[--i])!==undefined){ref.__tagged=undefined;ref.__generation=(ref.__generation||0)+1}generations.length=generationsLen=0}}function setPath(the_path,newValue,from_cache){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss; | |
var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;cache=from_cache||this.cache;path=the_path;refs=[];cols=[];prevs=[];interrupts=0;interrupted=false;original=[];optimized=[];generations=path.generations||[];generationsLen=generations.length;var pbv={path:original,optimized:optimized};now=Date.now();parent=context=value=cache;message=newValue;last=path.length-1;column=offset=0;descend();unlock();pbv.value=value;return pbv;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function adjust_contexts(){context.__generation=(context.__generation||0)+1;do{context.$size=(context.$size||0)+sizeOffset;context=context.__parent}while(context!==undefined);context=parent[key];var stack=[],frame,refs,ref,depth=0,i,n;adjusting:while(depth>=0){if((frame=stack[depth])===undefined){i=-1;n=context.__refsLength||0;refs=[];while(++i<n){ref=context["__ref"+i];if(ref&&ref.__tagged===undefined){ref.__tagged=true;generations[generationsLen++]=refs[i]=ref}}if((ref=context.__parent)!==undefined&&ref.__tagged===undefined){ref.__tagged=true;generations[generationsLen++]=refs[i]=ref}frame=stack[depth]={context:context,refs:refs}}refs=frame.refs;if((context=refs[refs.length-1])!==undefined){refs.length-=1;++depth;continue adjusting}stack[depth--]=undefined}context=parent[key];sizeOffset=0}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}save_optimized(optimized,column,offset,key);if(interrupted===false){save_original(original,column,key)}if((context=find_context(parent,key))===undefined){insert_empty_branch()}value=find_value(context);if(isArray(value)){interrupt();type=undefined;continue descending}else if(type!==undefined){insert_empty_branch()}type=undefined;parent=context;continue descending}if(key!=null){save_optimized(optimized,column,offset,key);context=find_leaf_context(parent,key);if(interrupted===false){if(context===undefined){size=0}else{replace_context(message)}insert_message();if(interrupted===false&&type===undefined){context.$type=type="leaf"}}}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){insert_empty_branch()}reset_path_from_ref();parent=context;if(isArray(value)){interrupt()}type=undefined;continue descending}save_original(original,column,key);break descending}}function find_message(){return messageParent&&messageParent[key]}function find_message_value(){return messageValue=message!==undefined&&find_message_type()==="sentinel"?message.value:message}function find_message_type(){return messageType=message&&message.$type||undefined}function find_message_size(){messageSize=1;if(message_value_has_length()){messageSize=messageValue.length}else if(message!==messageValue&&typeofMessageValue==="object"&&messageValue!==null){messageSize=0}if(messageType!==undefined){messageSize+=sentinelSize}else if(message_value_is_primitive()){messageType="sentinel";messageSize+=sentinelSize;message={$type:messageType,value:messageValue}}else if(!message_value_is_array()){messageSize=message.$size||sentinelSize}type=messageType;return messageSize}function link_context(){context.__parent=parent;context.__key=key}function message_value_is_leaf(){return message_value_is_primitive()||message_value_is_array()}function message_value_has_length(){return typeof_message_value()==="string"||message_value_is_array()}function message_value_is_array(){return isArray(messageValue)&&(typeofMessageValue="array")}function message_value_is_primitive(){return messageValueIsPrimitive=typeof_message_value()!=="object"||messageValue===null}function init_stamp(){sizeExpireList[sizeExpireListLength++]=context;expires=context.$expires;if(expires!==undefined&&expires!==EXPIRES_NEVER&&expires!==EXPIRES_NOW){if(expires<0){expires=now+expires*-1}context.$expires=expires}stamp()}function insert_empty_branch(){parent[key]=context={$size:0};link_context()}function insert_message(){value=find_message_value();messageSize=find_message_size();message.$size=size;sizeOffset+=messageSize-size;parent[key]=context=message;link_context();adjust_contexts();context.$type=type=type||"leaf";if(context.__access_time===undefined){init_stamp()}else{stamp()}}function interrupt(){refs[column]=value;prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache}function replace_context(message){size=context.$size||0;timestamp=context.$timestamp||0;if(message!=null){migrate_references(context,message)}if(isArray(value)){delete_hard_link(context)}context=undefined}function migrate_references(context,message){var mBackRefs=message.__refsLength||0,cBackRefs=context.__refsLength||0,refs=-1,refKey,ref;while(++refs<cBackRefs){refKey="__ref"+refs;ref=context[refKey];ref._context=message;message["__ref"+(mBackRefs+refs)]=ref;delete context[refKey]}}function delete_hard_link(reference){var destination=reference._context;if(destination!=null){var refIndex=(reference.__refIndex||0)-1,refsLen=(destination.__refsLength||0)-1;while(++refIndex<=refsLen){destination["__ref"+refIndex]=destination["__ref"+refIndex+1]}destination.__refsLength=refsLen;if(refsLen<0){delete destination.__ref0;delete destination.__refsLength}delete reference.__refIndex;delete reference._context}}function typeof_message_value(){return typeofMessageValue=typeof find_message_value()}function unlock(){if(context!=null){if(context.__access_time===undefined){init_stamp()}else{stamp()}}}}function call(){return this._lazy?callLazily.apply(this,arguments):callImmediately.apply(this,arguments)}var callLazily=immediateToLazy(callImmediately);function callImmediately(path,callArgs,suffixes,paths,pbv,onNext,onError,onCompleted){var a=args(arguments);if(a.length===6){onCompleted=a.pop();onError=a.pop();onNext=a.pop();pbv=a.pop();suffixes=[];paths=[]}else if(a.length===7){onCompleted=a.pop();onError=a.pop();onNext=a.pop();pbv=a.pop();paths=[]}suffixes=suffixes||[];paths=paths||[];var self=this,bound=pbv.optimized||pbv.path||[];pbv={path:[],value:this.cache};var extras=paths.map(function(x){return bound.concat(x)}),invalidateSubscription=Disposable.empty,setSubscription=Disposable.empty,loadSubscription=this.loader.call(bound.concat(path),callArgs,suffixes,extras).subscribe(function(pbf){var invalidated=pbf.invalidated||[];if(invalidated.length>0){return invalidateSubscription=invalidatePaths.call(self,invalidated,pbv,function(self){return setSubscription=setCallResponse.call(self,pbf)},onError,noop)}return setSubscription=setCallResponse.call(self,pbf)},onError,noop);return Disposable.create(function(x){loadSubscription.dispose();invalidateSubscription.dispose();setSubscription.dispose()});function setCallResponse(pbf){pbf=Object.create(pbf);var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=[];pbf.paths.pathSet=undefined;pbf.paths.observers=undefined;return setPBFRoot.call(self,pbf,onNext,onError,onCompleted)}}function collapse(list){return rangeCollapse(buildQueries(buildTree(list)))}function rangeCollapse(paths){paths.forEach(function(path){path.forEach(function(elt,index){var range;if(Array.isArray(elt)&&elt.every(isNumber)&&allUnique(elt)){elt.sort(function(a,b){return a-b});if(elt[elt.length-1]-elt[0]===elt.length-1){range={};range.from=elt[0];range.to=elt[elt.length-1];path[index]=range}}})});return paths}function isNumber(val){return typeof val==="number"}function allUnique(arr){var hash={},index,len;for(index=0,len=arr.length;index<len;index++){if(hash[arr[index]]){return false}hash[arr[index]]=true}return true}function buildTree(list){return list.reduce(insertPath,{})}function insertPath(root,path){var children,child,i,n,j,k,rest=path.slice(1);if(path.length!==0){if((child=path[0])==null){return root}if(typeof child!=="object"){insertPath(root[child]||(root[child]={}),rest)}else if(Array.isArray(child)&&(children=child)){i=-1;n=children.length;while(++i<n){if(typeof(child=children[i])==="object"){j=child.from||0;k=child.to||j+child.length;while(j<=k){insertPath(root[j]||(root[j]={}),rest);++j}}else{insertPath(root[child]||(root[child]={}),rest)}}}else{i=child.from||0;n=child.to||i+child.length;while(i<=n){insertPath(root[i]||(root[i]={}),rest);++i}}}return root}function sortLol(lol){return lol.reduce(function(result,curr){if(curr instanceof Array){result.push(sortLol(curr).slice(0).sort());return result}return result.concat(curr)},[]).slice(0).sort()}function createKey(list){return JSON.stringify(sortLol(list))}var charPattern=/\D/i;function buildQueries(root){var children=Object.keys(root).filter(function(key){return key!=="__observers"}),child,memo,paths,key,childIsNum,list,head,tail,copy,results,i=-1,n=children.length,j,k,x;if(n===0||Array.isArray(root)===true){return[[]]}memo={};while(++i<n){child=children[i];paths=buildQueries(root[child]);key=createKey(paths);childIsNum=typeof child==="string"&&!charPattern.test(child);if((list=memo[key])&&(head=list.head)){head[head.length]=childIsNum?parseInt(child,10):child}else{memo[key]={head:[childIsNum?parseInt(child,10):child],tail:paths}}}results=[];for(x in memo){head=(list=memo[x]).head;tail=list.tail;i=-1;n=tail.length;while(++i<n){list=tail[i];j=-1;k=list.length;if(head[0]===""){copy=[]}else{copy=[head.length===1?head[0]:head];while(++j<k){copy[j+1]=list[j]}}results[results.length]=copy}}return results}function collect(nodes,now,max,total,T,R,S){var to=0;nodes.sort(function(a,b){return a.__invalidated===true?-1:b.invalidated===true?1:a.__access_time-b.__access_time}).every(function(x,i){var offset=x.$size,backRefs,ref,y;total-=offset;to=i;x.__invalidated=true;do{y=x.__parent;if(x.__invalidated===true){if(y!==undefined){delete y[x.__key];delete x.__parent}backRefs=x.__refsLength||0;while(--backRefs>=0){if((ref=x["__ref"+backRefs])!==undefined){delete ref._context;delete x["__ref"+backRefs]}}delete x.__refsLength}x.$size=x.$size-offset}while((x=y)!==undefined);return total>max});return nodes.slice(to)}module.exports=PathEvaluator},{"../src/rx.ultralite":2}],2:[function(_dereq_,module,exports){(function(global){var Rx;if(typeof window!=="undefined"&&typeof window["Rx"]!=="undefined"){Rx=window["Rx"]}else if(typeof global!=="undefined"&&typeof global["Rx"]!=="undefined"){Rx=global["Rx"]}else{if(typeof global!=="undefined"&&typeof global.require==="function"){try{Rx=global["require"]("rx")}catch(e){Rx=undefined}}}if(Rx===undefined){Rx={I:function(){return arguments[0]},Disposable:function(){function Disposable(a){this.action=a}Disposable.create=function(a){return new Disposable(a)};Disposable.empty=new Disposable(function(){});Disposable.prototype.dispose=function(){if(typeof this.action==="function"){this.action()}};return Disposable}(),Observable:function(){function Observable(s){this.s=s}Observable.create=Observable.createWithDisposable=function(s){return new Observable(s)};Observable.fastCreateWithDisposable=Observable.create;Observable.fastReturnValue=function(value){return Observable.create(function(observer){observer.onNext(value);observer.onCompleted()})};Observable.prototype.subscribe=function(n,e,c){return this.s(n!=null&&typeof n==="object"?n:Rx.Observer.create(n,e,c))};Observable.prototype.catchException=function(next){var self=this;return Observable.create(function(o){return self.subscribe(function(x){o.onNext(x)},function(e){return(typeof next==="function"?next(e):next).subscribe(o)},function(){o.onCompleted()})})};return Observable}(),Observer:function(){function Observer(n,e,c){this.onNext=n||Rx.I;this.onError=e||Rx.I;this.onCompleted=c||Rx.I}Observer.create=function(n,e,c){return new Observer(n,e,c)};return Observer}(),Subject:function(){function Subject(){this.observers=[]}Subject.prototype.subscribe=function(subscriber){var a=this.observers,n=a.length;a[n]=subscriber;return{dispose:function(){a.splice(n,1)}}};Subject.prototype.onNext=function(x){var listeners=this.observers.concat(),i=-1,n=listeners.length;while(++i<n){listeners[i].onNext(x)}};Subject.prototype.onError=function(e){var listeners=this.observers.concat(),i=-1,n=listeners.length;this.observers.length=0;while(++i<n){listeners[i].onError(e)}};Subject.prototype.onCompleted=function(){var listeners=this.observers.concat(),i=-1,n=listeners.length;this.observers.length=0;while(++i<n){listeners[i].onCompleted()}}}()}}module.exports=Rx}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}]},{},[1])(1)});alert(falkor.PathEvaluator);var pathEvaluator=new falkor.PathEvaluator;alert();pathEvaluator.deserialize({videos:{123:{name:"Die Hard"}}});var result=pathEvaluator.get(["videos",123,"name"]); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"rx": "2.3.1" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<style type='text/css'>html, body { margin: 0; padding: 0; border: 0; } | |
body, html { height: 100%; width: 100%; }</style> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment