// ets_tracing: off import "../../Operator/index.js" import type * as Tp from "@effect-ts/system/Collections/Immutable/Tuple" 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, Monad } from "../../Prelude/index.js" import * as R from "../XReader/index.js" export function monad( M: Monad ): Monad<[HKT.URI, ...F], HKT.CleanParam & HKT.V<"R", "-">> export function monad( M: Monad> ): Monad<[HKT.URI, ...HKT.UHKT], HKT.V<"R", "-">> { return HKT.instance({ any: () => R.succeed(M.any()), flatten: ( ffa: R.XReader>>> ): R.XReader> => pipe( R.access((e: R & R2) => pipe(ffa, R.runEnv(e), M.map(R.runEnv(e)))), R.map(M.flatten) ), map: ( f: (a: A) => B ): ((fa: R.XReader>) => R.XReader>) => R.map(M.map(f)) }) } export function access( M: Monad ): Access<[HKT.URI, ...F], HKT.CleanParam & HKT.V<"R", "-">> export function access( M: Monad> ): Access<[HKT.URI, ...HKT.UHKT], HKT.V<"R", "-">> { return HKT.instance({ access: (x) => pipe(x, R.access, R.map(succeedF(M))) }) } export function provide( M: Monad ): Provide<[HKT.URI, ...F], HKT.CleanParam & HKT.V<"R", "-">> export function provide( _: Monad> ): Provide<[HKT.URI, ...HKT.UHKT], HKT.V<"R", "-">> { return HKT.instance({ provide: (r: R) => R.provideSome(() => r) }) } export function applicative( M: Applicative ): Applicative<[HKT.URI, ...F], HKT.CleanParam & HKT.V<"R", "-">> export function applicative( M: Applicative> ): Applicative<[HKT.URI, ...HKT.UHKT], HKT.V<"R", "-">> { return HKT.instance({ any: () => R.succeed(M.any()), map: ( f: (a: A) => B ): ((fa: R.XReader>) => R.XReader>) => R.map(M.map(f)), both: ( fb: R.XReader> ): (( fa: R.XReader> ) => R.XReader>>) => (x) => pipe( x, R.zip(fb), R.map(({ tuple: [_a, _b] }) => pipe(_a, M.both(_b))) ) }) } export function run( M: Run ): Run<[HKT.URI, ...F], HKT.CleanParam & HKT.V<"R", "-">> export function run( M: Run> ): Run<[HKT.URI, ...HKT.UHKT2], HKT.V<"R", "-">> { return HKT.instance({ either: (x) => pipe(x, R.map(M.either)) }) } export function fail( M: Fail ): Fail<[HKT.URI, ...F], HKT.CleanParam & HKT.V<"R", "-">> export function fail( M: Fail> ): Fail<[HKT.URI, ...HKT.UHKT2], HKT.V<"R", "-">> { return HKT.instance({ fail: (x) => pipe(x, M.fail, R.succeed) }) }