/** * @since 0.24.0 */ import { dual, identity } from "effect/Function" import type { Kind, TypeClass, TypeLambda } from "effect/HKT" /** * @category type class * @since 0.24.0 */ export interface FlatMap extends TypeClass { readonly flatMap: { ( f: (a: A) => Kind ): (self: Kind) => Kind ( self: Kind, f: (a: A) => Kind ): Kind } } /** * @since 0.24.0 */ export const flatten = (F: FlatMap) => ( self: Kind> ): Kind => F.flatMap(self, identity) /** * A variant of `flatMap` that ignores the value produced by this effect. * * @since 0.24.0 */ export const zipRight = (F: FlatMap): { ( that: Kind ): (self: Kind) => Kind ( self: Kind, that: Kind ): Kind } => dual(2, ( self: Kind, that: Kind ): Kind => F.flatMap(self, () => that)) /** * @since 0.24.0 */ export const composeK = ( F: FlatMap ): { ( bfc: (b: B) => Kind ): ( afb: (a: A) => Kind ) => (a: A) => Kind ( afb: (a: A) => Kind, bfc: (b: B) => Kind ): (a: A) => Kind } => dual( 2, ( afb: (a: A) => Kind, bfc: (b: B) => Kind ): (a: A) => Kind => (a) => F.flatMap(afb(a), bfc) )