var eos = require('end-of-stream') var shift = require('stream-shift') module.exports = each function each (stream, fn, cb) { var want = true var error = null var ended = false var running = false var calling = false stream.on('readable', onreadable) onreadable() if (cb) eos(stream, {readable: true, writable: false}, done) return stream function done (err) { if (!error) error = err ended = true if (!running) cb(error) } function onreadable () { if (want) read() } function afterRead (err) { running = false if (err) { error = err if (ended) return cb(error) stream.destroy(err) return } if (ended) return cb(error) if (!calling) read() } function read () { while (!running && !ended) { want = false var data = shift(stream) if (data === null) { want = true return } running = true calling = true fn(data, afterRead) calling = false } } }