var wrappy = require('wrappy')
var reqs = Object.create(null)
var once = require('once')

module.exports = wrappy(inflight)

function inflight(key, cb) {
    if (reqs[key]) {
        reqs[key].push(cb)
        return null
    } else {
        reqs[key] = [cb]
        return makeres(key)
    }
}

function makeres(key) {
    return once(function RES() {
        var cbs = reqs[key]
        var len = cbs.length
        var args = slice(arguments)
        for (var i = 0; i < len; i++) {
            cbs[i].apply(null, args)
        }
        if (cbs.length > len) {
            // added more in the interim.
            // de-zalgo, just in case, but don't call again.
            cbs.splice(0, len)
            process.nextTick(function () {
                RES.apply(null, args)
            })
        } else {
            delete reqs[key]
        }
    })
}

function slice(args) {
    var length = args.length
    var array = []

    for (var i = 0; i < length; i++) array[i] = args[i]
    return array
}
