sig
  type 'a t = 'a * [ `New | `Same ]
  val return_same : 'a -> 'a SimplM.t
  val return_new : 'a -> 'a SimplM.t
  val return : 'a -> 'a SimplM.t
  val return_opt : old:'a -> 'a option -> 'a SimplM.t
  val get : 'a SimplM.t -> 'a
  val is_new : 'a SimplM.t -> bool
  val is_same : 'a SimplM.t -> bool
  val ( >>= ) : 'a SimplM.t -> ('a -> 'b SimplM.t) -> 'b SimplM.t
  val map : ('a -> 'b) -> 'a SimplM.t -> 'b SimplM.t
  val app_list : ('a -> 'a SimplM.t) list -> 'a -> 'a SimplM.t
  val map_l : ('a -> 'b SimplM.t) -> 'a list -> 'b list SimplM.t
  val fold_l : ('a -> 'b -> 'a SimplM.t) -> 'a -> 'b list -> 'a SimplM.t
  module Infix :
    sig
      val ( >>= ) : 'a SimplM.t -> ('a -> 'b SimplM.t) -> 'b SimplM.t
      val ( >|= ) : 'a SimplM.t -> ('a -> 'b) -> 'b SimplM.t
    end
end