diff options
Diffstat (limited to 'build/es/memoize.js')
-rw-r--r-- | build/es/memoize.js | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/build/es/memoize.js b/build/es/memoize.js new file mode 100644 index 0000000..184f0d6 --- /dev/null +++ b/build/es/memoize.js @@ -0,0 +1,36 @@ +'use strict'; + +import identity from 'lodash-es/identity'; +import rest from 'lodash-es/rest'; + +import setImmediate from './internal/setImmediate'; + +export default function memoize(fn, hasher) { + var memo = {}; + var queues = {}; + hasher = hasher || identity; + var memoized = rest(function memoized(args) { + var callback = args.pop(); + var key = hasher.apply(null, args); + if (key in memo) { + setImmediate(function() { + callback.apply(null, memo[key]); + }); + } else if (key in queues) { + queues[key].push(callback); + } else { + queues[key] = [callback]; + fn.apply(null, args.concat([rest(function(args) { + memo[key] = args; + var q = queues[key]; + delete queues[key]; + for (var i = 0, l = q.length; i < l; i++) { + q[i].apply(null, args); + } + })])); + } + }); + memoized.memo = memo; + memoized.unmemoized = fn; + return memoized; +} |