sig
  type 'a t
  exception No_more
  val create : '-> 'Shistory.t
  val push : '-> 'Shistory.t -> 'Shistory.t
  val get : 'Shistory.t -> 'a
  val undo : 'Shistory.t -> 'a * 'Shistory.t
  val redo : 'Shistory.t -> 'a * 'Shistory.t
  val can_redo : 'Shistory.t -> bool
  val as_list : 'Shistory.t -> 'a list
  type 'a imp_t
  val imp_create : '-> 'Shistory.imp_t
  val imp_push : '-> 'Shistory.imp_t -> unit
  val imp_get : 'Shistory.imp_t -> 'a
  val imp_undo : 'Shistory.imp_t -> 'a
  val imp_redo : 'Shistory.imp_t -> 'a
  val imp_can_redo : 'Shistory.imp_t -> bool
  val imp_as_list : 'Shistory.imp_t -> 'a list
  val imp_to_t : 'Shistory.imp_t -> 'Shistory.t
  val t_to_imp : 'Shistory.t -> 'Shistory.imp_t
end