OrderedMap

by mmarcon

HTML

<section id="console">
</section>

CSS

@import url(http://fonts.googleapis.com/css?family=Anonymous+Pro);

#console {
    margin: 1em;
    font-family: 'Anonymous Pro', monospaced;
}

JavaScript

var OrderedMap = function() {
    var storage = [];
    storage.map = {};
    this.length = 0;
    
    this.push = function() {
        var a, arg;
        for (a in arguments) {
            arg = arguments[a];
            storage.push (arg);
            if (arg.id) {
                storage.map [arg.id] = {pos: storage.length - 1, data: arg};
            }
        }
        this.length = storage.length;
    };
    
    this.unshift = function() {
        var a, arg, ma;
        for (a in arguments) {
            arg = arguments[a];
            storage.unshift (arg);
            if (arg.id) {
                for (ma in storage.map) {
                    if (storage.map [ma] && storage.map [ma].pos) {
                        storage.map [ma].pos ++;
                    }
                }
                storage.map [arg.id] = {pos: 0, data: arg};
            }
        }
        this.length = storage.length;
    };
    
    this.put = function (key, value) {
        storage.push (value);
        storage.map [key] = {pos: storage.length - 1, data: value};
    };
    
    this.get = function (key) {
        var s = storage.map [key];
        return s ? s.data : null;
    };
    
    this.remove = function (key) {
        var index = storage.map [key].pos;
        storage.splice (index, 1);
        storage.map [key] = null;
        delete storage.map [key];
    };
    
    this.getAtPosition = function (pos) {
        return storage [pos];
    };
};

$(function(){
    function log (message) {
        $('#console').append('<p>' + message + '</p>');
    }
    
    log ('------------');
    log ('OrderedMap');
    log ('Version: 0.1');
    log ('------------');
    
    var om = new OrderedMap();
    log ('Initialized OrderedMap. Length is ' + om.length);
    om.push ({a: 0, b: 0, id: 1}, {a: 2, b: 3, id: 2});
    log ('Added objects to OrderedMap. Length is ' + om.length);
    log ('Object with id = 1 is ' + JSON.stringify (om.get(1)));
    log ('Removing object with...