export default function waterfall( arr: T1[] = [], func: (val: T1, prevVal: T2) => Promise | T2, start?: T2, ): Promise { if (!Array.isArray(arr)) { arr = [arr]; } return arr.reduce(function (promise: Promise, innerVal: any) { return promise.then(function (prevVal) { return func(innerVal, prevVal); }); }, Promise.resolve(start)); }