sig
  type 'a stm
  val return : 'a -> 'a Stm.stm
  val bind : 'a Stm.stm -> ('a -> 'b Stm.stm) -> 'b Stm.stm
  val ( >>= ) : 'a Stm.stm -> ('a -> 'b Stm.stm) -> 'b Stm.stm
  val ( >> ) : 'a Stm.stm -> 'b Stm.stm -> 'b Stm.stm
  val abort : 'a Stm.stm
  val retry : 'a Stm.stm
  val retry_now : 'a Stm.stm
  val wait : unit Stm.stm
  val or_else : 'a Stm.stm -> 'a Stm.stm -> 'a Stm.stm
  val catch : 'a Stm.stm -> (exn -> 'a Stm.stm) -> 'a Stm.stm
  val atom_once : 'a Stm.stm -> 'a option
  val atom : 'a Stm.stm -> 'a
  type 'a tvar
  val tvar : 'a -> 'a Stm.tvar
  val new_tvar : 'a -> 'a Stm.tvar Stm.stm
  val read_tvar : 'a Stm.tvar -> 'a Stm.stm
  val write_tvar : 'a Stm.tvar -> 'a -> unit Stm.stm
end