1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(* SPDX-License-Identifier: AGPL-3.0-or-later *)
(* Copyright © 2021-2026 OCamlPro *)
(* Written by the Owi programmers *)
type 'a t = Abstract_state.t -> ('a * Abstract_state.t) option
let return x = fun state -> Some (x, state)
let bind f m = fun state -> Option.bind (m state) (fun (x, state) -> f x state)
let map f m = fun state -> Option.map (fun (x, state) -> (f x, state)) (m state)
let ( let* ) m f = bind f m
let ( let+ ) m f = map f m
let map_state f =
fun state ->
let state = f state in
Option.map (fun state -> ((), state)) state
let fold_state f = fun state -> Some (f state, state)
let run m state = m state