import { dual } from 'effect/Function';
import { Effect as E, Array, pipe } from 'effect';
import { Concurrency } from 'effect/Types';
type Options = { concurrency?: Concurrency; delayMs?: number };
const _allMap = <A, R, Err, B>(
items: A[],
f: (a: A) => E.Effect<B, Err, R>,
options: Options = {},
): E.Effect<B[], Err, R> => {
const { concurrency, delayMs = 0 } = options;
const total = items.length;
return pipe(
items,
Array.map((a, i) =>
pipe(
f(a),
E.tap(() => E.log(`Processed ${i + 1}/${total}`)),
E.delay(delayMs),
),
),
E.allWith({ concurrency }),
);
};
// dual API
export const allMap: {
<A, R, Err, B>(
f: (a: A) => E.Effect<B, Err, R>,
options?: Options,
): (items: A[]) => E.Effect<B[], Err, R>;
<A, R, Err, B>(
items: A[],
f: (a: A) => E.Effect<B, Err, R>,
options?: Options,
): E.Effect<B[], Err, R>;
} = dual(3, _allMap);
import { dual } from 'effect/Function';
import { Effect as E, Array, pipe } from 'effect';
import { Concurrency } from 'effect/Types';
type Options = { concurrency?: Concurrency; delayMs?: number };
const _allMap = <A, R, Err, B>(
items: A[],
f: (a: A) => E.Effect<B, Err, R>,
options: Options = {},
): E.Effect<B[], Err, R> => {
const { concurrency, delayMs = 0 } = options;
const total = items.length;
return pipe(
items,
Array.map((a, i) =>
pipe(
f(a),
E.tap(() => E.log(`Processed ${i + 1}/${total}`)),
E.delay(delayMs),
),
),
E.allWith({ concurrency }),
);
};
// dual API
export const allMap: {
<A, R, Err, B>(
f: (a: A) => E.Effect<B, Err, R>,
options?: Options,
): (items: A[]) => E.Effect<B[], Err, R>;
<A, R, Err, B>(
items: A[],
f: (a: A) => E.Effect<B, Err, R>,
options?: Options,
): E.Effect<B[], Err, R>;
} = dual(3, _allMap);