module type SET =
sig
  type elem
  type set

(* empty is a function because of mutual types of sets 
   where some elements might need to be dynamically 
   assigned, like references *)
  val empty :  unit -> set
  val insert : set  -> elem -> set
  val remove : set  -> elem -> set
  val member : set  -> elem -> bool

  exception Set_is_empty
end

module type ORDERED = sig
  type elem

  val eq :  elem -> elem -> bool
  val lt :  elem -> elem -> bool
  val leq : elem -> elem -> bool
end

module type SET_FUNCTOR = (functor (Element : ORDERED) -> SET with type elem = Element.elem)

module type GENERATOR =
sig
  type p

  module O : ORDERED

  val generate_list : int -> O.elem list

(* feel free to use it as you wish, but my intention was to 
   use p as, for example, Random | Sorded | Reverse | ...   *)

  val gen_parametrised_list : p -> int -> O.elem list
end