import type * as TC from "@principia/prelude"; import { getApplicativeComposition, getCovariantFunctorComposition, pureF } from "@principia/prelude"; import * as HKT from "@principia/prelude/HKT"; import type { Either } from "../Either"; import * as E from "../Either"; import { pipe } from "../Function"; export type V = HKT.CleanParam & HKT.V<"E", "+">; export function Applicative( F: TC.Applicative ): TC.Applicative, V>; export function Applicative( F: TC.Applicative> ): TC.Applicative, E.URI>, HKT.V<"E", "+">> { return HKT.instance, E.URI>, HKT.V<"E", "+">>>({ ...getApplicativeComposition(F, E.Applicative) }); } export function Monad(M: TC.Monad): TC.Monad, V>; export function Monad(M: TC.Monad>): TC.Monad, E.URI>, HKT.V<"E", "+">> { const pure = pureF(M); return HKT.instance, E.URI>, HKT.V<"E", "+">>>({ ...getCovariantFunctorComposition(M, E.Functor), flatten: (mma: HKT.HKT>>>) => pipe(mma, M.map(E.fold((e) => pure(E.widenE()(E.left(e))), M.map(E.widenE()))), M.flatten), unit: () => pure(E.unit()) }); }