Skip to content

Latest commit

 

History

History
56 lines (45 loc) · 1.68 KB

README.markdown

File metadata and controls

56 lines (45 loc) · 1.68 KB

Bindify

boost::bind-like binding for your javascript functions!

var b_fy = require('bindify')
function f(a, b) {
	return a + b
}
function g(a, b, c) {
	return a + b + c
}

// it works like regular bind, but doesn't pass
// the arguments you call the resulting function with
b_fy(f, null, 1, 2)(3); // f.call(null, 1, 2)

// but you can specify placeholder arguments!
b_fy(g, null, 3, b_fy(0), 5)(4); // g.call(null, 3, 4, 5)

function h(a, b, c) {
	return this.q + a + b + c
}

// it has a thisobj param too
b_fy(h, {q: 1}, 2, 3, 4)(); // h.call({q: 1}, 2, 3, 4)
// and you can put placeholders in it!
b_fy(h, b_fy(0), 2, 3, 4)({q: 1}); // h.call({q: 1}, 2, 3, 4)

// but wait, there's more:
function i(a, b, c) {
	return a.x + b.x + c.x
}
b_fy(i, {q: 1}, b_fy('this'), b_fy(0), b_fy('this')).call({x: 2}, {x: 4})
	// i.call({q: 1}, {x: 2}, {x: 4}, {x: 2})

// you get ._args too! it's like [].slice.call(arguments)
b_fy(function(a) { return a }, null, b_fy('args'))(1, 2, 3); // .call(null, [1,2,3])

// _argslice! call it like Array.prototype.slice and it will slice your arguments
// and apply them!
b_fy(function(a, b, c) { return this(a + b + c)}, b_fy(0), b_fy('argslice')(1))(console.log, 2, 3, 4)
	// .call(console.log, 2, 3, 4)

// and an actual use-case
Function.prototype.b_fy = b_fy(b_fy, null, b_fy('this'), b_fy('argslice')())

function step () {
	return [].reduceRight.call(arguments, function (f,g) {
		return g.bind(f) }) }
// equals			
var step = b_fy([].reduceRight, b_fy('args'), b_fy(Function.prototype.bind, b_fy(1), b_fy(0)))

// wrap stuff, in case you want to pass b_fy(0)
b_fy(function(){}, b_fy._wrap(b_fy(0)))