// ets_tracing: off import { pipe } from "../../Function/index.js" import type { Has, Tag } from "../../Has/index.js" import type { AssociativeFlatten } from "../AssociativeFlatten/index.js" import type { Access, Provide } from "../FX/index.js" import type * as HKT from "../HKT/index.js" import type { Monad } from "../Monad/index.js" export function accessMF( F: Access & AssociativeFlatten ): ( f: (r: HKT.OrFix<"R", C, R2>) => HKT.Kind ) => HKT.Kind export function accessMF( F: Access> & AssociativeFlatten> ): (f: (r: R) => HKT.HKT3) => HKT.HKT3 { return (x) => pipe(x, F.access, F.flatten) } export function accessServiceMF>( F: Monad & Access ): ( H: Tag ) => ( f: (_: Service) => HKT.Kind ) => HKT.Kind, E, A> export function accessServiceMF( F: Monad, HKT.V<"R", "-">> & Access, HKT.V<"R", "-">> ) { return (H: Tag) => ( f: (_: Service) => HKT.HKT3 ): HKT.HKT3 & R, E, A> => accessMF(F)((x: Has) => pipe(x, H.read, f)) } export function provideServiceF>( F: Monad & Access & Provide ): ( H: Tag ) => ( S: Service ) => ( fa: HKT.Kind, E, A> ) => HKT.Kind export function provideServiceF( F: Monad, HKT.V<"R", "-">> & Access, HKT.V<"R", "-">> & Provide, HKT.V<"R", "-">> ) { return (H: Tag) => (S: Service) => (fa: HKT.HKT3 & R, E, A>): HKT.HKT3 => accessMF(F)((r: R) => pipe(fa, F.provide({ ...r, [H.key]: S } as unknown as R & Has)) ) } export function provideSomeF( F: Monad & Access & Provide ): ( f: (_: HKT.OrFix<"R", C, R2>) => HKT.OrFix<"R", C, R> ) => ( fa: HKT.Kind ) => HKT.Kind export function provideSomeF( F: Monad> & Access> & Provide> ) { return (f: (r0: R0) => R) => (fa: HKT.HKT3): HKT.HKT3 => accessMF(F)((r0: R0) => pipe(fa, F.provide(f(r0)))) }