// ets_tracing: off import "../Operator/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 { Applicative, AssociativeEither, Monad } from "../Prelude/index.js" import * as R from "../Reader/index.js" export type V = HKT.CleanParam & HKT.V<"R", "-"> export function monad( M: Monad ): Monad<[HKT.URI, ...F], V> export function monad(M: Monad>) { return HKT.instance, ...HKT.UHKT], HKT.V<"R", "-">>>({ any: () => M.any, flatten: (ffa) => (r) => pipe( ffa(r), M.map((f) => f(r)), M.flatten ), map: (f) => (fa) => (r) => M.map(f)(fa(r)) }) } export function access( M: Monad ): Access<[HKT.URI, ...F], V> export function access(M: Monad>) { return HKT.instance, ...HKT.UHKT], HKT.V<"R", "-">>>({ access: (f) => pipe(R.access(f), R.map(succeedF(M))) }) } export function associativeEither( M: AssociativeEither ): AssociativeEither<[HKT.URI, ...F], V> export function associativeEither(M: AssociativeEither>) { return HKT.instance< AssociativeEither<[HKT.URI, ...HKT.UHKT], HKT.V<"R", "-">> >({ orElseEither: (fb) => (fa) => (r) => M.orElseEither(() => fb()(r))(fa(r)) }) } export function provide( M: Monad ): Provide<[HKT.URI, ...F], V> export function provide(M: Monad>) { return HKT.instance, ...HKT.UHKT], HKT.V<"R", "-">>>( { provide: (r) => R.provideSome(() => r) } ) } export function applicative( M: Applicative ): Applicative<[HKT.URI, ...F], V> export function applicative(M: Applicative>) { return HKT.instance< Applicative<[HKT.URI, ...HKT.UHKT], HKT.V<"R", "-">> >({ any: () => R.succeed(M.any()), map: (f) => R.map(M.map(f)), both: (fb) => (fa) => pipe( fa, R.zip(fb), R.map(({ tuple: [_a, _b] }) => M.both(_b)(_a)) ) }) } export function run( M: Run ): Run<[HKT.URI, ...F], V> export function run( M: Run> ): Run<[HKT.URI, ...HKT.UHKT2], HKT.V<"R", "-">> { return HKT.instance({ either: (fa) => pipe(fa, R.map(M.either)) }) } export function fail( M: Fail ): Fail<[HKT.URI, ...F], V> export function fail( M: Fail> ): Fail<[HKT.URI, ...HKT.UHKT2], HKT.V<"R", "-">> { return HKT.instance({ fail: (e) => pipe(e, M.fail, R.succeed) }) }