1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(** Copyright 2025, Tenyaeva Ekaterina *)
(** SPDX-License-Identifier: LGPL-3.0-or-later *)
module StateR (S : sig
type state
type error
end) =
struct
type state = S.state
type error = S.error
type 'a t = state -> state * ('a, error) result
let return v st = st, Ok v
let ( >>= ) m f st =
let s1, r = m st in
match r with
| Error e -> s1, Error e
| Ok v -> f v s1
;;
let ( >>| ) m f = m >>= fun x -> return (f x)
let ( let* ) = ( >>= )
let ( let+ ) = ( >>| )
let get st = st, Ok st
let put new_st _st = new_st, Ok ()
let fail e st = st, Error e
let run m st = m st
end