sig
  module Duplicate :
    functor (S : Set.S->
      sig
        type dups = No_dups of S.t | Has_dups of S.elt
        val duplicates : S.elt list -> Util.Duplicate.dups
      end
  val remove_duplicates : 'a list -> 'a list
  val remove_duplicates_gen : ('-> '-> bool) -> 'a list -> 'a list
  val get_duplicates : 'a list -> 'a list
  val get_duplicates_gen : ('-> '-> bool) -> 'a list -> 'a list
  val option_map : ('-> 'b) -> 'a option -> 'b option
  val option_cases : 'a option -> ('-> 'b) -> (unit -> 'b) -> 'b
  val option_bind : ('-> 'b option) -> 'a option -> 'b option
  val option_default : '-> 'a option -> 'a
  val option_default_map : 'a option -> '-> ('-> 'b) -> 'b
  val option_get_exn : exn -> 'a option -> 'a
  val changed2 :
    ('-> '-> 'c) ->
    ('-> 'a option) -> '-> ('-> 'b option) -> '-> 'c option
  val list_index : ('-> bool) -> 'a list -> int option
  val list_subset : 'a list -> 'a list -> bool
  val list_diff : 'a list -> 'a list -> 'a list
  val list_longer : int -> 'a list -> bool
  val list_null : 'a list -> bool
  val option_first : ('-> 'b option) -> 'a list -> 'b option
  val map_changed : ('-> 'a option) -> 'a list -> 'a list option
  val map_changed_default :
    ('-> 'b) -> ('-> 'b option) -> 'a list -> 'b list option
  val list_mapi : (int -> '-> 'b) -> 'a list -> 'b list
  val list_iter_sep : (unit -> unit) -> ('-> unit) -> 'a list -> unit
  val intercalate : '-> 'a list -> 'a list
  val interleave : 'a list -> 'a list -> 'a list
  val replicate : int -> '-> 'a list
  val map_filter : ('-> 'b option) -> 'a list -> 'b list
  val map_all : ('-> 'b option) -> 'a list -> 'b list option
  val list_to_front : int -> 'a list -> 'a list
  val undo_list_to_front : int -> 'a list -> 'a list
  val split_after : int -> 'a list -> 'a list * 'a list
  val list_firstn : int -> 'a list -> 'a list
  val list_dropn : int -> 'a list -> 'a list
  val list_dest_snoc : 'a list -> 'a list * 'a
  val list_pick : ('-> bool) -> 'a list -> ('a * 'a list) option
  val compare_list : ('-> '-> int) -> 'a list -> 'b list -> int
  val copy_file : string -> string -> unit
  val move_file : string -> string -> unit
  val same_content_files : string -> string -> bool
  val absolute_dir : string -> string option
  val dir_eq : string -> string -> bool
  val string_to_list : string -> char list
  val string_for_all : (char -> bool) -> string -> bool
  val is_simple_ident_string : string -> bool
  val string_split : char -> string -> string list * string
  val uncapitalize_prefix : string -> string
  val string_map : (char -> char) -> string -> string
  val message_singular_plural : string * string -> 'a list -> string
  val fresh_string : string list -> string -> string
  module StringSet :
    sig
      type elt = string
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  module IntSet :
    sig
      type elt = int
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  module IntIntSet :
    sig
      type elt = int * int
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  module ExtraSet :
    functor (S : Set.S->
      sig
        val add_list : S.t -> S.elt list -> S.t
        val remove_list : S.t -> S.elt list -> S.t
        val from_list : S.elt list -> S.t
        val list_union : S.t list -> S.t
        val list_inter : S.t list -> S.t
      end
end