Functions as Pointers

by plus5keen

JavaScript

(function definePtr(global) {
    var e = {};

    var create = e.create = function(init) {
        var value = init;

        var result = function(cb) {
            var result;

            if (typeof cb === 'function') {
                result = cb(value);

                if (result !== void 0) {
                    value = result;
                }
            }

            return value;
        };
        
        result.set = function (newValue) {
            return value = newValue;
        };

        result.prop = function(key) {
            return create(value[key]);
        };

        result.link = function(key) {
            return function(cb) {
                var result;
    
                if (typeof cb === 'function') {
                    result = cb(value);
                }
    
                if (result !== void 0) {
                    value = result;
                }

                return value[key];
            };
        };

        return result;
    };

    global.ptr = e;
}(this));

(function test() {
    function meddle(prev, curr) {
        console.log('prev: ', prev());
        console.log('curr: ', curr());

        var cx = curr.prop('x');
        var cy = curr.prop('y');
        console.log('curr.x: ', cx());
        console.log('curr.y: ', cy());

        console.log('assigning curr value to prev using prev(curr)');
        prev(curr);

        console.log('prev: ', prev());
        console.log('curr: ', curr());
    }

    function testPtr(ptr) {
        var i, ptrs = [];

        console.log('populating');
        for (i = 0; i < 10; i++) {
            ptrs.push(ptr.create({
                x: 10 * i,
                y: 100 - 10 * i
            }));
        }

        console.log('meddling');
        for (i = 1; i < 10; i++) {
            console.log('i: ', i);
            meddle(ptrs[i - 1], ptrs[i]);
        }
    }

    testPtr(this.ptr);
}());