functor (Domain : Domain->
  sig
    type state = Domain.t
    type t
    val empty : t
    val is_empty : t -> bool
    val singleton : state -> t
    val singleton' : state Eval.or_bottom -> t
    val uncheck_add : state -> t -> t
    val add : state -> t -> t
    val add' : state Eval.or_bottom -> t -> t
    val length : t -> int
    val merge : into:t -> t -> t * bool
    val join : ?into:state Eval.or_bottom -> t -> state Eval.or_bottom
    val fold : (state -> '-> 'a) -> t -> '-> 'a
    val iter : (state -> unit) -> t -> unit
    val map : (state -> state) -> t -> t
    val map_or_bottom : (state -> state Eval.or_bottom) -> t -> t
    val reorder : t -> t
    val of_list : state list -> t
    val to_list : t -> state list
    val pretty : Format.formatter -> t -> unit
  end