import { MapIterator, AsyncErrorCallback, Dictionary, NumericDictionary, MapResultCallback, PromiseResolver, PromiseRejector } from "../interfaces"; import { once } from "../common"; function seriesArray( data: T[], next: MapIterator, final?: MapResultCallback ): void { let results: T[] = []; let loop = function(i: number): void { if (i < data.length) { next(data[i], i, once(function(err: E, val: T): void { if (err !== null && err !== undefined) { final && final(err); } else { results.push(val); loop(i + 1); } })); } else { final && final(null, results); } }; loop(0); } function seriesDict( data: Dictionary, next: MapIterator, final: MapResultCallback ): void { let keys: string[] = []; let dataObject: Dictionary = {}, results: Dictionary = {}; for (let key in data) { keys.push(key); dataObject[key] = data[key]; } let loop = function(i: number): void { if (i < keys.length) { let key: string = keys[i]; next(data[key], key, once(function(err: E, val: T): void { if (err !== null && err !== undefined) { final(err); } else { results[key] = val; loop(i + 1); } })); } else { final(null, results); } }; loop(0); } /** * This method enum all items in an array or an object one by one, * with index value. */ export function series( data: Dictionary | T[], next: MapIterator, final: MapResultCallback ): void { if (data instanceof Array) { data = data.slice(); seriesArray(data, next, final); } else { seriesDict(data, next, final); } }; export function series_Promise( data: Dictionary | T[], next: MapIterator ): Promise { return new Promise(function( resolve: PromiseResolver, reject: PromiseRejector ): void { series(data, next, function(err?: E): void { err ? reject(err) : resolve(); }); }); }