sig
type (_, _) eq = Eq : ('a, 'a) Structure.eq
module type Key =
sig
type 'a key
val create_key : string -> 'a Structure.Key.key
val eq_type :
'a Structure.Key.key ->
'b Structure.Key.key -> ('a, 'b) Structure.eq option
val print : 'a Structure.Key.key Pretty_utils.formatter
val compare : 'a Structure.Key.key -> 'b Structure.Key.key -> int
val equal : 'a Structure.Key.key -> 'b Structure.Key.key -> bool
val hash : 'a Structure.Key.key -> int
val tag : 'a Structure.Key.key -> int
end
module Make : functor () -> Key
module Key_Value : Key
module Key_Location : Key
module Key_Domain : Key
module type Shape =
sig
type 'a key
val create_key : string -> 'a key
val eq_type : 'a key -> 'b key -> ('a, 'b) eq option
val print : 'a key Pretty_utils.formatter
val compare : 'a key -> 'b key -> int
val equal : 'a key -> 'b key -> bool
val hash : 'a key -> int
val tag : 'a key -> int
type 'a data
type 'a structure =
Unit : unit Structure.Shape.structure
| Void : 'a Structure.Shape.structure
| Leaf : 'a key *
'a Structure.Shape.data -> 'a Structure.Shape.structure
| Node : 'a Structure.Shape.structure *
'b Structure.Shape.structure -> ('a * 'b)
Structure.Shape.structure
| Option : 'a Structure.Shape.structure *
'a -> 'a option Structure.Shape.structure
val eq_structure :
'a Structure.Shape.structure ->
'b Structure.Shape.structure -> ('a, 'b) Structure.eq option
end
module Shape :
functor (Key : Key) (Data : sig type 'a t end) ->
sig
type 'a key = 'a Key.key
val create_key : string -> 'a key
val eq_type : 'a key -> 'b key -> ('a, 'b) eq option
val print : 'a key Pretty_utils.formatter
val compare : 'a key -> 'b key -> int
val equal : 'a key -> 'b key -> bool
val hash : 'a key -> int
val tag : 'a key -> int
type 'a data = 'a Data.t
type 'a structure =
Unit : unit structure
| Void : 'a structure
| Leaf : 'a key * 'a data -> 'a structure
| Node : 'a structure * 'b structure -> ('a * 'b) structure
| Option : 'a structure * 'a -> 'a option structure
val eq_structure : 'a structure -> 'b structure -> ('a, 'b) eq option
end
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.key -> bool
val get : 'a Shape.key -> (Data.t -> 'a) option
val set : 'a Shape.key -> 'a -> Data.t -> Data.t
end
end