sig
  module rec PolyMap :
    sig
      type ('k, 'e) t
      type 'k key = 'k
      type 'e elt = 'e
      type ('k, 'e) cursor
      type ('a, 'k, 'v) result = 'a * ('k, 'v) PolyMap.t
      type 'a key_ = 'a
      type 'e elt_ = 'e
      type ('k, 'e) map = ('k, 'e) t
      type ('a, 'k, 'v) result_ = ('a, 'k, 'v) result
      val empty : ('k, 'e) map
      val is_empty : ('k, 'e) map -> bool
      val mem : 'k key_ -> ('k, 'e) map -> (bool, 'k, 'e) result_
      val add : 'k key_ -> 'e elt_ -> ('k, 'e) map -> ('k, 'e) map
      val singleton : 'k key_ -> 'e elt_ -> ('k, 'e) map
      val remove : 'k key_ -> ('k, 'e) map -> ('k, 'e) map
      val find : 'k key_ -> ('k, 'e) map -> ('e elt_, 'k, 'e) result_
      val min_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
      val max_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
      val min_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
      val max_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
      val cardinal : ('k, 'e) map -> int
      val iter : ('k key_ -> 'e elt_ -> unit) -> ('k, 'e) map -> unit
      val fold :
        ('acc -> 'k key_ -> 'e elt_ -> 'acc) -> 'acc -> ('k, 'e) map -> 'acc
      val map : ('e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
      val mapi :
        ('k key_ -> 'e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
      val union :
        ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
        ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
      val inter :
        ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
        ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
      val diff :
        ('k key_ -> 'e elt_ -> 'e elt_ -> bool) ->
        ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
      val well_formed : ('k, 'e) map -> bool
      val of_result : ('a, 'k, 'e) result_ -> 'a
      type ('k, 'e) cursor_ = ('k, 'e) cursor
      val to_cursor : ('k, 'e) map -> ('k, 'e) cursor_
      val from_cursor : ('k, 'e) cursor_ -> ('k, 'e) map
      val at_top : ('k, 'e) cursor_ -> bool
      val at_left : ('k, 'e) cursor_ -> bool
      val at_right : ('k, 'e) cursor_ -> bool
      val move_up : ('k, 'e) cursor_ -> ('k, 'e) cursor_
      val move_down_left : ('k, 'e) cursor_ -> ('k, 'e) cursor_
      val move_down_right : ('k, 'e) cursor_ -> ('k, 'e) cursor_
      val went_left : ('k, 'e) cursor_ -> bool
      val went_right : ('k, 'e) cursor_ -> bool
      val has_value : ('k, 'e) cursor_ -> bool
      val get_value : ('k, 'e) cursor_ -> 'k key_ * 'e elt_
      val gen2 :
        (?size:int -> Random.State.t -> 'k key_) ->
        (?size:int -> Random.State.t -> 'e elt_) ->
        ?size:int -> Random.State.t -> ('k, 'e) map
      val to_string : ('-> '-> string) -> ('k, 'e) map -> string
      val compare :
        ('-> '-> int) ->
        ('-> '-> int) -> ('k, 'e) t -> ('k, 'e) t -> int
      val compare_keys : ('-> '-> int) -> ('k, 'e) t -> ('k, 'e) t -> int
    end
  module rec MonoKeyMap :
    functor (C : Types.Mono.Comparable->
      sig
        type 'e t
        type key = C.t
        type 'e elt = 'e
        type 'e cursor
        type ('a, 'v) result = 'a * 'MonoKeyMap(C).t
        type 'k key_ = key
        type 'e elt_ = 'e
        type ('k, 'e) map = 'e t
        type ('a, 'k, 'v) result_ = ('a, 'v) result
        val empty : ('k, 'e) map
        val is_empty : ('k, 'e) map -> bool
        val mem : 'k key_ -> ('k, 'e) map -> (bool, 'k, 'e) result_
        val add : 'k key_ -> 'e elt_ -> ('k, 'e) map -> ('k, 'e) map
        val singleton : 'k key_ -> 'e elt_ -> ('k, 'e) map
        val remove : 'k key_ -> ('k, 'e) map -> ('k, 'e) map
        val find : 'k key_ -> ('k, 'e) map -> ('e elt_, 'k, 'e) result_
        val min_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
        val max_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
        val min_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
        val max_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
        val cardinal : ('k, 'e) map -> int
        val iter : ('k key_ -> 'e elt_ -> unit) -> ('k, 'e) map -> unit
        val fold :
          ('acc -> 'k key_ -> 'e elt_ -> 'acc) ->
          'acc -> ('k, 'e) map -> 'acc
        val map : ('e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
        val mapi :
          ('k key_ -> 'e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
        val union :
          ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val inter :
          ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val diff :
          ('k key_ -> 'e elt_ -> 'e elt_ -> bool) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val well_formed : ('k, 'e) map -> bool
        val of_result : ('a, 'k, 'e) result_ -> 'a
        type ('k, 'e) cursor_ = 'e cursor
        val to_cursor : ('k, 'e) map -> ('k, 'e) cursor_
        val from_cursor : ('k, 'e) cursor_ -> ('k, 'e) map
        val at_top : ('k, 'e) cursor_ -> bool
        val at_left : ('k, 'e) cursor_ -> bool
        val at_right : ('k, 'e) cursor_ -> bool
        val move_up : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val move_down_left : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val move_down_right : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val went_left : ('k, 'e) cursor_ -> bool
        val went_right : ('k, 'e) cursor_ -> bool
        val has_value : ('k, 'e) cursor_ -> bool
        val get_value : ('k, 'e) cursor_ -> 'k key_ * 'e elt_
        val compare_keys : 'e t -> 'e t -> int
        val compare : ('-> '-> int) -> 'e t -> 'e t -> int
        val to_string : ('-> string) -> 'e t -> string
        val gen2 :
          (?size:int -> Random.State.t -> key) ->
          (?size:int -> Random.State.t -> 'a) ->
          ?size:int -> Random.State.t -> 'a t
      end
  module rec GenKeyMap :
    functor (C : Types.Mono.ArbitraryComparable->
      sig
        type 'e t
        type key = C.t
        type 'e elt = 'e
        type 'e cursor
        type ('a, 'v) result = 'a * 'GenKeyMap(C).t
        type 'k key_ = key
        type 'e elt_ = 'e
        type ('k, 'e) map = 'e t
        type ('a, 'k, 'v) result_ = ('a, 'v) result
        val empty : ('k, 'e) map
        val is_empty : ('k, 'e) map -> bool
        val mem : 'k key_ -> ('k, 'e) map -> (bool, 'k, 'e) result_
        val add : 'k key_ -> 'e elt_ -> ('k, 'e) map -> ('k, 'e) map
        val singleton : 'k key_ -> 'e elt_ -> ('k, 'e) map
        val remove : 'k key_ -> ('k, 'e) map -> ('k, 'e) map
        val find : 'k key_ -> ('k, 'e) map -> ('e elt_, 'k, 'e) result_
        val min_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
        val max_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
        val min_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
        val max_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
        val cardinal : ('k, 'e) map -> int
        val iter : ('k key_ -> 'e elt_ -> unit) -> ('k, 'e) map -> unit
        val fold :
          ('acc -> 'k key_ -> 'e elt_ -> 'acc) ->
          'acc -> ('k, 'e) map -> 'acc
        val map : ('e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
        val mapi :
          ('k key_ -> 'e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
        val union :
          ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val inter :
          ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val diff :
          ('k key_ -> 'e elt_ -> 'e elt_ -> bool) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val well_formed : ('k, 'e) map -> bool
        val of_result : ('a, 'k, 'e) result_ -> 'a
        type ('k, 'e) cursor_ = 'e cursor
        val to_cursor : ('k, 'e) map -> ('k, 'e) cursor_
        val from_cursor : ('k, 'e) cursor_ -> ('k, 'e) map
        val at_top : ('k, 'e) cursor_ -> bool
        val at_left : ('k, 'e) cursor_ -> bool
        val at_right : ('k, 'e) cursor_ -> bool
        val move_up : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val move_down_left : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val move_down_right : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val went_left : ('k, 'e) cursor_ -> bool
        val went_right : ('k, 'e) cursor_ -> bool
        val has_value : ('k, 'e) cursor_ -> bool
        val get_value : ('k, 'e) cursor_ -> 'k key_ * 'e elt_
        val compare_keys : 'e t -> 'e t -> int
        val compare : ('-> '-> int) -> 'e t -> 'e t -> int
        val to_string : ('-> string) -> 'e t -> string
        val gen2 :
          (?size:int -> Random.State.t -> key) ->
          (?size:int -> Random.State.t -> 'a) ->
          ?size:int -> Random.State.t -> 'a t
        val gen1 :
          (?size:int -> Random.State.t -> 'e) ->
          ?size:int -> Random.State.t -> 'e t
      end
  module rec MonoMap :
    functor (K : Types.Mono.Comparable) (V : Types.Mono.Comparable->
      sig
        type t
        type key = K.t
        type elt = V.t
        type cursor
        type 'a result = 'a * MonoMap(K)(V).t
        type 'k key_ = key
        type 'e elt_ = elt
        type ('k, 'e) map = t
        type ('a, 'k, 'v) result_ = 'a result
        val empty : ('k, 'e) map
        val is_empty : ('k, 'e) map -> bool
        val mem : 'k key_ -> ('k, 'e) map -> (bool, 'k, 'e) result_
        val add : 'k key_ -> 'e elt_ -> ('k, 'e) map -> ('k, 'e) map
        val singleton : 'k key_ -> 'e elt_ -> ('k, 'e) map
        val remove : 'k key_ -> ('k, 'e) map -> ('k, 'e) map
        val find : 'k key_ -> ('k, 'e) map -> ('e elt_, 'k, 'e) result_
        val min_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
        val max_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
        val min_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
        val max_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
        val cardinal : ('k, 'e) map -> int
        val iter : ('k key_ -> 'e elt_ -> unit) -> ('k, 'e) map -> unit
        val fold :
          ('acc -> 'k key_ -> 'e elt_ -> 'acc) ->
          'acc -> ('k, 'e) map -> 'acc
        val map : ('e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
        val mapi :
          ('k key_ -> 'e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
        val union :
          ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val inter :
          ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val diff :
          ('k key_ -> 'e elt_ -> 'e elt_ -> bool) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val well_formed : ('k, 'e) map -> bool
        val of_result : ('a, 'k, 'e) result_ -> 'a
        type ('k, 'e) cursor_ = cursor
        val to_cursor : ('k, 'e) map -> ('k, 'e) cursor_
        val from_cursor : ('k, 'e) cursor_ -> ('k, 'e) map
        val at_top : ('k, 'e) cursor_ -> bool
        val at_left : ('k, 'e) cursor_ -> bool
        val at_right : ('k, 'e) cursor_ -> bool
        val move_up : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val move_down_left : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val move_down_right : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val went_left : ('k, 'e) cursor_ -> bool
        val went_right : ('k, 'e) cursor_ -> bool
        val has_value : ('k, 'e) cursor_ -> bool
        val get_value : ('k, 'e) cursor_ -> 'k key_ * 'e elt_
        val compare_keys : t -> t -> int
        val compare : t -> t -> int
        val to_string : t -> string
        val gen2 :
          (?size:int -> Random.State.t -> key) ->
          (?size:int -> Random.State.t -> elt) ->
          ?size:int -> Random.State.t -> t
      end
  module rec GenMap :
    functor
      (K : Types.Mono.ArbitraryComparable) (V : Types.Mono.ArbitraryComparable->
      sig
        type t
        type key = K.t
        type elt = V.t
        type cursor
        type 'a result = 'a * GenMap(K)(V).t
        type 'k key_ = key
        type 'e elt_ = elt
        type ('k, 'e) map = t
        type ('a, 'k, 'v) result_ = 'a result
        val empty : ('k, 'e) map
        val is_empty : ('k, 'e) map -> bool
        val mem : 'k key_ -> ('k, 'e) map -> (bool, 'k, 'e) result_
        val add : 'k key_ -> 'e elt_ -> ('k, 'e) map -> ('k, 'e) map
        val singleton : 'k key_ -> 'e elt_ -> ('k, 'e) map
        val remove : 'k key_ -> ('k, 'e) map -> ('k, 'e) map
        val find : 'k key_ -> ('k, 'e) map -> ('e elt_, 'k, 'e) result_
        val min_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
        val max_key : ('k, 'e) map -> ('k key_, 'k, 'e) result_
        val min_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
        val max_keyval : ('k, 'e) map -> ('k key_ * 'e elt_, 'k, 'e) result_
        val cardinal : ('k, 'e) map -> int
        val iter : ('k key_ -> 'e elt_ -> unit) -> ('k, 'e) map -> unit
        val fold :
          ('acc -> 'k key_ -> 'e elt_ -> 'acc) ->
          'acc -> ('k, 'e) map -> 'acc
        val map : ('e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
        val mapi :
          ('k key_ -> 'e elt_ -> 'f elt_) -> ('k, 'e) map -> ('k, 'f) map
        val union :
          ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val inter :
          ('k key_ -> 'e elt_ -> 'e elt_ -> 'e elt_) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val diff :
          ('k key_ -> 'e elt_ -> 'e elt_ -> bool) ->
          ('k, 'e) map -> ('k, 'e) map -> ('k, 'e) map
        val well_formed : ('k, 'e) map -> bool
        val of_result : ('a, 'k, 'e) result_ -> 'a
        type ('k, 'e) cursor_ = cursor
        val to_cursor : ('k, 'e) map -> ('k, 'e) cursor_
        val from_cursor : ('k, 'e) cursor_ -> ('k, 'e) map
        val at_top : ('k, 'e) cursor_ -> bool
        val at_left : ('k, 'e) cursor_ -> bool
        val at_right : ('k, 'e) cursor_ -> bool
        val move_up : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val move_down_left : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val move_down_right : ('k, 'e) cursor_ -> ('k, 'e) cursor_
        val went_left : ('k, 'e) cursor_ -> bool
        val went_right : ('k, 'e) cursor_ -> bool
        val has_value : ('k, 'e) cursor_ -> bool
        val get_value : ('k, 'e) cursor_ -> 'k key_ * 'e elt_
        val compare_keys : t -> t -> int
        val compare : t -> t -> int
        val to_string : t -> string
        val gen2 :
          (?size:int -> Random.State.t -> key) ->
          (?size:int -> Random.State.t -> elt) ->
          ?size:int -> Random.State.t -> t
        val gen : ?size:int -> Random.State.t -> t
      end
end