package lsp
Source file fdecl.ml
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 31 32 33 34 35type 'a state = | Unset | Set of 'a type 'a t = { mutable state : 'a state ; to_dyn : 'a -> Dyn.t } let create to_dyn = { state = Unset; to_dyn } let set t new_ = match t.state with | Unset -> t.state <- Set new_ | Set old -> Code_error.raise "Fdecl.set: already set" [ ("old", t.to_dyn old); ("new_", t.to_dyn new_) ] let set_idempotent ~equal t new_ = match t.state with | Unset -> t.state <- Set new_ | Set old -> if not (equal new_ old) then Code_error.raise "Fdecl.set_idempotent: already set to a different value" [ ("old", t.to_dyn old); ("new_", t.to_dyn new_) ] let get t = match t.state with | Unset -> Code_error.raise "Fdecl.get: not set" [] | Set x -> x let to_dyn t = match t.state with | Unset -> Dyn.Encoder.constr "Unset" [] | Set a -> Dyn.Encoder.constr "Set" [ t.to_dyn a ]