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

}