UNPKG

scarlet

Version:

The simple fast javascript interceptor for methods and properties.

109 lines (92 loc) 2.64 kB
var assert = require("assert"); function Enumerable() { "use strict"; var self = this; self.__typename__ = "scarlet.lib.extensions.Enumerable"; self.arrayFor = function(array, callback) { for (var i = 0; i < array.length; i++) { callback(array[i], i, array); } }; self.funcFor = function(object, callback) { for (var key in object) { callback(object[key], key, object); } }; self.stringFor = function(string, callback) { self.arrayFor(string.split(""), function(chr, index) { callback(chr, index, string); }); }; self.allEach = function(object, callback) { Object.getOwnPropertyNames(object).forEach(function(property) { callback(object[property], property, object); }); }; self.forEach = function(object, callback) { if (object) { var resolve = self.funcFor; if (object instanceof Function) { resolve = self.funcFor; } else if (typeof object == "string") { resolve = self.stringFor; } else if (typeof object.length == "number") { resolve = self.arrayFor; } resolve(object, callback); } }; self.any = function(object, predicateCallback) { var isTrue = false; self.forEach(object, function(element, index) { if (!predicateCallback(element, index)) return; isTrue = true; return; }); return isTrue; }; self.where = function(object, predicateCallback) { var results = []; self.forEach(object, function(element) { if (predicateCallback(element)) results.push(element); }); return results; }; self.first = function(object, predicateCallback) { if (typeof(predicateCallback) == "undefined" && typeof(object) != "undefined" && object.length > 0) { return object[0]; } var results = self.where(object, predicateCallback); if (results.length > 0) return results[0]; return null; }; self.mapSeries = function(functions, onEach, onComplete) { assert(typeof functions.length === "number", "Object to map must be an array"); if (!this) return new self.mapSeries(functions, onEach, onComplete); var results = []; var thisContext = this; var functionNumber = 0; var next = function() { var nextfunction = functions[functionNumber]; functionNumber++; return nextfunction; }; var finalResult = null; thisContext._proceed = function(error, result) { if (result !== undefined) results.push(result); var nextfunction = next(); if (nextfunction) onEach(error, nextfunction, thisContext._proceed); else if (onComplete) finalResult = onComplete(error, results); return finalResult; }; thisContext._proceed(); }; } module.exports = new Enumerable();