import { bind_, bindTo_, flow, pipe } from "../Function"; import { pure } from "./applicative"; import { map, map_ } from "./functor"; import { chain } from "./monad"; /* * ------------------------------------------- * Do Array * ------------------------------------------- */ const of: ReadonlyArray<{}> = pure({}); export { of as do }; export const bindS = ( name: Exclude, f: (_: K) => ReadonlyArray ): (( mk: ReadonlyArray ) => ReadonlyArray< { [k in N | keyof K]: k extends keyof K ? K[k] : A; } >) => chain((a) => pipe( f(a), map((b) => bind_(a, name, b)) ) ); export const bindTo = (name: Exclude) => ( fa: ReadonlyArray ): ReadonlyArray<{ [k in Exclude]: A }> => map_(fa, bindTo_(name)); export const letS = (name: Exclude, f: (_: K) => A) => bindS(name, flow(f, pure));