summaryrefslogtreecommitdiff
path: root/src/tree_alg.mli
blob: 6a59fc01b957661e2ba05ddbb4f897106a751850 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
exception Incompatible_union
exception Nonexistent_child

module type Data = sig type t end

module type Tree = sig module D : Data type t = D.t Vytree.t end

module Tree_impl :
  functor (D : Data) ->
    sig module D : sig type t = D.t end type t = D.t Vytree.t end

module Alg :
  functor (D : Data)
    (T : sig module D : sig type t = D.t end type t = D.t Vytree.t end) ->
    sig
      module TreeOrd :
        sig
          type t = T.t
          val compare : 'a Vytree.t -> 'b Vytree.t -> int
        end
      module SetT :
        sig
          type elt = TreeOrd.t
          type t = Set.Make(TreeOrd).t
          val empty : t
          val is_empty : t -> bool
          val mem : elt -> t -> bool
          val add : elt -> t -> t
          val singleton : elt -> t
          val remove : elt -> t -> t
          val union : t -> t -> t
          val inter : t -> t -> t
          val disjoint : t -> t -> bool
          val diff : t -> t -> t
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val iter : (elt -> unit) -> t -> unit
          val map : (elt -> elt) -> t -> t
          val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
          val for_all : (elt -> bool) -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val filter : (elt -> bool) -> t -> t
          val filter_map : (elt -> elt option) -> t -> t
          val partition : (elt -> bool) -> t -> t * t
          val cardinal : t -> int
          val elements : t -> elt list
          val min_elt : t -> elt
          val min_elt_opt : t -> elt option
          val max_elt : t -> elt
          val max_elt_opt : t -> elt option
          val choose : t -> elt
          val choose_opt : t -> elt option
          val split : elt -> t -> t * bool * t
          val find : elt -> t -> elt
          val find_opt : elt -> t -> elt option
          val find_first : (elt -> bool) -> t -> elt
          val find_first_opt : (elt -> bool) -> t -> elt option
          val find_last : (elt -> bool) -> t -> elt
          val find_last_opt : (elt -> bool) -> t -> elt option
          val of_list : elt list -> t
          val to_seq_from : elt -> t -> elt Seq.t
          val to_seq : t -> elt Seq.t
          val to_rev_seq : t -> elt Seq.t
          val add_seq : elt Seq.t -> t -> t
          val of_seq : elt Seq.t -> t
        end
      val union_of_children : D.t Vytree.t -> D.t Vytree.t -> SetT.elt list
      val find_child : 'a Vytree.t -> 'b Vytree.t -> 'a Vytree.t option
      val insert_child : 'a Vytree.t -> 'a Vytree.t -> 'a Vytree.t
      val replace_child : 'a Vytree.t -> 'a Vytree.t -> 'a Vytree.t
      val tree_union :
        D.t Vytree.t ->
        D.t Vytree.t ->
        (D.t Vytree.t -> D.t Vytree.t -> D.t Vytree.t) -> D.t Vytree.t
    end

module ConfigData : sig type t = Config_tree.config_node_data end

module RefData : sig type t = Reference_tree.ref_node_data end

module ConfigAlg :
  sig
    module TreeOrd :
      sig
        type t = Tree_impl(ConfigData).t
        val compare : 'a Vytree.t -> 'b Vytree.t -> int
      end
    module SetT :
      sig
        type elt = TreeOrd.t
        type t = Set.Make(TreeOrd).t
        val empty : t
        val is_empty : t -> bool
        val mem : elt -> t -> bool
        val add : elt -> t -> t
        val singleton : elt -> t
        val remove : elt -> t -> t
        val union : t -> t -> t
        val inter : t -> t -> t
        val disjoint : t -> t -> bool
        val diff : t -> t -> t
        val compare : t -> t -> int
        val equal : t -> t -> bool
        val subset : t -> t -> bool
        val iter : (elt -> unit) -> t -> unit
        val map : (elt -> elt) -> t -> t
        val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
        val for_all : (elt -> bool) -> t -> bool
        val exists : (elt -> bool) -> t -> bool
        val filter : (elt -> bool) -> t -> t
        val filter_map : (elt -> elt option) -> t -> t
        val partition : (elt -> bool) -> t -> t * t
        val cardinal : t -> int
        val elements : t -> elt list
        val min_elt : t -> elt
        val min_elt_opt : t -> elt option
        val max_elt : t -> elt
        val max_elt_opt : t -> elt option
        val choose : t -> elt
        val choose_opt : t -> elt option
        val split : elt -> t -> t * bool * t
        val find : elt -> t -> elt
        val find_opt : elt -> t -> elt option
        val find_first : (elt -> bool) -> t -> elt
        val find_first_opt : (elt -> bool) -> t -> elt option
        val find_last : (elt -> bool) -> t -> elt
        val find_last_opt : (elt -> bool) -> t -> elt option
        val of_list : elt list -> t
        val to_seq_from : elt -> t -> elt Seq.t
        val to_seq : t -> elt Seq.t
        val to_rev_seq : t -> elt Seq.t
        val add_seq : elt Seq.t -> t -> t
        val of_seq : elt Seq.t -> t
      end
    val union_of_children :
      ConfigData.t Vytree.t -> ConfigData.t Vytree.t -> TreeOrd.t list
    val find_child : 'a Vytree.t -> 'b Vytree.t -> 'a Vytree.t option
    val insert_child : 'a Vytree.t -> 'a Vytree.t -> 'a Vytree.t
    val replace_child : 'a Vytree.t -> 'a Vytree.t -> 'a Vytree.t
    val tree_union :
      ConfigData.t Vytree.t ->
      ConfigData.t Vytree.t ->
      (ConfigData.t Vytree.t ->
       ConfigData.t Vytree.t -> ConfigData.t Vytree.t) ->
      ConfigData.t Vytree.t
    [@@alert exn "Tree_alg.Incompatible_union"]
    [@@alert exn "Tree_alg.Nonexistent_child"]
  end

module RefAlg :
  sig
    module TreeOrd :
      sig
        type t = Tree_impl(RefData).t
        val compare : 'a Vytree.t -> 'b Vytree.t -> int
      end
    module SetT :
      sig
        type elt = TreeOrd.t
        type t = Set.Make(TreeOrd).t
        val empty : t
        val is_empty : t -> bool
        val mem : elt -> t -> bool
        val add : elt -> t -> t
        val singleton : elt -> t
        val remove : elt -> t -> t
        val union : t -> t -> t
        val inter : t -> t -> t
        val disjoint : t -> t -> bool
        val diff : t -> t -> t
        val compare : t -> t -> int
        val equal : t -> t -> bool
        val subset : t -> t -> bool
        val iter : (elt -> unit) -> t -> unit
        val map : (elt -> elt) -> t -> t
        val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
        val for_all : (elt -> bool) -> t -> bool
        val exists : (elt -> bool) -> t -> bool
        val filter : (elt -> bool) -> t -> t
        val filter_map : (elt -> elt option) -> t -> t
        val partition : (elt -> bool) -> t -> t * t
        val cardinal : t -> int
        val elements : t -> elt list
        val min_elt : t -> elt
        val min_elt_opt : t -> elt option
        val max_elt : t -> elt
        val max_elt_opt : t -> elt option
        val choose : t -> elt
        val choose_opt : t -> elt option
        val split : elt -> t -> t * bool * t
        val find : elt -> t -> elt
        val find_opt : elt -> t -> elt option
        val find_first : (elt -> bool) -> t -> elt
        val find_first_opt : (elt -> bool) -> t -> elt option
        val find_last : (elt -> bool) -> t -> elt
        val find_last_opt : (elt -> bool) -> t -> elt option
        val of_list : elt list -> t
        val to_seq_from : elt -> t -> elt Seq.t
        val to_seq : t -> elt Seq.t
        val to_rev_seq : t -> elt Seq.t
        val add_seq : elt Seq.t -> t -> t
        val of_seq : elt Seq.t -> t
      end
    val union_of_children :
      RefData.t Vytree.t -> RefData.t Vytree.t -> TreeOrd.t list
    val find_child : 'a Vytree.t -> 'b Vytree.t -> 'a Vytree.t option
    val insert_child : 'a Vytree.t -> 'a Vytree.t -> 'a Vytree.t
    val replace_child : 'a Vytree.t -> 'a Vytree.t -> 'a Vytree.t
    val tree_union :
      RefData.t Vytree.t ->
      RefData.t Vytree.t ->
      (RefData.t Vytree.t -> RefData.t Vytree.t -> RefData.t Vytree.t) ->
      RefData.t Vytree.t
    [@@alert exn "Tree_alg.Incompatible_union"]
    [@@alert exn "Tree_alg.Nonexistent_child"]
  end