From 0638fd964786330ea637fe10af73a9474d43493d Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Mon, 24 Oct 2016 21:32:52 +0200 Subject: [PATCH 1/2] another way to implement reduce with default initial value --- sinks/reduce.js | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/sinks/reduce.js b/sinks/reduce.js index e469370..6da0d3a 100644 --- a/sinks/reduce.js +++ b/sinks/reduce.js @@ -6,27 +6,23 @@ module.exports = function reduce (/* reducer, acc, cb */) { var reducer = arguments[0] var acc var cb - if (arguments.length === 3) { - acc = arguments[1] + var sink = drain(function (data) { + acc = reducer(acc, data) + }, function (err) { + cb(err, acc) + }) + if (arguments.length === 2) { cb = arguments[2] - return drain(function (data) { - acc = reducer(acc, data) - }, function (err) { - cb(err, acc) - }) + return function (source) { + source(null, function (end, data) { + //if ended immediately, and no initial... + if(end) return cb(end === true ? null : end) + acc = data; sink(source) + }) + } } else { - cb = arguments[1] - var first = true - return drain(function (data) { - if (first) { - acc = data - first = false - } else { - acc = reducer(acc, data) - } - }, function (err) { - cb(err, acc) - }) + acc = arguments[1] + cb = arguments[2] + return sink } } - From 6c5caa6f225a8f887bd50cc0ca3fe79876b24357 Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Mon, 24 Oct 2016 21:38:27 +0200 Subject: [PATCH 2/2] variable arguments the way I always do them --- sinks/reduce.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/sinks/reduce.js b/sinks/reduce.js index 6da0d3a..aeee20d 100644 --- a/sinks/reduce.js +++ b/sinks/reduce.js @@ -2,17 +2,14 @@ var drain = require('./drain') -module.exports = function reduce (/* reducer, acc, cb */) { - var reducer = arguments[0] - var acc - var cb +module.exports = function reduce (reducer, acc, cb ) { + if(!cb) cb = acc, acc = null var sink = drain(function (data) { acc = reducer(acc, data) }, function (err) { cb(err, acc) }) - if (arguments.length === 2) { - cb = arguments[2] + if (arguments.length === 2) return function (source) { source(null, function (end, data) { //if ended immediately, and no initial... @@ -20,9 +17,6 @@ module.exports = function reduce (/* reducer, acc, cb */) { acc = data; sink(source) }) } - } else { - acc = arguments[1] - cb = arguments[2] + else return sink - } }