import asyncForEach from './forEach.js'; function asyncFilter( arr: T[], fn: (cur: T, idx: number, arr: T[]) => Promise, ): Promise; function asyncFilter( arr: T[], fn: (cur: T, idx: number, arr: T[]) => Promise, ): Promise; function asyncFilter( arr: T[], fn: (cur: T, idx: number, arr: T[]) => Promise, ): Promise { const result: T[] = []; return asyncForEach( arr, (cur, idx, arr2) => new Promise((resolve, reject) => { fn(cur, idx, arr2) .then((cond) => { if (cond) { result[idx] = cur; } resolve(); }) .catch(reject); }), ).then(() => result.filter((_cur, idx) => idx in result)); } export default asyncFilter;