// ets_tracing: off import "../Operator/index.js" import * as E from "../Either/index.js" import { pipe } from "../Function/index.js" import { succeedF } from "../Prelude/DSL/index.js" import type { Access, Fail, Provide, Run } from "../Prelude/FX/index.js" import * as HKT from "../Prelude/HKT/index.js" import type { Any, Applicative, Covariant, Monad, URI } from "../Prelude/index.js" export type V = HKT.CleanParam & HKT.V<"E", "+"> export function monad( M: Monad ): Monad<[F[0], ...HKT.Rest, URI], V> export function monad(M: Monad>) { const succeed = succeedF(M) return HKT.instance[0], URI], HKT.V<"E", "+">>>({ any: () => succeedF(M)(E.right({})), flatten: ( ffa: HKT.HKT>>> ): HKT.HKT> => pipe( ffa, M.map((e) => (e._tag === "Left" ? succeed>(e) : e.right)), M.flatten ), map: (f) => M.map(E.map(f)) }) } export function applicative( M: Applicative ): Applicative<[F[0], ...HKT.Rest, URI], V> export function applicative(M: Applicative>) { return HKT.instance[0], URI], HKT.V<"E", "+">>>( { any: () => succeedF(M)(E.right({})), map: (f) => M.map(E.map(f)), both: (fb) => (x) => pipe( x, M.both(fb), M.map(({ tuple: [ea, eb] }) => E.AssociativeBoth.both(eb)(ea)) ) } ) } export function run( M: Covariant ): Run<[F[0], ...HKT.Rest, URI], V> export function run(M: Covariant>) { return HKT.instance[0], URI], HKT.V<"E", "+">>>({ either: < ( fa: HKT.HKT> ) => HKT.HKT>> >M.map(E.Run.either) }) } export function fail( M: Any & Covariant ): Fail<[F[0], ...HKT.Rest, URI], V> export function fail(M: Any> & Covariant>) { const succeed = succeedF(M) return HKT.instance[0], URI], HKT.V<"E", "+">>>({ fail: (x) => pipe(x, E.left, succeed) }) } export function access( M: Access & Covariant ): Access<[F[0], ...HKT.Rest, URI], V> export function access(M: Access> & Covariant>) { return HKT.instance[0], URI], HKT.V<"E", "+">>>({ access: (f) => pipe(M.access(f), M.map(E.right)) }) } export function provide( M: Provide ): Provide<[F[0], ...HKT.Rest, URI], V> export function provide(M: Provide>) { return HKT.instance[0], URI], HKT.V<"E", "+">>>({ provide: M.provide }) }