fastladder/fastladder

View on GitHub
app/assets/javascripts/lib/utils/proto.js

Summary

Maintainability
A
55 mins
Test Coverage
/*
 Prototype拡張
*/
Function.empty = function(){};

/*
 String.prototype
*/
String.prototype.startWith = function(str){
    return this.indexOf(str) == 0
};
String.prototype.aroundTag = function(tag){
    return ["<",tag,">",this,"</",tag,">"].join("")
};
String.prototype.strip_tags = function(){
    return this.replace(/<.*?>/g, "")
};

/*
String.prototype.escapeHTML = function() {
    var div = document.createElement('div');
    var text = document.createTextNode(this);
    div.appendChild(text);
    return div.innerHTML;
};
String.prototype.unescapeHTML = function() {
    var div = document.createElement('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
};
*/
// 簡易テンプレート
String.prototype.fill  = function(){
    var param = {};
    Array.from(arguments).forEach(function(o){
        extend(param,o)
    })
    return this.replace(/\[\[(.*?)\]\]/g,function($0,$1){
        var key = $1.strip();
        return param[key] ? param[key] : "";
    })
};
/*
 Number.prototype
*/
Number.prototype.toRelativeDate = function(){
    var k = this > 0 ? this : -this;
    var u = "sec";
    var jp = {
        sec : "秒",
        min : "分",
        hour: "時間",
        day : "日",
        Mon : "ヶ月"
    };
    var vec = this >= 0 ? "前" : "後";
    var st = 0;
    (k>=60) ? (k/=60,u="min",st=1) : 0;
    (st && k>=60) ? (k/=60,u="hour",st=1) : st=0;
    (st && k>=24) ? (k/=24,u="day" ,st=1) : st=0;
    (st && k>=30) ? (k/=30,u="Mon" ,st=1) : st=0;
    k = Math.floor(k);
    v = jp[u];
    return (isNaN(k)) ? "nan" : k+v+vec;
}

Array.prototype.reject = function(callback, thisObj){
    return this.filter(callback.invert(), thisObj);
}

Array.prototype.filter_by = function(attr,value){
    return this.filter(function(v){
        return v[attr] == value
    })
}
Array.prototype.sum = function(){
    var sum = 0;
    this.forEach(function(v){
        sum += v;
    });
    return sum;
};
Array.prototype.sum_of = function(name){
    return this.pluck(name).sum();
};
// documentFragmentに変換
Array.prototype.toDF = function(){
    var nodelist = this;
    var df = document.createDocumentFragment();
    foreach(nodelist,function(node){
        df.appendChild(node)
    });
    return df;
};
// 条件に一致する最初のoffset値を返す
Array.prototype.indexOfA = function(callback,thisObj){
    for(var i=0,len=this.length;i<len;i++){
        if(callback.call(thisObj,this[i],i,this)){
            return i
        }
    }
    return -1
}
// 複数の関数をひとつにまとめる
Array.prototype.asCallback = function(){
    var self = this;
    var args = arguments;
    return function(){
        return self.map(function(fn){
            return fn.apply(self,args)
        })
    }
}

Array.prototype.indexOfStr = function(searchElement,fromIndex){
    searchElement = "" + searchElement;
    var i = (fromIndex < 0) ? this.length+fromIndex : fromIndex || 0;
    for(;i<this.length;i++)
        if(searchElement == this[i]) return i;
    return -1
};

Array.prototype.mode = function(){
    var hash = {};
    var len = this.length;
    this.forEach(function(v,i){
        hash[v] = hash[v] ? hash[v]+1 : 1;
    });
    var mode = keys(hash).sort(function(a,b){
        return  hash[b] - hash[a];
    });
    return mode[0];
};

Array.prototype.sort_by = function(key){
    return this.sort(function(a,b){
        return(
            a[key] == b[key] ? 0:
            a[key] <  b[key] ? 1: -1
        )
    })
}

// 補完
Array.prototype.like = function(str){
    var res;
    var find = 0;
    this.forEach(function(v){
        if(find) return;
        if(v.startWith(str)){
            find = 1;
            res  = v;
        }
    });
    return res;
}

/*
 Function.prototype
*/
Function.prototype.add_bench = function(id){
    var self = this;
    return function(){
        var start = new Date;
        var res = self.apply(this,arguments);
        var end = new Date;
        _$(id).innerHTML = end-start + "ms";
        return res;
    }
};
// 束縛
Function.prototype.curry = function () {
    var args = Array.from(arguments);
    var self = this;
    return function () {
        return self.apply(this, args.concat(Array.from(arguments)));
    };
};
Function.prototype.bindArgs = Function.prototype.curry;

Function.prototype.addAfter = function(callback){
    var self = this;
    return function(){
        var res = self.apply(this, arguments);
        if(isFunction(callback)){
            callback();
        }
        return res;
    }
}


Function.prototype.later = function(ms){
    var self = this;
    return function(){
        var args = arguments;
        var thisObject = this;
        var res = {
            complete: false,
            cancel: function(){clearTimeout(PID);},
            notify: function(){clearTimeout(PID);later_func()}
        };
        var later_func = function(){
            self.apply(thisObject,args);
            res.complete = true;
        };
        var PID = setTimeout(later_func,ms);
        return res;
    };
};

Function.prototype.invert = function(){
    var self = this;
    return function(){
        var res = self.apply(this, arguments);
        return res ? false : true;
    }
}

Function.prototype.next = function(fn){
    var self = this;
    fn = isFunction(fn) ? fn : Function.empty;
    return function(){
        var res = self.apply(this,arguments);
        fn();
        return res;
    }
};