Ejemplo n.º 1
0
    return function observeToMap(emit, scope) {
        var map = Map();
        var cancel = emit(map) || Function.noop;

        var cancelObjectObserver = observeObject(autoCancelPrevious(function replaceObject(object) {
            map.clear();
            if (!object) return;

            if (object.addRangeChangeListener) { // array/collection of items

                // TODO

            } else { // object literal

                var cancelers = Object.keys(object).map(function (key) {
                    return _observeProperty(object, key, autoCancelPrevious(function (value) {
                        map.set(key, value);
                    }), scope);
                });
                return function cancelPropertyObservers() {
                    cancelEach(cancelers);
                };

            }
        }), scope);

        return function cancelObjectToMapObserver() {
            cancel();
            cancelObjectObserver();
        };
    };
Ejemplo n.º 2
0
    it("Get (Map)", function () {
        var Map = require("collections/map");
        var a = {id: 0}, b = {id: 1};
        var object = {
            source: Map([[a, 10], [b, 20]]),
            key: null,
            selected: null
        };

        var cancel = bind(object, "selected", {
            "<-": "source.get(key)"
        });
        expect(object.selected).toBe(undefined);

        object.key = a;
        expect(object.selected).toBe(10);

        object.key = b;
        expect(object.selected).toBe(20);

        object.source.set(b, 30);
        expect(object.selected).toBe(30);

        var SortedMap = require("collections/sorted-map");
        object.source = SortedMap();
        expect(object.selected).toBe(undefined);

        object.source.set(b, 40);
        expect(object.selected).toBe(40);

        cancel();
        object.key = a; // no effect
        expect(object.selected).toBe(40);
    });
Ejemplo n.º 3
0
function observeItems(collection, emit, scope) {
    var items = [];
    var keyToItem = Map();
    var cancel = emit(items) || Function.noop;
    // TODO observe addition and deletion with separate observers
    function mapChange(value, key, collection) {
        var item, index;
        if (!keyToItem.has(key)) { // add
            item = [key, value];
            keyToItem.set(key, item);
            items.push(item);
        } else if (value == null) { // delete
            item = keyToItem.get(key);
            keyToItem["delete"](key);
            index = items.indexOf(item);
            items.splice(index, 1);
        } else { // update
            item = keyToItem.get(key);
            item.set(1, value);
        }
    }
    var cancelMapChange = observeMapChange(collection, mapChange, scope);
    return once(function cancelObserveItems() {
        cancel();
        cancelMapChange();
    });
}
Ejemplo n.º 4
0
    it("Get (all content)", function () {
        var Map = require("collections/map");
        var object = {
            a: Map({a: 10}),
            b: Map()
        };
        var cancel = bind(object, "a.mapContent()", {"<->": "b.mapContent()"});
        expect(object.a.toObject()).toEqual({});
        expect(object.b.toObject()).toEqual({});

        object.a.set('a', 10);
        expect(object.a.toObject()).toEqual({a: 10});
        expect(object.b.toObject()).toEqual({a: 10});

        object.b.set('b', 20);
        expect(object.a.toObject()).toEqual({a: 10, b: 20});
        expect(object.b.toObject()).toEqual({a: 10, b: 20});
    });
Ejemplo n.º 5
0
    it("should bind to a key in a map", function () {
        var object = {one: 1, two: 2};
        var map = Map();

        Bindings.defineBinding(map, "get('one')", {
            "<-": "one",
            source: object
        });

        expect(map.get('one')).toBe(1);
        object.one = 0;
        expect(map.get('one')).toBe(0);
    });
Ejemplo n.º 6
0
 it("should bind array to map content", function () {
     var map = Map();
     var array = [1];
     var cancel = bind(map, "()[*]", {"<-": "", source: array});
     expect(map.toObject()).toEqual({0: 1});
     array.push(2);
     expect(map.toObject()).toEqual({0: 1, 1: 2});
     array.splice(0, 1);
     expect(map.toObject()).toEqual({0: 2});
     cancel();
     array.push(3);
     expect(map.toObject()).toEqual({0: 2});
 });
Ejemplo n.º 7
0
 it("should bind map content to array content", function () {
     var array = [];
     var map = Map([[0, 1]]);
     var cancel = bind(array, "()[*]", {"<-": "", source: map});
     expect(array).toEqual([1]);
     map.set(1, 2);
     expect(array).toEqual([1, 2]);
     map.delete(0);
     expect(array).toEqual([2]);
     cancel();
     map.set(2, 3);
     expect(array).toEqual([2]);
 });
Ejemplo n.º 8
0
function observeMapChange(collection, emit, scope) {
    var cancelers = Map();
    function mapChange(value, key, collection) {
        var cancelChild = cancelers.get(key) || Function.noop;
        cancelChild();
        cancelChild = emit(value, key, collection) || Function.noop;
        cancelers.set(key, cancelChild);
    }
    collection.forEach(mapChange);
    var cancelMapChange = collection.addMapChangeListener(mapChange, scope.beforeChange);
    return once(function cancelMapObserver() {
        cancelers.forEach(function (cancel) {
            cancel();
        });
        cancelMapChange();
    });
}
Ejemplo n.º 9
0
    it("Keys, Values, Entries", function () {
        var Map = require("collections/map");
        var object = Bindings.defineBindings({}, {
            keys: {"<-": "map.keys()"},
            values: {"<-": "map.values()"},
            items: {"<-": "map.items()"}
        });
        object.map = Map({a: 10, b: 20, c: 30});
        expect(object.keys).toEqual(['a', 'b', 'c']);
        expect(object.values).toEqual([10, 20, 30]);
        expect(object.items).toEqual([['a', 10], ['b', 20], ['c', 30]]);

        object.map.set('d', 40);
        object.map.delete('a');
        expect(object.keys).toEqual(['b', 'c', 'd']);
        expect(object.values).toEqual([20, 30, 40]);
        expect(object.items).toEqual([['b', 20], ['c', 30], ['d', 40]]);
    });
Ejemplo n.º 10
0
        return observeRelationItems(autoCancelPrevious(function (input, original) {
            if (!input) return emit();

            var groups = Map();

            function rangeChange(plus, minus, index) {
                var dirtyGroups = Set();
                minus.forEach(function (item) {
                    // ASSERT groups.has(item[1]);
                    var group = groups.get(item[1]);
                    group["delete"](item[0]);
                    dirtyGroups.add(item[1]);
                });
                plus.forEach(function (item) {
                    if (!groups.has(item[1])) {
                        // constructClone ensures that the equivalence classes
                        // are the same type as the input.  It is shimmed on
                        // Array by Collections, and supported by all others.
                        groups.set(item[1], original.constructClone());
                    }
                    var group = groups.get(item[1]);
                    group.add(item[0]);
                });
                dirtyGroups.forEach(function (key) {
                    var group = groups.get(key);
                    if (group.length === 0) {
                        groups["delete"](key);
                    }
                });
            }

            var cancelRangeChange = observeRangeChange(input, rangeChange, scope);
            var cancel = emit(groups) || Function.noop;
            return function cancelGroupObserver() {
                cancelRangeChange();
                cancel();
            };
        }), scope);
Ejemplo n.º 11
0
        "evaluate"
    ]).addEach(Object.keys(Operators)),

    expanders: Map({
        value: function (syntax, value) {
            return value || {"type": "value"};
        },
        parameters: function (syntax, value, parameters) {
            return parameters || {"type": "parameters"};
        },
        record: function (syntax, value, parameters, expand) {
            var expanded = {type: "record", args: []};
            for (var name in syntax.args) {
                expanded.args[name] = expand(syntax.args[name], value, parameters, expand);
            }
            return expanded;
        },
        component: function (syntax, value, parameters, expand) {
            if (parameters && parameters.serialization && syntax.component) {
                return {
                    type: "component",
                    label: parameters.serialization.getObjectLabel(syntax.component)
                };
            } else {
                return syntax;
            }
        }
    }),

    expand: function (syntax, value, parameters, expand) {
        if (this.expanders.has(syntax.type)) {
Ejemplo n.º 12
0
function expand(e,t){var n=expand.semantics.expand.bind(expand.semantics);return n(e,t,n)}var Set=require("collections/set"),Map=require("collections/map"),Operators=require("./operators");module.exports=expand,expand.semantics={reflexive:Set(["literal","element","rangeContent","mapContent"]),traverseLeft:Set(["with","mapBlock","filterBlock","someBlock","everyBlock","sortedBlock","groupBlock","groupMapBlock"]),expanders:Map({value:function(e,t){return t.value||{type:"value"}},parameters:function(e,t){return t.parameters||{type:"parameters"}},record:function(e,t,n){var i={type:"record",args:[]};for(var r in e.args)i.args[r]=n(e.args[r],t,n);return i},component:function(e,t){return t.components&&e.component?{type:"component",label:t.components.getObjectLabel(e.component)}:e}}),expand:function(e,t,n){return this.expanders.has(e.type)?this.expanders.get(e.type)(e,t,n):this.traverseLeft.has(e.type)?{type:e.type,args:[n(e.args[0],t,n)].concat(e.args.slice(1))}:this.reflexive.has(e.type)?e:{type:e.type,args:e.args.map(function(e){return n(e,t,n)})}}};
Ejemplo n.º 13
0
    it("Array Content", function () {
        var object = {
            array: [1, 2, 3]
        };
        Bindings.defineBindings(object, {
            first: {"<-": "array.0"},
            second: {"<-": "array.get(1)"}
        });
        expect(object.first).toBe(1);
        expect(object.second).toBe(2);

        // ...continued
        var array = [1, 2, 3];
        var object = {};
        Bindings.defineBindings(object, {
            first: {
                "<-": ".0",
                source: array
            },
            second: {
                "<-": "get(1)",
                source: array
            }
        });
        expect(object.first).toBe(1);
        expect(object.second).toBe(2);

        // ... continued
        var object = {
            array: [1, 2, 3],
            index: 0
        };
        Bindings.defineBinding(object, "last", {
            "<-": "array.get(array.length - 1)"
        });
        expect(object.last).toBe(3);

        object.array.pop();
        expect(object.last).toBe(2);

        // ... continued
        var SortedSet = require("collections/sorted-set");
        var object = {
            set: SortedSet(),
            array: []
        };
        Bindings.defineBindings(object, {
            "array.rangeContent()": {"<-": "set"}
        });
        object.set.addEach([5, 2, 6, 1, 4, 3]);
        expect(object.array).toEqual([1, 2, 3, 4, 5, 6]);

        // ... continued
        var Map = require("collections/map");
        var object = {
            map: Map(),
            array: []
        };
        Bindings.defineBinding(object, "map.mapContent()", {
            "<-": "array"
        });
        object.array.push(1, 2, 3);
        expect(object.map.toObject()).toEqual({
            0: 1,
            1: 2,
            2: 3
        });
    });
Ejemplo n.º 14
0
var FS = require("q-io/fs");
var URL = require("url2");

module.exports = transform;
function transform(appPackage, config) {
    var spinner = function() { config.out.status.apply(config.out, ["Processing"].concat(Array.prototype.slice.call(arguments))); };
    return Promise.all(Object.map(config.files, function (file) {
        spinner(file.path);
        return transformFile(file, config, spinner);
    }))
    .then(function () {
        config.out.status();
    })
}

transform.extensions = Map({
    ".html": require("./transform/html"),
    ".css": require("./transform/css"),
    ".json": require("./transform/json"),
    ".js": require("./transform/javascript")
})

function transformFile(file, config, spinner) {
    var extension = FS.extension(URL.parse(file.location).pathname);
    //if (file.relativeLocation === "package.json") {
    if (transform.extensions.has(extension)) {
        return transform.extensions.get(extension)(file, config, spinner);
    }
}

function makeLiteralObserver(e){return function(t){return t(e)||Function.noop}}function observeValue(e,t){return e(t.value)||Function.noop}function observeParameters(e,t){return e(t.parameters)||Function.noop}function makeElementObserver(e){return function(t,n){return t(n.document.getElementById(e))||Function.noop}}function makeComponentObserver(e,t){return function(n,i){var r=i.components,a=r.getObjectByLabel||r.getComponentByLabel,s=a.call(r,e);return t.component=s,n(s)||Function.noop}}function observeProperty(e,t,n,i){function r(e,t,i){a(),a=n(e,t,i)||Function.noop}if(null==e)return n();var a=Function.noop;return PropertyChanges.addOwnPropertyChangeListener(e,t,r,i.beforeChange),r(e[t],t,e),once(function(){a(),PropertyChanges.removeOwnPropertyChangeListener(e,t,r,i.beforeChange)})}function makePropertyObserver(e,t){return function(n,i){return t(autoCancelPrevious(function(t){return"string"!=typeof t&&"number"!=typeof t?n():e(autoCancelPrevious(function(e){return null==e?n():e.observeProperty?e.observeProperty(t,n,i):_observeProperty(e,t,n,i)}),i)}),i)}}function observeGet(e,t,n,i){function r(e,i,r){s(t,i)&&(a(),a=n(e,t,r)||Function.noop)}var a=Function.noop,s=e.contentEquals||Object.equals;return r(e.get(t),t,e),e.addMapChangeListener(r,i.beforeChange),once(function(){a(),e.removeMapChangeListener(r)})}function makeGetObserver(e,t){return function(n,i){return e(autoCancelPrevious(function(e){return e?t(autoCancelPrevious(function(t){return null==t?n():e.observeGet?e.observeGet(t,n,i):_observeGet(e,t,n,i)}),i):n()}),i)}}function makeHasObserver(e,t){return function(n,i){return n=makeUniq(n),t(autoCancelPrevious(function(t){return e(autoCancelPrevious(function(e){return e?observeRangeChange(e,function(){return n((e.has||e.contains).call(e,t))},i):n()}),i)}),i)}}function makeObserversObserver(e){return function(t,n){for(var i=Array(e.length),r=0;e.length>r;r++)i[r]=void 0;var a=e.map(function(e,t){return e(function(e){i.set(t,e)},n)}),s=t(i)||Function.noop;return once(function(){s(),cancelEach(a)})}}function makeObjectObserver(e){return function(t,n){var i={},r={};for(var a in e)(function(e,t){i[e]=t(function(t){r[e]=t},n)})(a,e[a]);var s=t(r)||Function.noop;return function(){s();for(var e in i)i[e]()}}}function makeArrayObserver(){return makeObserversObserver(Array.prototype.slice.call(arguments))}function makeOperatorObserverMaker(e){return function(){var t=makeObserversObserver(Array.prototype.slice.call(arguments)),n=makeRangeContentObserver(t);return function(t,i){return n(autoCancelPrevious(function(n){return n.every(Operators.defined)?t(e.apply(void 0,n)):t()}),i)}}}function makeMethodObserverMaker(e){var t=e.slice(0,1).toUpperCase()+e.slice(1),n="make"+t+"Observer",i="observe"+t;return function(){var t=arguments[0],r=Array.prototype.slice.call(arguments,1),a=r.map(function(e){return function(t,n){return e(autoCancelPrevious(t),n)}}),s=makeObserversObserver(r),o=makeRangeContentObserver(s);return function(r,s){return t(autoCancelPrevious(function(t){return t?t[n]?t[n].apply(t,a)(r,s):t[i]?t[i](r,s):o(autoCancelPrevious(function(n){return n.every(Operators.defined)?"function"==typeof t[e]?r(t[e].apply(t,n)):r():r()}),s):r()}),s)}}}function makeNotObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){return t(!e)}),n)}}function makeAndObserver(e,t){return function(n,i){return e(autoCancelPrevious(function(e){return e?t(n,i):n(e)}),i)}}function makeOrObserver(e,t){return function(n,i){return e(autoCancelPrevious(function(e){return e?n(e):t(n,i)}),i)}}function makeConditionalObserver(e,t,n){return function(i,r){return e(autoCancelPrevious(function(e){return null==e?i():e?t(i,r):n(i,r)}),r)}}function makeDefinedObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){return t(null!=e)}),n)}}function makeDefaultObserver(e,t){return function(n,i){return e(autoCancelPrevious(function(e){return null==e?t(n,i):n(e)}),i)}}function makeReplacingMapBlockObserver(e,t){return function(n,i){return e(autoCancelPrevious(function(e){function r(t){for(;e.length>t;t++)o[t].index=t}function a(e,n,a){o.swap(a,n.length,e.map(function(e,t){return{index:a+t}})),r(a+e.length);var c,u=[];cancelEach(l.swap(a,n.length,e.map(function(e,n){var r=o[a+n];return t(autoCancelPrevious(function(e){c?s.set(r.index,e):u[n]=e}),i.nest(e))}))),c=!0,s.swap(a,n.length,u)}if(!e)return n();var s=[],o=[],l=[],c=observeRangeChange(e,a,i),u=n(s,e)||Function.noop;return once(function(){u(),cancelEach(l),c()})}),i)}}function makeReplacingFilterBlockObserver(e,t){var n=makeReplacingMapBlockObserver(e,t);return function(e,t){return n(autoCancelPrevious(function(n,i){function r(e){for(;n.length>e;e++)l[e+1]=l[e]+!!n[e]}function a(e,t,n){var a=i.slice(n,n+e.length),o=t.map(Boolean).sum(),c=a.filter(function(t,n){return e[n]}),u=l[n],h=s.slice(u,u+o);(h.length!==c.length||h.some(function(e,t){return e!==c[t]}))&&s.swap(u,o,c),r(u)}if(!i)return e();var s=[],o=[],l=[0],c=observeRangeChange(n,a,t),u=e(s)||Function.noop;return once(function(){u(),cancelEach(o),c()})}),t)}}function makeSortedBlockObserver(e,t){var n=makeRelationEntryObserver(t),i=makeReplacingMapBlockObserver(e,n),r=function(e,t){return i(autoCancelPrevious(function(n){function i(e,t){a.addEach(e),a.deleteEach(t)}if(!n)return e();var r=[],a=SortedArray(r,entryValueEquals,entryValueCompare),s=observeRangeChange(n,i,t),o=e(r)||Function.noop;return function(){o(),s()}}),t)};return makeMapBlockObserver(r,observeEntryKey)}function entryValueEquals(e,t){return Object.equals(e[1],t[1])}function entryValueCompare(e,t){return Object.compare(e[1],t[1])}function makeRelationEntryObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){return t([n.value,e])||Function.noop}),n)}}function makeSortedSetBlockObserver(e,t){var n=makeRelationEntryObserver(t),i=makeReplacingMapBlockObserver(e,n),r=makeGroupBlockObserver(i,observeEntryValue),a=makeReplacingMapBlockObserver(r,makeLastObserver(observeEntryValue));return function(e,t){function n(e,t){return e=o.get(e),t=o.get(t),Object.compare(e,t)}function i(e,t){return e=o.get(e),t=o.get(t),Object.equals(e,t)}function r(e,t){t.forEach(function(e){l["delete"](e[0]),o["delete"](e[0])}),e.forEach(function(e){o.set(e[0],e[1]),l.add(e[0])})}function s(e){return l.clear(),observeRangeChange(e,r,t)}var o=new Map,l=new SortedSet(null,i,n),c=e(l)||Function.noop,u=a(s,t);return function(){c(),u()}}}function makeReplacingReversedObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){function i(e,t,n){var i=r.length-n-t.length;r.swap(i,t.length,e.reversed())}if(!e)return t();var r=[],a=observeRangeChange(e,i,n),s=t(r);return once(function(){s(),a()})}),n)}}function makeReplacingFlattenObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){function i(t){for(var n=t;e.length>n;n++)l[n].index=n,o[n+1]=e[n]?o[n]+e[n].length:o[n]}function r(e,t,r){var c=o[r],u=o[r+t.length],h=u-c;a.swap(c,h,[]),l.swap(r,t.length,e.map(function(){return{index:null}})),i(r),cancelEach(s.swap(r,t.length,e.map(function(e,t){function s(e,t,n){i(c.index);var r=o[c.index]+n,s=o[c.index]+n+t.length,l=s-r;a.swap(r,l,e)}var c=l[r+t];return observeRangeChange(e,s,n)})))}if(!e)return t();var a=[],s=[],o=[0],l=[],c=observeRangeChange(e,r,n),u=t(a)||Function.noop;return once(function(){u(),cancelEach(s),c()})}),n)}}function makeConcatObserver(){return makeFlattenObserver(makeObserversObserver(Array.prototype.slice.call(arguments)))}function makeSomeBlockObserver(e,t){var n=makeFilterBlockObserver(e,t),i=makePropertyObserver(n,observeLengthLiteral);return makeConverterObserver(i,Boolean)}function makeEveryBlockObserver(e,t){var n=makeConverterObserver(t,Operators.not),i=makeFilterBlockObserver(e,n),r=makePropertyObserver(i,observeLengthLiteral);return makeConverterObserver(r,Operators.not)}function makeGroupBlockObserver(e,t){var n=makeGroupMapBlockObserver(e,t);return makeEntriesObserver(n)}function makeGroupMapBlockObserver(e,t){var n=makeRelationEntryObserver(t),i=makeReplacingMapBlockObserver(e,n);return function(e,t){return i(autoCancelPrevious(function(n,i){function r(e,t){t.forEach(function(e){var t=a.get(e[1]);1===t.length?a["delete"](e[1]):t["delete"](e[0])}),e.forEach(function(e){var t,n=!a.has(e[1]);t=n?i.constructClone():a.get(e[1]),t.add(e[0]),n&&a.set(e[1],t)})}if(!n)return e();var a=Map(),s=observeRangeChange(n,r,t),o=e(a)||Function.noop;return function(){s(),o()}}),t)}}function makeHeapBlockObserver(e,t,n){function i(e,t){return Object.compare(e[1],t[1])*n}var r=makeRelationEntryObserver(t),a=makeReplacingMapBlockObserver(e,r);return function(e,t){return a(autoCancelPrevious(function(n){function r(e,t){s.addEach(e),s.deleteEach(t)}function a(t,n){return 0===n?t?e(t[0]):e():void 0}if(!n)return e();var s=new Heap(null,entryValueEquals,i),o=observeRangeChange(n,r,t),l=observeMapChange(s,a,t);return function(){o(),l()}}),t)}}function makeMaxBlockObserver(e,t){return makeHeapBlockObserver(e,t,1)}function makeMinBlockObserver(e,t){return makeHeapBlockObserver(e,t,-1)}function makeMaxObserver(e){return makeHeapBlockObserver(e,observeValue,1)}function makeMinObserver(e){return makeHeapBlockObserver(e,observeValue,-1)}function makeCollectionObserverMaker(e){return function(t){return function(n,i){return n=makeUniq(n),t(autoCancelPrevious(function(t){if(!t)return n();var r=e(t,n);return observeRangeChange(t,function(e,t,i){return n(r(e,t,i))},i)}),i)}}}function isNumber(e){return"number"==typeof e&&!isNaN(e)}function makeReplacingViewObserver(e,t,n){return n||(n=t,t=observeZero),function(i,r){return e(autoCancelPrevious(function(e){function a(t,n,i){if(h){var r=t.length-n.length;o>=i?r>0?(u.swap(0,0,e.slice(o,o+r)),u.splice(s,u.length-s)):(u.splice(0,-r),u.swap(u.length,0,e.slice(o+u.length,o+s))):o+s>i&&(u.swap(i-o,n.length,t),r>0?u.splice(s,u.length-s):u.swap(u.length,0,e.slice(o+u.length,o+s)))}}if(!e)return i();var s,o,l,c,u=[],h=!1,d=observeRangeChange(e,a,r),p=n(function(t){t=+t,isNaN(t)&&(t=void 0);var n="number"==typeof t&&"number"==typeof o,i=Math.max(0,t);"number"==typeof c&&(i=Math.min(i,e.length-c)),h!==n?(n?u.swap(0,0,e.slice(c,c+i)):u.clear(),h=n):h&&l!==i&&(l>i?u.splice(t,l-i):u.swap(l,0,e.slice(c+l,c+i))),s=t,l=i},r),g=t(function(t){t=+t,isNaN(t)&&(t=void 0);var n="number"==typeof s&&"number"==typeof t,i=Math.max(0,t);"number"==typeof s&&(i=Math.min(i,e.length));var r=Math.max(0,s);if("number"==typeof i&&(r=Math.min(r,e.length-i)),h!==n)n?u.swap(0,u.length,e.slice(i,i+r)):u.clear(),h=n;else if(h&&c!==i){var a=Math.abs(i-c);l>a&&c>i?(u.swap(0,0,e.slice(i,c)),u.splice(r,u.length-r)):l>a&&i>c?(u.swap(u.length,0,e.slice(c+l,i+r)),u.splice(0,u.length-r)):u.swap(0,u.length,e.slice(i,i+r))}o=t,c=i,l=r},r),f=i(u)||Function.noop;return function(){f(),p(),g(),d()}}),r)}}function makeReplacingEnumerateObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){function i(e){for(;a.length>e;e++)a[e].set(0,e)}function r(e,t,n){a.swap(n,t.length,e.map(function(e,t){return[n+t,e]})),i(n+e.length)}if(!e)return t();var a=[],s=observeRangeChange(e,r,n),o=t(a)||Function.noop;return function(){o(),s()}}),n)}}function makeRangeObserver(e){return function(t,n){var i=[],r=t(i)||Function.noop,a=e(function(e){if(e>>>=0,null==e)i.clear();else if(e>i.length){for(var t=[],n=i.length;e>n;n++)t.push(n);i.swap(i.length,0,t)}else i.length>e&&i.splice(e,i.length)},n);return function(){r(),a()}}}function makeStartsWithObserver(e,t){return function(n,i){return t(function(t){var r=RegExp("^"+RegExp.escape(t));return e(function(e){return n(r.test(e))||Function.noop},i)},i)}}function makeEndsWithObserver(e,t){return function(n,i){return t(function(t){var r=RegExp(RegExp.escape(t)+"$");return e(function(e){return n(r.test(e))||Function.noop},i)},i)}}function makeContainsObserver(e,t){return function(n,i){return t(function(t){var r=RegExp(RegExp.escape(t));return e(function(e){return n(r.test(e))||Function.noop},i)},i)}}function makeJoinObserver(e,t){return t=t||observeNullString,function(n,i){return e(autoCancelPrevious(function(e){return e?t(autoCancelPrevious(function(t){function r(){a=n(e.join(t))||Function.noop}if("string"!=typeof t)return n()||Function.noop;var a=Function.noop,s=observeRangeChange(e,r,i);return function(){s(),a()}}),i):n()||Function.noop}),i)}}function observeRangeChange(e,t,n){function i(e,n,i){r(),r=t(e,n,i)||Function.noop}if(!e)return Function.noop;var r=Function.noop;if(!e.toArray)return Function.noop;if(!e.addRangeChangeListener)return Function.noop;i(e.toArray(),[],0);var a=e.addRangeChangeListener(i,null,n.beforeChange);return function(){r(),a()}}function makeLastObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){return _observeLast(e,t,n)}),n)}}function observeLast(e,t,n){function i(n,i,o){if(r+=n.length-i.length,!(r>o+i.length&&r>o+n.length)){var l=0>r?null:e.get(r);a(),a=t(l)||Function.noop,s=l}}var r=-1,a=Function.noop,s=null,o=observeRangeChange(e,i,n);return function(){a(),o()}}function makeOnlyObserver(e){return function(t,n){return e(autoCancelPrevious(makeUniq(function(e){return observeOnly(e,t,n)})),n)}}function observeOnly(e,t,n){function i(n,i){return r+=n.length-i.length,1===r?t(e.only()):t()}var r=0;return observeRangeChange(e,i,n)}function makeOneObserver(e){return function(t,n){return e(autoCancelPrevious(makeUniq(function(e){return observeOne(e,t,n)})),n)}}function observeOne(e,t,n){function i(n,i){return r+=n.length-i.length,r>0?t(e.one()):t()}var r=0;return observeRangeChange(e,i,n)}function makeRangeContentObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){return e&&e.addRangeChangeListener?observeRangeChange(e,function(){return t(e)},n):t(e)}),n)}}function makeMapContentObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){return e&&e.addMapChangeListener?observeMapChange(e,function(){return t(e)},n):t(e)}),n)}}function observeMapChange(e,t,n){function i(e,n,i){var a=r.get(n)||Function.noop;r["delete"](n),a(),a=t(e,n,i)||Function.noop,void 0===e?a():r.set(n,a)}if(e.addMapChangeListener){var r=new Map;e.forEach(i);var a=e.addMapChangeListener(i,n.beforeChange);return once(function(){r.forEach(function(e){e()}),a()})}}function makeReplacingEntriesObserver(e){return function(t,n){return e(autoCancelPrevious(function(e){return e?observeEntries(e,t,n):t()}),n)}}function observeEntries(e,t,n){function i(e,t){var n,i;a.has(t)?null==e?(n=a.get(t),a["delete"](t),i=r.indexOf(n),r.splice(i,1)):(n=a.get(t),n.set(1,e)):(n=[t,e],a.set(t,n),r.push(n))}var r=[],a=Map(),s=t(r)||Function.noop,o=observeMapChange(e,i,n)||Function.noop;return once(function(){s(),o()})}function makeKeysObserver(e){var t=makeEntriesObserver(e);return makeMapBlockObserver(t,observeEntryKey)}function observeEntryKey(e,t){return t.value?e(t.value[0])||Function.noop:e()}function makeValuesObserver(e){var t=makeEntriesObserver(e);return makeMapBlockObserver(t,observeEntryValue)}function observeEntryValue(e,t){return t.value?e(t.value[1])||Function.noop:e()}function makeToMapObserver(e){return function(t,n){var i=new Map,r=t(i)||Function.noop,a=e(autoCancelPrevious(function(e){function t(e,t){void 0===e?i["delete"](t):i.set(t,e)}if(i.clear(),e&&"object"==typeof e){if(e.addRangeChangeListener)return observeUniqueEntries(autoCancelPrevious(function(e){function t(e,t){t.forEach(function(e){i["delete"](e[0])}),e.forEach(function(e){i.set(e[0],e[1])})}return observeRangeChange(e,t,n)}),n.nest(e));if(e.addMapChangeListener)return observeMapChange(e,t,n);var r=Object.keys(e).map(function(t){return _observeProperty(e,t,autoCancelPrevious(function(e){void 0===e?i["delete"](t):i.set(t,e)}),n)});return function(){cancelEach(r)}}}),n);return function(){r(),a()}}}function makeParentObserver(e){return function(t,n){return e(t,n.parent||n.nest())}}function makeConverterObserver(e,t,n){return function(i,r){return i=makeUniq(i),e(autoCancelPrevious(function(e){return i(t.call(n,e))}),r)}}function makeComputerObserver(e,t,n){return function(i,r){return i=makeUniq(i),e(autoCancelPrevious(function(e){return e&&e.every(Operators.defined)?i(t.apply(n,e)):void 0}),r)}}function makeExpressionObserver(e,t){var n=require("./parse"),i=require("./compile-observer");return function(r,a){return r=makeUniq(r),t(autoCancelPrevious(function(t){if(null==t)return r();var s,o;try{s=n(t),o=i(s)}catch(l){return r()}return e(autoCancelPrevious(function(e){return o(r,a.nest(e))}),a)}),a)}}function makeWithObserver(e,t){return function(n,i){return e(autoCancelPrevious(function(e){return t(autoCancelPrevious(function(e){return n(e)}),i.nest(e))}),i)}}function makeNonReplacing(e){return function(){var t=e.apply(this,arguments);return function(e,n){var i=[],r=t(autoCancelPrevious(function(e){function t(e,t,n){i.swap(n,t.length,e)}if(e){merge(i,e);var r=e.addRangeChangeListener(t,null,n.beforeChange);return once(r)}i.clear()}),n),a=e(i)||Function.noop;return once(function(){r(),a()})}}}function makeUniq(e){var t;return function(n){if(n!==t){var i=e.apply(this,arguments);return t=n,i}}}function cancelEach(e){e.forEach(function(e){e&&e()})}function autoCancelPrevious(e){var t=Function.noop;return function(){return t(),t=e.apply(this,arguments)||Function.noop,function(){t()}}}function once(e){var t;return function(){return t?Function.noop:(t=!0,e.apply(this,arguments))}}require("collections/shim");var PropertyChanges=require("collections/listen/property-changes");require("collections/listen/array-changes");var SortedArray=require("collections/sorted-array"),SortedSet=require("collections/sorted-set"),Map=require("collections/map"),Set=require("collections/set"),Heap=require("collections/heap"),Scope=require("./scope"),Operators=require("./operators");exports.makeLiteralObserver=makeLiteralObserver,exports.observeValue=observeValue,exports.observeParameters=observeParameters,exports.makeElementObserver=makeElementObserver,exports.makeComponentObserver=makeComponentObserver,exports.observeProperty=observeProperty;var _observeProperty=observeProperty;exports.makePropertyObserver=makePropertyObserver,exports.observeKey=observeGet,exports.observeGet=observeGet;var _observeGet=observeGet;exports.makeGetObserver=makeGetObserver,exports.makeHasObserver=makeHasObserver,exports.makeObserversObserver=makeObserversObserver,exports.makeRecordObserver=makeObjectObserver,exports.makeObjectObserver=makeObjectObserver,exports.makeTupleObserver=makeArrayObserver,exports.makeArrayObserver=makeArrayObserver,exports.makeOperatorObserverMaker=makeOperatorObserverMaker,exports.makeMethodObserverMaker=makeMethodObserverMaker,exports.makeNotObserver=makeNotObserver,exports.makeAndObserver=makeAndObserver,exports.makeOrObserver=makeOrObserver,exports.makeConditionalObserver=makeConditionalObserver,exports.makeDefinedObserver=makeDefinedObserver,exports.makeDefaultObserver=makeDefaultObserver;var makeMapBlockObserver=exports.makeMapBlockObserver=makeNonReplacing(makeReplacingMapBlockObserver),makeFilterBlockObserver=exports.makeFilterBlockObserver=makeNonReplacing(makeReplacingFilterBlockObserver);exports.makeSortedBlockObserver=makeSortedBlockObserver,exports.makeSortedSetBlockObserver=makeSortedSetBlockObserver,exports.makeReversedObserver=makeNonReplacing(makeReplacingReversedObserver);var makeFlattenObserver=exports.makeFlattenObserver=makeNonReplacing(makeReplacingFlattenObserver);exports.makeConcatObserver=makeConcatObserver,exports.makeSomeBlockObserver=makeSomeBlockObserver,exports.makeEveryBlockObserver=makeEveryBlockObserver,exports.makeGroupBlockObserver=makeGroupBlockObserver,exports.makeGroupMapBlockObserver=makeGroupMapBlockObserver,exports.makeMaxBlockObserver=makeMaxBlockObserver,exports.makeMinBlockObserver=makeMinBlockObserver,exports.makeMaxObserver=makeMaxObserver,exports.makeMinObserver=makeMinObserver;var observeLengthLiteral=makeLiteralObserver("length");exports.makeSumObserver=makeCollectionObserverMaker(function(){var e=0;return function(t,n){return t=t.filter(isNumber),n=n.filter(isNumber),e+=t.sum()-n.sum()}}),exports.makeAverageObserver=makeCollectionObserverMaker(function(){var e=0,t=0;return function(n,i){return n=n.filter(isNumber),i=i.filter(isNumber),e+=n.sum()-i.sum(),t+=n.length-i.length,e/t}}),exports.makeViewObserver=makeNonReplacing(makeReplacingViewObserver);var observeZero=makeLiteralObserver(0);exports.makeEnumerateObserver=makeNonReplacing(makeReplacingEnumerateObserver),exports.makeEnumerationObserver=exports.makeEnumerateObserver,exports.makeRangeObserver=makeRangeObserver,exports.makeStartsWithObserver=makeStartsWithObserver,exports.makeEndsWithObserver=makeEndsWithObserver,exports.makeContainsObserver=makeContainsObserver,exports.makeJoinObserver=makeJoinObserver;var observeNullString=makeLiteralObserver("");exports.observeRangeChange=observeRangeChange,exports.makeLastObserver=makeLastObserver,exports.observeLast=observeLast;var _observeLast=observeLast;exports.makeOnlyObserver=makeOnlyObserver,exports.observeOnly=observeOnly,exports.makeOneObserver=makeOneObserver,exports.observeOne=observeOne,exports.makeRangeContentObserver=makeRangeContentObserver,exports.makeMapContentObserver=makeMapContentObserver,exports.observeMapChange=observeMapChange;var makeEntriesObserver=exports.makeEntriesObserver=makeNonReplacing(makeReplacingEntriesObserver);exports.observeEntries=observeEntries,exports.makeKeysObserver=makeKeysObserver,exports.observeEntryKey=observeEntryKey,exports.makeValuesObserver=makeValuesObserver,exports.observeEntryValue=observeEntryValue,exports.makeToMapObserver=makeToMapObserver;var observeUniqueEntries=makeMapBlockObserver(makeGroupBlockObserver(observeValue,observeEntryKey),makeLastObserver(observeEntryValue));exports.makeParentObserver=makeParentObserver,exports.makeConverterObserver=makeConverterObserver,exports.makeComputerObserver=makeComputerObserver,exports.makePathObserver=makeExpressionObserver,exports.makeExpressionObserver=makeExpressionObserver,exports.makeWithObserver=makeWithObserver,exports.makeToArrayObserver=makeNonReplacing(Function.identity),exports.makeAsArrayObserver=exports.makeToArrayObserver;var merge=require("./merge").merge;exports.makeUniq=makeUniq,exports.cancelEach=cancelEach,exports.autoCancelPrevious=autoCancelPrevious,exports.once=once;