You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
935 B
42 lines
935 B
var wrappy = require('wrappy') |
|
module.exports = wrappy(once) |
|
module.exports.strict = wrappy(onceStrict) |
|
|
|
once.proto = once(function () { |
|
Object.defineProperty(Function.prototype, 'once', { |
|
value: function () { |
|
return once(this) |
|
}, |
|
configurable: true |
|
}) |
|
|
|
Object.defineProperty(Function.prototype, 'onceStrict', { |
|
value: function () { |
|
return onceStrict(this) |
|
}, |
|
configurable: true |
|
}) |
|
}) |
|
|
|
function once (fn) { |
|
var f = function () { |
|
if (f.called) return f.value |
|
f.called = true |
|
return f.value = fn.apply(this, arguments) |
|
} |
|
f.called = false |
|
return f |
|
} |
|
|
|
function onceStrict (fn) { |
|
var f = function () { |
|
if (f.called) |
|
throw new Error(f.onceError) |
|
f.called = true |
|
return f.value = fn.apply(this, arguments) |
|
} |
|
var name = fn.name || 'Function wrapped with `once`' |
|
f.onceError = name + " shouldn't be called more than once" |
|
f.called = false |
|
return f |
|
}
|
|
|