diff --git a/lib/d.js b/lib/d.js new file mode 100644 index 0000000..5ea9737 --- /dev/null +++ b/lib/d.js @@ -0,0 +1,20 @@ +'use strict'; + +var forEach = require('es5-ext/object/for-each') + , callable = require('es5-ext/object/valid-callable') + , lazy = require('d/lazy') + + , a = [], b = []; + +module.exports = function (fn) { + var index = a.indexOf(callable(fn)); + if (index !== -1) return b[index]; + index = a.push(fn); + return (b[index - 1] = function (props) { + forEach(props, function (desc, name) { + var value = callable(desc.value); + desc.value = function (options) { return fn(value.bind(this), options); }; + }); + return lazy(props); + }); +}; diff --git a/package.json b/package.json index 8098c81..2d63ff8 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "node": ">=0.4" }, "dependencies": { - "es5-ext": "git://github.com/medikoo/es5-ext", + "d": "git://github.com/medikoo/d.git", + "es5-ext": "git://github.com/medikoo/es5-ext.git", "event-emitter": "~0.2.2", "next-tick": "0.1.x" }, diff --git a/test/d.js b/test/d.js new file mode 100644 index 0000000..f418838 --- /dev/null +++ b/test/d.js @@ -0,0 +1,33 @@ +'use strict'; + +var d = require('d') + , memoize = require('../lib/regular'); + +module.exports = function (t, a) { + var value = [], obj = {}; + t = t(memoize); + Object.defineProperties(obj, t({ + someFn: d(function (x, y) { a(this, obj); return x + y; }, + { refCounter: true, + dispose: function (val) { value.push(val); } }) + })); + + obj = Object.create(obj); + obj.someFn(3, 7); + obj.someFn(5, 8); + obj.someFn(12, 4); + a.deep(value, [], "Pre"); + obj.someFn(5, 8); + obj.someFn.clearRef(5, 8); + a.deep(value, [], "Pre"); + obj.someFn.clearRef(5, 8); + a.deep(value, [13], "#1"); + value = []; + obj.someFn.clearRef(12, 4); + a.deep(value, [16], "#2"); + + value = []; + obj.someFn(77, 11); + obj.someFn.clearAll(); + a.deep(value, [10, 88], "Clear all"); +}; \ No newline at end of file