Gozala / Gozala/streduce

pipe implementation

Open
#6 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
7
Forks
1
PR merge metrics
No merged PRs in 30d

Description

`pipe :: Reducible -> WritableStream -> Null`

`pipe` should move data from a Reducible into a WritableStream.

``` js
var reduce = require("reducible/reduce")
var end = require("reducible/end")
var isError = require("reducible/is-error")
var isReduced = require("reducible/is-reduced")
var reduced = require("reducible/reduced")

module.exports = pipe

function pipe(reducible, writableStream, options) {
var shouldEnd = !options || options.end !== false
var hasEnded = false

reduce(reducible, function (value) {
if (writableStream.writable === false || hasEnded) {
return reduced(null)
}

if (isError(value)) {
hasEnded = true
writableStream.destroy && writableStream.destroy()
writableStream.emit("error", value)
} else if (value === end) {
if (!writableStream._isStdio && shouldEnd) {
hasEnded = true
writableStream.end()
}
} else {
var hasDrained = writableStream.write(value)
}
})

writableStream.on("error", onerror)
writableStream.on("close", cleanup)
writableStream.on("end", cleanup)
writableStream.on("finish", cleanup)

function onerror(err) {
cleanup()
if (writableStream.listeners("error").length === 0) {
throw err // Unhandled stream error in pipe.
}
}

function cleanup() {
hasEnded = true
writableStream.removeListener("error", onerror)

writableStream.removeListener("close", cleanup)
writableStream.removeListener("end", cleanup)
writableStream.removeListener("finish", cleanup)
}
}
```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.