import { AsyncErrorCallback, FlowFunction, FlowNextCallback, Dictionary } from "../interfaces"; export function flow( start: string, fns: Dictionary>, final?: AsyncErrorCallback ): void { let tmp: Dictionary> = {}; for (let key in fns) { tmp[key] = fns[key]; } fns = tmp; let loop = function(next: string, ...args: any[]): void { if (fns[next]) { fns[next](function(next: string, err?: E, ...args: any[]): void { // do not disable duplicated invocation to next callback. if (err !== null && err !== undefined) { final && final(err); } else { loop(next, ...args); } }, ...args); } else { final && final(); } }; loop(start); }