You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.2 KiB
47 lines
1.2 KiB
'use strict' |
|
|
|
var values = require('../sources/values') |
|
var once = require('../sources/once') |
|
|
|
//convert a stream of arrays or streams into just a stream. |
|
module.exports = function flatten () { |
|
return function (read) { |
|
var _read |
|
return function (abort, cb) { |
|
if (abort) { //abort the current stream, and then stream of streams. |
|
_read ? _read(abort, function(err) { |
|
read(err || abort, cb) |
|
}) : read(abort, cb) |
|
} |
|
else if(_read) nextChunk() |
|
else nextStream() |
|
|
|
function nextChunk () { |
|
_read(null, function (err, data) { |
|
if (err === true) nextStream() |
|
else if (err) { |
|
read(true, function(abortErr) { |
|
// TODO: what do we do with the abortErr? |
|
cb(err) |
|
}) |
|
} |
|
else cb(null, data) |
|
}) |
|
} |
|
function nextStream () { |
|
_read = null |
|
read(null, function (end, stream) { |
|
if(end) |
|
return cb(end) |
|
if(Array.isArray(stream) || stream && 'object' === typeof stream) |
|
stream = values(stream) |
|
else if('function' != typeof stream) |
|
stream = once(stream) |
|
_read = stream |
|
nextChunk() |
|
}) |
|
} |
|
} |
|
} |
|
} |
|
|
|
|