'use strict' var wrap = require('./wrap.js') module.exports = trough trough.wrap = wrap var slice = [].slice // Create new middleware. function trough() { var fns = [] var middleware = {} middleware.run = run middleware.use = use return middleware // Run `fns`. Last argument must be a completion handler. function run() { var index = -1 var input = slice.call(arguments, 0, -1) var done = arguments[arguments.length - 1] if (typeof done !== 'function') { throw new Error('Expected function as last argument, not ' + done) } next.apply(null, [null].concat(input)) // Run the next `fn`, if any. function next(err) { var fn = fns[++index] var params = slice.call(arguments, 0) var values = params.slice(1) var length = input.length var pos = -1 if (err) { done(err) return } // Copy non-nully input into values. while (++pos < length) { if (values[pos] === null || values[pos] === undefined) { values[pos] = input[pos] } } input = values // Next or done. if (fn) { wrap(fn, next).apply(null, input) } else { done.apply(null, [null].concat(input)) } } } // Add `fn` to the list. function use(fn) { if (typeof fn !== 'function') { throw new Error('Expected `fn` to be a function, not ' + fn) } fns.push(fn) return middleware } }