// ets_tracing: off import { pipe, tuple } from "../../Function/index.js" import type { StateInURI, StateOutURI } from "../../Modules/index.js" import { chainF } from "../../Prelude/DSL/index.js" import * as HKT from "../../Prelude/HKT/index.js" import type { Auto, Monad } from "../../Prelude/index.js" /** * Take over ownership of "S" making it invariant */ export type V = HKT.CleanParam & HKT.V<"S", "_"> export type StateT = [ HKT.URI, ...F, HKT.URI ] export interface StateIn { (s: S): A } export type StateOut = readonly [A, S] export function monad(M: Monad): Monad, V> export function monad(M: Monad>): Monad>, V> { return HKT.instance({ any: () => (s: S): HKT.HKT => pipe( M.any(), M.map((m) => tuple(m, s)) ), flatten: ( ffa: ( s: S2 ) => HKT.HKT HKT.HKT, S2]> ): ((s: S2) => HKT.HKT) => (x) => pipe( x, ffa, chainF(M)(([f, us]) => f(us)) ), map: (f: (a: A) => B) => ( fa: (s: S) => HKT.HKT ): ((s: S) => HKT.HKT) => (x) => pipe( x, fa, M.map(([a, s]) => tuple(f(a), s)) ) }) }