sig
  module type S_WITHOUT_STATE =
    sig
      type obs
      type t
      val create : unit -> t
      val compare : t -> t -> int
      val total_ord : t -> t -> int
      val add_alias : t -> t -> unit
      val do_normalize : t -> unit
      val add_observer : obs -> t -> unit
      val remove_observer : obs -> t -> unit
      val string_of : t -> string
      val reset : unit -> unit
      val get_all_ts : unit -> t list
      type img
      module I : sig type key type img end
      val domain : t -> MapVar.S_WITHOUT_STATE.I.key list
      val find' :
        MapVar.S_WITHOUT_STATE.I.key ->
        t -> MapVar.S_WITHOUT_STATE.I.img option
      val find_or_add :
        create:(unit -> MapVar.S_WITHOUT_STATE.I.img) ->
        key:MapVar.S_WITHOUT_STATE.I.key ->
        map:t -> MapVar.S_WITHOUT_STATE.I.img
      val iter :
        (MapVar.S_WITHOUT_STATE.I.key -> MapVar.S_WITHOUT_STATE.I.img -> unit) ->
        t -> unit
      val fold :
        (MapVar.S_WITHOUT_STATE.I.key ->
         MapVar.S_WITHOUT_STATE.I.img -> '-> 'a) ->
        t -> '-> 'a
      val make_write_equal :
        (MapVar.S_WITHOUT_STATE.I.key -> MapVar.S_WITHOUT_STATE.I.key -> int) ->
        (MapVar.S_WITHOUT_STATE.I.img -> MapVar.S_WITHOUT_STATE.I.img -> unit) ->
        t -> t -> MapVar.S_WITHOUT_STATE.I.key -> unit
      val string_of_map : t -> string
      val string_of_with_img : t -> string
    end
  module type S =
    sig
      type obs
      type t
      val create : unit -> t
      val compare : t -> t -> int
      val total_ord : t -> t -> int
      val add_alias : t -> t -> unit
      val do_normalize : t -> unit
      val add_observer : obs -> t -> unit
      val remove_observer : obs -> t -> unit
      val string_of : t -> string
      val reset : unit -> unit
      val get_all_ts : unit -> t list
      type img
      module I : sig type key type img end
      val domain : t -> I.key list
      val find' : I.key -> t -> I.img option
      val find_or_add : create:(unit -> I.img) -> key:I.key -> map:t -> I.img
      val iter : (I.key -> I.img -> unit) -> t -> unit
      val fold : (I.key -> I.img -> '-> 'a) -> t -> '-> 'a
      val make_write_equal :
        (I.key -> I.key -> int) ->
        (I.img -> I.img -> unit) -> t -> t -> I.key -> unit
      val string_of_map : t -> string
      val string_of_with_img : t -> string
      type domain_var
      val get_domain_var : t -> MapVar.S.domain_var
    end
  module Make :
    functor
      (DVar : sig
                type t
                val create : unit -> MapVar.Make.t
                val merge : MapVar.Make.t -> MapVar.Make.t -> MapVar.Make.t
              end->
      functor
        (Map : sig
                 type key
                 type img
                 type t
                 val empty : t
                 val is_empty : t -> bool
                 val add : key -> img -> t -> t
                 val find : key -> t -> img
                 val remove : key -> t -> t
                 val mem : key -> t -> bool
                 val iter : (key -> img -> unit) -> t -> unit
                 val map : (img -> img) -> t -> t
                 val mapi : (key -> img -> img) -> t -> t
                 val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
                 val compare : t -> t -> int
                 val equal : t -> t -> bool
                 val add' : key -> img option -> t -> t
                 val find' : key -> t -> img option
                 val add_list : (key * img) list -> t -> t
                 val to_list : t -> (key * img) list
                 val from_list : (key * img) list -> t
                 val map_to_list : (key -> img -> 'a) -> t -> 'a list
                 val mapi_and_map_to_list :
                   (key -> img -> img * 'a) -> t -> t * 'a list
                 val domain : t -> key list
                 val fold_two :
                   (key -> img option -> img option -> '-> 'a) ->
                   '-> t -> t -> 'a
                 val restrict : key list -> t -> t
                 val string_of : t -> string
                 val alias : img -> img -> unit
               end->
        functor (P : GenVars.PREFIX->
          functor (O : GenVars.OBSERVER->
            functor
              (State : sig type obs = O.t val add_wl : obs -> unit end->
              sig
                type obs = O.t
                type t
                val create : unit -> t
                val compare : t -> t -> int
                val total_ord : t -> t -> int
                val add_alias : t -> t -> unit
                val do_normalize : t -> unit
                val add_observer : obs -> t -> unit
                val remove_observer : obs -> t -> unit
                val string_of : t -> string
                val reset : unit -> unit
                val get_all_ts : unit -> t list
                type img
                module I : sig type key = Map.key type img = Map.img end
                val domain : t -> I.key list
                val find' : I.key -> t -> I.img option
                val find_or_add :
                  create:(unit -> I.img) -> key:I.key -> map:t -> I.img
                val iter : (I.key -> I.img -> unit) -> t -> unit
                val fold : (I.key -> I.img -> '-> 'a) -> t -> '-> 'a
                val make_write_equal :
                  (I.key -> I.key -> int) ->
                  (I.img -> I.img -> unit) -> t -> t -> I.key -> unit
                val string_of_map : t -> string
                val string_of_with_img : t -> string
                type domain_var = DVar.t
                val get_domain_var : t -> domain_var
              end
end