import type { MonadMin } from './Monad' import * as HKT from './HKT' import { Monad } from './Monad' export interface MonadState extends Monad { readonly get: GetFn readonly put: PutFn readonly modify: ModifyFn readonly gets: GetsFn } export type MonadStateMin = MonadMin & { readonly get: GetFn readonly put: PutFn readonly modify: ModifyFn readonly gets: GetsFn } export function MonadState(F: MonadStateMin): MonadState { return HKT.instance({ ...Monad(F), get: F.get, put: F.put, modify: F.modify, gets: F.gets }) } export interface GetFn { < S, N extends string = HKT.Initial, K = HKT.Initial, Q = HKT.Initial, W = HKT.Initial, X = HKT.Initial, I = HKT.Initial, R = HKT.Initial, E = HKT.Initial >(): HKT.Kind } export interface PutFn { < S, N extends string = HKT.Initial, K = HKT.Initial, Q = HKT.Initial, W = HKT.Initial, X = HKT.Initial, I = HKT.Initial, R = HKT.Initial, E = HKT.Initial >( s: S ): HKT.Kind } export interface GetsFn { < S, A, N extends string = HKT.Initial, K = HKT.Initial, Q = HKT.Initial, W = HKT.Initial, X = HKT.Initial, I = HKT.Initial, R = HKT.Initial, E = HKT.Initial >( f: (s: S) => A ): HKT.Kind } export interface ModifyFn { < S, A, N extends string = HKT.Initial, K = HKT.Initial, Q = HKT.Initial, W = HKT.Initial, X = HKT.Initial, I = HKT.Initial, R = HKT.Initial, E = HKT.Initial >( f: (s: S) => readonly [A, S] ): HKT.Kind }