something-something
Version:
a little asynchronous functional programming library.
181 lines (168 loc) • 4.32 kB
JavaScript
// Generated by CoffeeScript 1.7.1
(function() {
var accumulator, all, any, collect, each, filter, handle, id, isArray, map;
isArray = Array.isArray || function(arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
};
id = function(k, v, c) {
return v;
};
collect = function(k, v, c) {
if (v) {
return c[k];
}
};
accumulator = function(collection) {
if (isArray(collection)) {
return [];
} else {
return {};
}
};
each = function(collection, iterator, complete, convert) {
var cb, count, fail, failed, iterate, key, keys, length, _i, _j, _len, _ref, _results, _results1;
keys = isArray(collection) ? (function() {
_results = [];
for (var _i = 0, _ref = collection.length; 0 <= _ref ? _i < _ref : _i > _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
return _results;
}).apply(this) : Object.keys(collection);
failed = false;
fail = function(error) {
failed = true;
return complete(error);
};
length = keys.length;
count = 0;
cb = function(key) {
return function(error, value) {
if (failed) {
return;
}
if (error) {
return fail(error);
}
convert(key, value);
count += 1;
if (count === length) {
return complete();
}
};
};
iterate = (function() {
switch (iterator.length) {
case 2:
return function(key, value) {
return iterator(value, cb(key));
};
case 3:
return function(key, value) {
return iterator(key, value, cb(key));
};
case 4:
return function(key, value) {
return iterator(key, value, collection, cb(key));
};
default:
throw new Error('Ambiguous iterator signature');
}
})();
_results1 = [];
for (_j = 0, _len = keys.length; _j < _len; _j++) {
key = keys[_j];
_results1.push(iterate(key, collection[key]));
}
return _results1;
};
handle = function(complete, result) {
if (complete == null) {
return (function() {});
}
return function(error) {
if (error) {
return complete(error);
} else {
return complete(null, result);
}
};
};
map = function(collection, iterator, complete) {
var cb, convert, result;
result = accumulator(collection);
cb = handle(complete, result);
convert = function(key, value) {
return result[key] = value;
};
return each(collection, iterator, cb, convert);
};
filter = function(collection, iterator, complete) {
var cb, convert, result;
result = accumulator(collection);
cb = handle(complete, result);
convert = function(key, value) {
if (isArray(collection)) {
if (value) {
return result.push(collection[key]);
}
} else {
if (value) {
return result[key] = collection[key];
}
}
};
return each(collection, iterator, cb, convert);
};
any = function(collection, iterator, complete) {
var cb, convert, finish, finished;
finished = false;
finish = handle(complete, false);
cb = function(error) {
if (!finished) {
return finish(error);
}
};
convert = function(key, value) {
if (finished) {
return;
}
if (value) {
finished = true;
if (complete) {
return complete(null, true);
}
}
};
return each(collection, iterator, cb, convert);
};
all = function(collection, iterator, complete) {
var cb, convert, finish, finished;
finished = false;
finish = handle(complete, true);
cb = function(error) {
if (!finished) {
return finish(error);
}
};
convert = function(key, value) {
if (finished) {
return;
}
if (!value) {
finished = true;
if (complete) {
return complete(null, false);
}
}
};
return each(collection, iterator, cb, convert);
};
module.exports = {
map: map,
collect: map,
filter: filter,
select: filter,
any: any,
some: any,
all: all,
every: all
};
}).call(this);