/** * Binds an effectful value in a `do` scope * * @tsplus static effect/core/io/Effect.Aspects bind * @tsplus pipeable effect/core/io/Effect bind */ export function bind( tag: Exclude, f: (_: K) => Effect ) { return (self: Effect): Effect< R | R2, E | E2, MergeRecord< K, { [k in N]: A } > > => self.flatMap((k) => f(k).map( ( a ): MergeRecord< K, { [k in N]: A } > => ({ ...k, [tag]: a } as any) ) ) } /** * Like bind for values * * @tsplus static effect/core/io/Effect.Aspects bindValue * @tsplus pipeable effect/core/io/Effect bindValue */ export function bindValue(tag: Exclude, f: (_: K) => A) { return (self: Effect): Effect< R, E, MergeRecord< K, { [k in N]: A } > > => self.map( ( k ): MergeRecord< K, { [k in N]: A } > => ({ ...k, [tag]: f(k) } as any) ) } /** * @tsplus static effect/core/io/Effect.Ops Do */ export function Do(): Effect { return Effect.succeed({}) }