aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clib/dyn.ml17
-rw-r--r--clib/dyn.mli6
2 files changed, 23 insertions, 0 deletions
diff --git a/clib/dyn.ml b/clib/dyn.ml
index 1ddbe5a7c2..8ef90a366e 100644
--- a/clib/dyn.ml
+++ b/clib/dyn.ml
@@ -49,6 +49,13 @@ sig
module Map(Value : ValueS) :
MapS with type 'a key = 'a tag and type 'a value = 'a Value.t
+
+ module HMap (V1 : ValueS)(V2 : ValueS) :
+ sig
+ type map = { map : 'a. 'a tag -> 'a V1.t -> 'a V2.t }
+ val map : map -> Map(V1).t -> Map(V2).t
+ end
+
end
module type S =
@@ -132,6 +139,16 @@ module Self : PreS = struct
let iter f m = Int.Map.iter (fun k v -> f (Any (k, v))) m
let fold f m accu = Int.Map.fold (fun k v accu -> f (Any (k, v)) accu) m accu
end
+
+ module HMap (V1 : ValueS) (V2 : ValueS) =
+ struct
+ type map = { map : 'a. 'a tag -> 'a V1.t -> 'a V2.t }
+
+ let map (f : map) (m : Map(V1).t) : Map(V2).t =
+ Int.Map.mapi f.map m
+
+ end
+
end
include Self
diff --git a/clib/dyn.mli b/clib/dyn.mli
index 926d0f3135..4fd33b5242 100644
--- a/clib/dyn.mli
+++ b/clib/dyn.mli
@@ -75,6 +75,12 @@ sig
MapS with type 'a key = 'a tag and type 'a value = 'a Value.t
(** Map from type tags to values parameterized by the tag type *)
+ module HMap (V1 : ValueS)(V2 : ValueS) :
+ sig
+ type map = { map : 'a. 'a tag -> 'a V1.t -> 'a V2.t }
+ val map : map -> Map(V1).t -> Map(V2).t
+ end
+
module Easy : sig
(* To create a dynamic type on the fly *)
val make_dyn_tag : string -> ('a -> t) * (t -> 'a) * 'a tag