| 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 | |
| }
 |