1 | /** Used to detect hot functions by number of calls within a span of milliseconds. */
|
2 | var HOT_COUNT = 800,
|
3 | HOT_SPAN = 16;
|
4 |
|
5 | /* Built-in method references for those with the same name as other `lodash` methods. */
|
6 | var nativeNow = Date.now;
|
7 |
|
8 | /**
|
9 | * Creates a function that'll short out and invoke `identity` instead
|
10 | * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
|
11 | * milliseconds.
|
12 | *
|
13 | * @private
|
14 | * @param {Function} func The function to restrict.
|
15 | * @returns {Function} Returns the new shortable function.
|
16 | */
|
17 | function shortOut(func) {
|
18 | var count = 0,
|
19 | lastCalled = 0;
|
20 |
|
21 | return function() {
|
22 | var stamp = nativeNow(),
|
23 | remaining = HOT_SPAN - (stamp - lastCalled);
|
24 |
|
25 | lastCalled = stamp;
|
26 | if (remaining > 0) {
|
27 | if (++count >= HOT_COUNT) {
|
28 | return arguments[0];
|
29 | }
|
30 | } else {
|
31 | count = 0;
|
32 | }
|
33 | return func.apply(undefined, arguments);
|
34 | };
|
35 | }
|
36 |
|
37 | module.exports = shortOut;
|