function createMutex(doWork) {
  const mutex = {}

  return function (key, payload, callback) {
    if (mutex[key]) {
      mutex[key].push(callback)
    } else {
      mutex[key] = [ function () {
        delete mutex[key]
      }, callback ]

      doWork(payload, function (error, value) {
        mutex[key].forEach(function (callback) {
          callback(error, value)
        })
      })
    }
  }
}

module.exports = createMutex