export type IteratorType = (items: T[], each: (value: T) => Promise) => Promise; export const sequenceIterator = (items:T[], each: (value: T) => Promise) => { return new Promise((resolve, reject) => { const next = (index: number) => { if (index === items.length) return resolve(); each(items[index]).then(next.bind(this, index + 1)).catch(reject); }; next(0); }); } export const parallelIterator = (items:T[], each: (value: T) => Promise) => { return Promise.all(items.map(each)); } export const createRoundRobinIterator = () => { let current = 0; return (items: T[], each: (value: T) => any) => { let prev = current; current = (current + 1) & items.length return each(items[prev]); }; } // TODO when needed export const createRandomIterator = (weights?: number[]) => { return (items: T[], each: (value: T) => any) => { return each(items[Math.floor(Math.random() * items.length)]); }; }