1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(** Copyright 2025-2026, Georgiy Belyanin, Ignat Sergeev *)

(** SPDX-License-Identifier: LGPL-3.0-or-later *)

module M (S : sig
    type t
  end) =
struct
  type state = S.t
  type 'a t = state -> 'a * state

  let return v st = v, st

  let ( >>= ) m f st =
    let v, st' = m st in
    f v st'
  ;;

  let ( let* ) = ( >>= )
  let get st = st, st
  let put st v = v, st
  let run m = m
end