Skip to content

Instantly share code, notes, and snippets.

@gregtatum
Created January 21, 2015 18:27
Show Gist options
  • Save gregtatum/50e15a2f747aba0ccfa7 to your computer and use it in GitHub Desktop.
Save gregtatum/50e15a2f747aba0ccfa7 to your computer and use it in GitHub Desktop.
Wrapped Value
function extendBind(target, object, state) {
var keys = Object.keys(object);
var i = keys.length;
while (i--) {
target[keys[i]] = object[keys[i]].bind(state);
}
return target;
}
function identityOrSet( v ) {
var f = function( value ) {
if( value === undefined ) {
return v;
} else {
v = value;
return f;
}
}
return f;
}
var methods = {
add : function( v ) {
return this.value(this.value() + v)
},
multiply : function( v ) {
return this.value(this.value() * v)
}
}
function v(v) {
var value = identityOrSet(v);
return extendBind(value, methods, { value: value });
}
var wrappedValue = v(1);
wrappedValue();
// > 1
v(1).add(2).multiply(10)();
// > 30
// Note the mutation:
wrappedValue.multiply(10);
// > wrappedValue
wrappedValue();
// > 10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment