// ets_tracing: off import type { Async } from "./core.js" import { chain_, map_, succeed } from "./core.js" /** * Binds an effectful value in a `do` scope * * @ets_data_first bind_ */ function bind( tag: Exclude, f: (_: K) => Async ) { return ( mk: Async ): Async< R & R2, E | E2, K & { [k in N]: A } > => bind_(mk, tag, f) } /** * Binds an effectful value in a `do` scope */ export function bind_( mk: Async, tag: Exclude, f: (_: K) => Async ): Async< R & R2, E | E2, K & { [k in N]: A } > { return chain_(mk, (k) => map_( f(k), ( a ): K & { [k in N]: A } => ({ ...k, [tag]: a } as any) ) ) } /** * Like bind for values * * @ets_data_first let_ */ function let__(tag: Exclude, f: (_: K) => A) { return ( mk: Async ): Async< R2, E2, K & { [k in N]: A } > => let_(mk, tag, f) } /** * Like bind for values */ export function let_( mk: Async, tag: Exclude, f: (_: K) => A ): Async< R2, E2, K & { [k in N]: A } > { return map_( mk, ( k ): K & { [k in N]: A } => ({ ...k, [tag]: f(k) } as any) ) } const do_ = succeed({}) export { let__ as let, bind, do_ as do }