2020-07-30 23:40:16 +00:00
|
|
|
export const sequence = function sequence<T, R> (
|
|
|
|
tasks: T[],
|
|
|
|
fn: (task: T) => R
|
|
|
|
) {
|
2020-07-02 13:02:35 +00:00
|
|
|
return tasks.reduce(
|
2020-07-30 23:40:16 +00:00
|
|
|
(promise, task): any => promise.then(() => fn(task)),
|
2020-07-02 13:02:35 +00:00
|
|
|
Promise.resolve()
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2020-07-30 23:40:16 +00:00
|
|
|
export const parallel = function parallel<T, R> (
|
|
|
|
tasks: T[],
|
|
|
|
fn: (task: T) => R
|
|
|
|
) {
|
2020-07-02 13:02:35 +00:00
|
|
|
return Promise.all(tasks.map(fn))
|
|
|
|
}
|
|
|
|
|
|
|
|
export const chainFn = function chainFn (base, fn) {
|
|
|
|
if (typeof fn !== 'function') {
|
|
|
|
return base
|
|
|
|
}
|
|
|
|
return function (...args) {
|
|
|
|
if (typeof base !== 'function') {
|
|
|
|
return fn.apply(this, args)
|
|
|
|
}
|
|
|
|
let baseResult = base.apply(this, args)
|
|
|
|
// Allow function to mutate the first argument instead of returning the result
|
|
|
|
if (baseResult === undefined) {
|
|
|
|
[baseResult] = args
|
|
|
|
}
|
|
|
|
const fnResult = fn.call(
|
|
|
|
this,
|
|
|
|
baseResult,
|
|
|
|
...Array.prototype.slice.call(args, 1)
|
|
|
|
)
|
|
|
|
// Return mutated argument if no result was returned
|
|
|
|
if (fnResult === undefined) {
|
|
|
|
return baseResult
|
|
|
|
}
|
|
|
|
return fnResult
|
|
|
|
}
|
|
|
|
}
|