/*
 *  utils.js
 *
 *  Extend Array and Object to have utility functions
 */

var utils = new Object();

// map
if (!Array.prototype.map) {
    Array.prototype.map = function(f) {
        var length = this.length;
        var r = [];
        for (var i=0; i < length; i++) { r[i] = f(this[i]); }
        return r;
    };
}

// foreach
if (!Array.prototype.foreach) {
    Array.prototype.foreach = function(f) {
        var length = this.length;
        for (var i=0; i < length; i++) { f(this[i]); }
    };
}

// grep
if (!Array.prototype.grep) {
    Array.prototype.grep = function(f) {
        var length = this.length;
        var r = [];
        for (var i=0; i < length; i++) { 
            if (f(this[i])) { r.push(this[i]); }
        }
        return r;
    };
}

// member
if (!Array.prototype.member) {
    Array.prototype.member = function(v) {
        var length = this.length;
        for (var i=0; i < length; i++) { 
            if (this[i] == v) { return true; }
        }
        return false;
    };
}

// last
if (!Array.prototype.last) {
    Array.prototype.last = function() {
        return this[this.length-1];
    };
}

// without
if (!Array.prototype.without) {
    Array.prototype.without = function(v) {
        var length = this.length;
        var r = [];
        for (var i=0; i < length; i++) { 
            if (this[i] != v) { r.push(this[i]); }
        }
        return r;
    };
}


// The breaks the crap out of a lot of things, so link it on a per-instance basis.

//if (!Object.prototype.keys) {
//    Object.prototype.keys = function() {
utils.keys = function(o) {
    var r = [];
    for (var k in o) { 
        if (k != 'keys') { r.push(k); }
    }
    return r;
}

