import { provide } from '@typed/env'
import { Arity1, curry } from '@typed/lambda'
import { fork } from './fork'
import { Future, PureFuture } from './Future'
export const chainLeft = curry(__chainLeft) as {
(fn: Arity1>, future: Future): Future<
E1 & E2,
B,
C
>
(fn: Arity1>): (
future: Future,
) => Future
}
function __chainLeft(
fn: Arity1>,
future: Future,
): Future {
return Future.create((reject, resolve, env) =>
fork(
(left: A) => fork(reject, resolve, provide(fn(left), env) as PureFuture),
resolve,
provide(future, env) as PureFuture,
),
)
}