sig
type (_, _) eq = Eq : ('a, 'a) Structure.eq
module type Key =
sig
type 'a k
val create_key : string -> 'a Structure.Key.k
val eq_type :
'a Structure.Key.k ->
'b Structure.Key.k -> ('a, 'b) Structure.eq option
val print : 'a Structure.Key.k Pretty_utils.formatter
val compare : 'a Structure.Key.k -> 'b Structure.Key.k -> int
val equal : 'a Structure.Key.k -> 'b Structure.Key.k -> bool
val hash : 'a Structure.Key.k -> int
val tag : 'a Structure.Key.k -> int
end
module type Shape =
sig
type 'a k
val create_key : string -> 'a k
val eq_type : 'a k -> 'b k -> ('a, 'b) eq option
val print : 'a k Pretty_utils.formatter
val compare : 'a k -> 'b k -> int
val equal : 'a k -> 'b k -> bool
val hash : 'a k -> int
val tag : 'a k -> int
type 'a structure =
Void : 'a Structure.Shape.structure
| Leaf : 'a k -> 'a Structure.Shape.structure
| Node : 'a Structure.Shape.structure *
'b Structure.Shape.structure -> ('a * 'b)
Structure.Shape.structure
end
module Make : functor (X : sig end) -> Shape
module Key_Value : Shape
module Key_Location : Shape
module Key_Domain : Shape
module type Internal =
sig
type t
type 'a structure
val structure : Structure.Internal.t Structure.Internal.structure
end
module type External =
sig
type t
type 'a key
val mem : 'a Structure.External.key -> bool
val get :
'a Structure.External.key -> (Structure.External.t -> 'a) option
val set :
'a Structure.External.key ->
'a -> Structure.External.t -> Structure.External.t
end
module Open :
functor
(Shape : Shape) (Data : sig
type t
val structure : t Shape.structure
end) ->
sig
val mem : 'a Shape.k -> bool
val get : 'a Shape.k -> (Data.t -> 'a) option
val set : 'a Shape.k -> 'a -> Data.t -> Data.t
end
end