summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraeme Yeates <yeatesgraeme@gmail.com>2015-08-24 18:00:41 -0400
committerGraeme Yeates <yeatesgraeme@gmail.com>2015-08-24 18:12:43 -0400
commit6fbc797d1ea42272ff929e295e872b0625b15d48 (patch)
tree12ebffaff1805758006627b629f7d8b20d8981d7
parentb2fded336afaef589eddb602b29a228faffcb21e (diff)
downloadasync-transform.tar.gz
Add async.transformtransform
-rw-r--r--lib/async.js16
-rwxr-xr-xtest/test-async.js53
2 files changed, 68 insertions, 1 deletions
diff --git a/lib/async.js b/lib/async.js
index 1f1e0ef..f8d9019 100644
--- a/lib/async.js
+++ b/lib/async.js
@@ -379,7 +379,7 @@
callback(err);
});
}, function (err) {
- callback(err || null, memo);
+ callback(err, memo);
});
};
@@ -389,6 +389,20 @@
async.reduce(reversed, memo, iterator, callback);
};
+ async.transform = function (arr, memo, iterator, callback) {
+ if (arguments.length === 3) {
+ callback = iterator;
+ iterator = memo;
+ memo = _isArray(arr) ? [] : {};
+ }
+
+ async.eachOf(arr, function(v, k, cb) {
+ iterator(memo, v, k, cb);
+ }, function(err) {
+ callback(err, memo);
+ });
+ };
+
function _filter(eachfn, arr, iterator, callback) {
var results = [];
eachfn(arr, function (x, index, callback) {
diff --git a/test/test-async.js b/test/test-async.js
index 18894b0..a6af0e4 100755
--- a/test/test-async.js
+++ b/test/test-async.js
@@ -2023,6 +2023,59 @@ exports['foldr alias'] = function(test){
test.done();
};
+exports['transform implictly determines memo if not provided'] = function(test){
+ async.transform([1,2,3], function(memo, x, v, callback){
+ memo.push(x + 1);
+ callback();
+ }, function(err, result){
+ test.same(result, [2, 3, 4]);
+ test.done();
+ });
+};
+
+exports['transform async with object memo'] = function(test){
+ test.expect(2);
+
+ async.transform([1,3,2], {}, function(memo, v, k, callback){
+ setTimeout(function() {
+ memo[k] = v;
+ callback();
+ });
+ }, function(err, result) {
+ test.equals(err, null);
+ test.same(result, {
+ 0: 1,
+ 1: 3,
+ 2: 2
+ });
+ test.done();
+ });
+};
+
+exports['transform iterating object'] = function(test){
+ test.expect(2);
+
+ async.transform({a: 1, b: 3, c: 2}, function(memo, v, k, callback){
+ setTimeout(function() {
+ memo[k] = v + 1;
+ callback();
+ });
+ }, function(err, result) {
+ test.equals(err, null);
+ test.same(result, {a: 2, b: 4, c: 3});
+ test.done();
+ });
+};
+
+exports['transform error'] = function(test){
+ async.transform([1,2,3], function(a, v, k, callback){
+ callback('error');
+ }, function(err){
+ test.equals(err, 'error');
+ test.done();
+ });
+};
+
exports['filter'] = function(test){
async.filter([3,1,2], filterIterator, function(results){
test.same(results, [3,1]);