import { AsksInstruction, GiveInstruction } from "./model"; import { succeed } from "./constructors"; import type { XPure } from "./model"; export const ask = (): XPure => new AsksInstruction((r: R) => succeed(r)); export const asksM = (f: (r: R0) => XPure): XPure => new AsksInstruction(f); export const asks = (f: (r: R0) => A) => asksM((r: R0) => succeed(f(r))); export const giveAll_ = (fa: XPure, r: R): XPure => new GiveInstruction(fa, r); export const giveAll = (r: R) => (fa: XPure) => giveAll_(fa, r); export const local_ = (ma: XPure, f: (r0: R0) => R) => asksM((r: R0) => giveAll_(ma, f(r))); export const local = (f: (r0: R0) => R) => (ma: XPure) => local_(ma, f); export const give_ = (ma: XPure, r: R): XPure => local_(ma, (r0) => ({ ...r, ...r0 })); export const give = (r: R) => (ma: XPure): XPure => give_(ma, r);