// ets_tracing: off import "../Operator/index.js" import { pipe } from "../Function/index.js" import * as O from "../Option/index.js" import { succeedF } from "../Prelude/DSL/index.js" import type { Access, Provide } from "../Prelude/FX/index.js" import * as HKT from "../Prelude/HKT/index.js" import type { Applicative, Covariant, Monad } from "../Prelude/index.js" export function monad( M: Monad ): Monad<[F[0], ...HKT.Rest, HKT.URI], C> export function monad( M: Monad, C> ): Monad<[HKT.UHKT[0], HKT.URI], C> { const succeed = succeedF(M) return HKT.instance[0], HKT.URI], C>>({ any: () => succeed(O.some({})), flatten: (x) => pipe( x, M.map((o) => (o._tag === "None" ? succeed(O.none) : o.value)), M.flatten ), map: (f) => M.map(O.map(f)) }) } export function applicative( M: Applicative ): Applicative<[F[0], ...HKT.Rest, HKT.URI], C> export function applicative( M: Applicative, C> ): Applicative<[HKT.UHKT[0], HKT.URI], C> { const succeed = succeedF(M) return HKT.instance[0], HKT.URI], C>>({ any: () => succeed(O.some({})), map: (f) => M.map(O.map(f)), both: (fb) => (x) => pipe( x, M.both(fb), M.map(({ tuple: [a, b] }) => O.zip_(a, b)) ) }) } export function access( M: Access & Covariant ): Access<[F[0], ...HKT.Rest, HKT.URI], C> export function access(M: Access> & Covariant>) { return HKT.instance[0], HKT.URI]>>({ access: (f) => pipe(M.access(f), M.map(O.some)) }) } export function provide( M: Provide ): Provide<[F[0], ...HKT.Rest, HKT.URI], C> export function provide(M: Provide>) { return HKT.instance[0], HKT.URI]>>({ provide: M.provide }) }