sig
type elt
type t
+ type set
val empty : t
val any : t
val is_empty : t -> bool
val choose : t -> elt
val hash : t -> int
val equal : t -> t -> bool
+ val positive : t -> set
+ val negative : t -> set
end
-module Make (E : Sigs.Set) : S with type elt = E.elt =
+module Make (E : Sigs.Set) : S with type elt = E.elt and type set = E.t =
struct
type elt = E.elt
type t = Finite of E.t | CoFinite of E.t
-
+ type set = E.t
let empty = Finite E.empty
let any = CoFinite E.empty
function Finite x -> (E.hash x)
| CoFinite x -> ( ~-(E.hash x) land max_int)
+ let positive =
+ function
+ | Finite x -> x
+ | _ -> E.empty
+
+ let negative =
+ function
+ | CoFinite x -> x
+ | _ -> E.empty
+
end