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, ), ) }