From db445a899d08b2b2a5c9f0249f380d59ab819ec8 Mon Sep 17 00:00:00 2001 From: Zach Dahl Date: Sat, 29 Oct 2016 00:24:18 -0500 Subject: [PATCH] add stream folder with scan and scan-merge --- stream/scan-merge.js | 26 +++++++++++ stream/scan.js | 14 ++++++ stream/tests/index.html | 17 +++++++ stream/tests/test-stream.js | 90 +++++++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+) create mode 100644 stream/scan-merge.js create mode 100644 stream/scan.js create mode 100644 stream/tests/index.html create mode 100644 stream/tests/test-stream.js diff --git a/stream/scan-merge.js b/stream/scan-merge.js new file mode 100644 index 00000000..c0a0628e --- /dev/null +++ b/stream/scan-merge.js @@ -0,0 +1,26 @@ +//! adapted for mithril from flyd https://github.com/paldepind/flyd +'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/scan.js b/stream/scan.js new file mode 100644 index 00000000..4f65736e --- /dev/null +++ b/stream/scan.js @@ -0,0 +1,14 @@ +//! adapted for mithril from flyd https://github.com/paldepind/flyd +'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/tests/index.html b/stream/tests/index.html new file mode 100644 index 00000000..69cf025e --- /dev/null +++ b/stream/tests/index.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/stream/tests/test-stream.js b/stream/tests/test-stream.js new file mode 100644 index 00000000..bdaee92b --- /dev/null +++ b/stream/tests/test-stream.js @@ -0,0 +1,90 @@ +'use strict' + +var o = require('../../ospec/ospec') + +o.spec('stream', function () { + var prop + + o.beforeEach(function () { + prop = require('../../stream') + }) + + o.spec('scan', function () { + var scan + + o.beforeEach(function () { + scan = require('../scan') + }) + + o('defaults to seed', function () { + var parent = prop() + var child = scan(function (out, p) { + return out - p + }, 123, parent) + o(child()).equals(123) + }) + + o('accumulates values as expected', function () { + var parent = prop() + var child = scan(function (arr, p) { + return arr.concat(p) + }, [], parent) + + parent(7) + parent('11') + parent(undefined) + parent({ a: 1 }) + var result = child() + + // deepEquals fails on arrays? + o(result[0]).equals(7) + o(result[1]).equals('11') + o(result[2]).equals(undefined) + o(result[3]).deepEquals({ a: 1 }) + }) + }) + + o.spec('scanMerge', function () { + var scanMerge + + o.beforeEach(function () { + scanMerge = require('../scan-merge') + }) + + o('defaults to seed', function () { + var parent1 = prop() + var parent2 = prop() + + var child = scanMerge([ + [parent1, function (out, p1) { + return out + p1 + }], + [parent2, function (out, p2) { + return out + p2 + }] + ], -10) + + o(child()).equals(-10) + }) + + o('accumulates as expected', function () { + var parent1 = prop() + var parent2 = prop() + + var child = scanMerge([ + [parent1, function (out, p1) { + return out + p1 + }], + [parent2, function (out, p2) { + return out + p2 + p2 + }] + ], 'a') + + parent1('b') + parent2('c') + parent1('b') + + o(child()).equals('abccb') + }) + }) +})