diff --git a/stream/scan.js b/stream/scan.js deleted file mode 100644 index 84b6e0a2..00000000 --- a/stream/scan.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict" - -var combine = require("./stream").combine - -module.exports = function (reducer, seed, stream) { - var newStream = combine(function (s) { - return seed = reducer(seed, s._state.value) - }, [stream]) - - if (newStream._state.state === 0) newStream(seed) - - return newStream -} diff --git a/stream/scanMerge.js b/stream/scanMerge.js deleted file mode 100644 index 088440fa..00000000 --- a/stream/scanMerge.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict" - -var combine = require("./stream").combine - -module.exports = function(tuples, seed) { - var streams = tuples.map(function(tuple) { - var stream = tuple[0] - if (stream._state.state === 0) stream(undefined) - return stream - }) - - var newStream = combine(function() { - var changed = arguments[arguments.length - 1] - - streams.forEach(function(stream, idx) { - if (changed.indexOf(stream) > -1) { - seed = tuples[idx][1](seed, stream._state.value) - } - }) - - return seed - }, streams) - - return newStream -} diff --git a/stream/stream.js b/stream/stream.js index 9704f4fe..a5ddc341 100644 --- a/stream/stream.js +++ b/stream/stream.js @@ -109,13 +109,48 @@ function merge(streams) { return streams.map(function(s) {return s()}) }, streams) } + +function scan(reducer, seed, stream) { + var newStream = combine(function (s) { + return seed = reducer(seed, s._state.value) + }, [stream]) + + if (newStream._state.state === 0) newStream(seed) + + return newStream +} + +function scanMerge(tuples, seed) { + var streams = tuples.map(function(tuple) { + var stream = tuple[0] + if (stream._state.state === 0) stream(undefined) + return stream + }) + + var newStream = combine(function() { + var changed = arguments[arguments.length - 1] + + streams.forEach(function(stream, idx) { + if (changed.indexOf(stream) > -1) { + seed = tuples[idx][1](seed, stream._state.value) + } + }) + + return seed + }, streams) + + return newStream +} + createStream["fantasy-land/of"] = createStream createStream.merge = merge createStream.combine = combine +createStream.scan = scan +createStream.scanMerge = scanMerge createStream.HALT = HALT if (typeof module !== "undefined") module["exports"] = createStream else if (typeof window.m === "function" && !("stream" in window.m)) window.m.stream = createStream else window.m = {stream : createStream} -}()); \ No newline at end of file +}()); diff --git a/stream/tests/test-scan.js b/stream/tests/test-scan.js index 5b44cdab..db5d885f 100644 --- a/stream/tests/test-scan.js +++ b/stream/tests/test-scan.js @@ -2,12 +2,11 @@ var o = require("../../ospec/ospec") var stream = require("../stream") -var scan = require("../scan") o.spec("scan", function() { o("defaults to seed", function() { var parent = stream() - var child = scan(function(out, p) { + var child = stream.scan(function(out, p) { return out - p }, 123, parent) o(child()).equals(123) @@ -15,7 +14,7 @@ o.spec("scan", function() { o("accumulates values as expected", function() { var parent = stream() - var child = scan(function(arr, p) { + var child = stream.scan(function(arr, p) { return arr.concat(p) }, [], parent) diff --git a/stream/tests/test-scanMerge.js b/stream/tests/test-scanMerge.js index 1e396176..cbf1e7f1 100644 --- a/stream/tests/test-scanMerge.js +++ b/stream/tests/test-scanMerge.js @@ -2,14 +2,13 @@ var o = require("../../ospec/ospec") var stream = require("../stream") -var scanMerge = require("../scanMerge") o.spec("scanMerge", function() { o("defaults to seed", function() { var parent1 = stream() var parent2 = stream() - var child = scanMerge([ + var child = stream.scanMerge([ [parent1, function(out, p1) { return out + p1 }], @@ -25,7 +24,7 @@ o.spec("scanMerge", function() { var parent1 = stream() var parent2 = stream() - var child = scanMerge([ + var child = stream.scanMerge([ [parent1, function(out, p1) { return out + p1 }],