From af0c94dab45d5f8235ba0058c61226e636c68b9d Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Thu, 7 Feb 2013 16:16:23 +0100 Subject: [PATCH] functorial interface for Set too --- sequence.ml | 31 ++++++++++++++++++++++++++++++- sequence.mli | 20 +++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/sequence.ml b/sequence.ml index b5055f4..4b9a0ae 100644 --- a/sequence.ml +++ b/sequence.ml @@ -228,7 +228,36 @@ let to_set (type s) (type v) m seq = (fun set x -> S.add x set) S.empty seq -(** Conversion between maps and sequences. *) +(** {2 Functorial conversions between sets and sequences} *) + +module Set = struct + module type S = sig + type set + include Set.S with type t := set + val of_seq : elt t -> set + val to_seq : set -> elt t + end + + (** Create an enriched Set module from the given one *) + module Adapt(X : Set.S) : S with type elt = X.elt and type set = X.t = struct + type set = X.t + + let to_seq set = from_iter (fun k -> X.iter k set) + + let of_seq seq = fold (fun set x -> X.add x set) X.empty seq + + include X + end + + (** Functor to build an extended Set module from an ordered type *) + module Make(X : Set.OrderedType) : S with type elt = X.t = struct + module MySet = Set.Make(X) + include Adapt(MySet) + end +end + +(** {2 Conversion between maps and sequences.} *) + module Map = struct module type S = sig type +'a map diff --git a/sequence.mli b/sequence.mli index c9228bd..e7ee7ff 100644 --- a/sequence.mli +++ b/sequence.mli @@ -151,7 +151,25 @@ val of_set : (module Set.S with type elt = 'a and type t = 'b) -> 'b -> 'a t val to_set : (module Set.S with type elt = 'a and type t = 'b) -> 'a t -> 'b (** Convert the sequence to a set, given the proper set module *) -(** Conversion between maps and sequences. *) +(** {2 Functorial conversions between sets and sequences} *) + +module Set : sig + module type S = sig + type set + include Set.S with type t := set + val of_seq : elt t -> set + val to_seq : set -> elt t + end + + (** Create an enriched Set module from the given one *) + module Adapt(X : Set.S) : S with type elt = X.elt and type set = X.t + + (** Functor to build an extended Set module from an ordered type *) + module Make(X : Set.OrderedType) : S with type elt = X.t +end + +(** {2 Conversion between maps and sequences.} *) + module Map : sig module type S = sig type +'a map