sig
  type 'a ref
  type ('a, 'b) reagent = ('a, 'b) t
  val mk_ref : '-> 'a ref
  val read : 'a ref -> (unit, 'a) reagent
  val read_imm : 'a ref -> 'a
  val cas : 'a ref -> '-> '-> (unit, unit) reagent
  val cas_imm : 'a ref -> '-> '-> bool
  val upd : 'a ref -> ('-> '-> ('a * 'c) option) -> ('b, 'c) reagent
end