xbind
Version:
Sugar way to adapt the arguments signature of functions
43 lines (36 loc) • 1.11 kB
JavaScript
var arrayify = require('arrayify-slice');
var transforms = require('./lib/transforms.js');
module.exports = bind;
module.exports.identity = require('./lib/identity.js');
function bind(f, c) {
var hasCtx = arguments.length > 1;
var ctx = arguments[1];
var trs = [];
var xfn = function xfn() {
var c = hasCtx ? ctx : this;
var fn = typeof f === 'string' ? c[f] : f;
return fn.apply(c, transform(arguments));
}
xfn.xargs = function (o) {
trs.push([function () {
var fnArgs = this;
return arrayify(arguments).map(function (i) {
return fnArgs[i];
});
}, Array.isArray(o) ? o : arguments]);
return this;
};
Object.keys(transforms).forEach(function (k) {
var tr = transforms[k];
xfn[k] = function () {
trs.push([tr, arguments]);
return this;
};
});
function transform(args) {
return trs.reduce(function (args, tr) {
return tr[0].apply(args, tr[1] || []);
}, arrayify(args));
}
return xfn;
}