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
|
open Reference_tree
let node_is_tag node =
let data = Vytree.data_of_node node in
match data.node_type with
| `Tag -> true
| _ -> false
let node_is_multi node =
let data = Vytree.data_of_node node in
data.multi
let get_nodes ?(tag_value_placeholder="") (condition: t -> bool) rt =
let stored l =
match l with
| [] -> []
| x :: _ -> x
in
let func ((p, l), acc) rt =
match p with
| [] -> ((p, l), acc)
| _ ->
let v = stored l in
let v = (Vytree.name_of_node rt) :: v in
let acc =
if condition rt then
List.rev v :: acc
else
acc
in
let v =
if node_is_tag rt then
match tag_value_placeholder with
| "" -> v
| _ as s -> s :: v
else
v
in ((p, v::l), acc)
in
let ret = Vytree.fold_tree_with_path_and_stack func (([], []), []) rt in
List.rev ret
let get_multi_nodes ?(tag_value_placeholder="") rt =
get_nodes ~tag_value_placeholder node_is_multi rt
let get_multi_nodes_yojson ?(tag_value_placeholder="") rt =
let ret = get_multi_nodes ~tag_value_placeholder rt in
[%to_yojson: string list list] ret |> Yojson.Safe.to_string
let get_tag_nodes ?(tag_value_placeholder="") rt =
get_nodes ~tag_value_placeholder node_is_tag rt
let get_tag_nodes_yojson ?(tag_value_placeholder="") rt =
let ret = get_tag_nodes ~tag_value_placeholder rt in
[%to_yojson: string list list] ret |> Yojson.Safe.to_string
let node_is_of_kind k rt =
let data = Vytree.data_of_node rt in
List.mem k data.kind
let get_nodes_of_kind ?(tag_value_placeholder="") rt k =
get_nodes ~tag_value_placeholder (node_is_of_kind k) rt
let get_nodes_of_kind_yojson ?(tag_value_placeholder="") rt k =
let ret = get_nodes_of_kind ~tag_value_placeholder rt k in
[%to_yojson: string list list] ret |> Yojson.Safe.to_string
let node_dependency_of_kind k rt =
let data = Vytree.data_of_node rt in
match data.dependency with
| Some c when c.kind = k -> true
| _ -> false
let get_rdeps_of_kind ?(tag_value_placeholder="") rt k =
get_nodes ~tag_value_placeholder (node_dependency_of_kind k) rt
let get_rdeps_of_kind_yojson ?(tag_value_placeholder="") rt k =
let ret = get_rdeps_of_kind ~tag_value_placeholder rt k in
[%to_yojson: string list list] ret |> Yojson.Safe.to_string
let get_nodes_data ?(tag_value_placeholder="") (data_opt: t -> string option) rt =
let stored l =
match l with
| [] -> []
| x :: _ -> x
in
let func ((p, l), acc) rt =
match p with
| [] -> ((p, l), acc)
| _ ->
let v = stored l in
let v = (Vytree.name_of_node rt) :: v in
let acc =
match data_opt rt with
| Some o -> (List.rev v, o) :: acc
| _ -> acc
in
let v =
if node_is_tag rt then
match tag_value_placeholder with
| "" -> v
| _ as s -> s :: v
else
v
in ((p, v::l), acc)
in
let ret = Vytree.fold_tree_with_path_and_stack func (([], []), []) rt in
List.rev ret
let node_dependency_of_kind_opt k rt =
let data = Vytree.data_of_node rt in
match data.dependency with
| Some c when c.kind = k -> Some c.alert
| _ -> None
let get_rdeps_of_kind_data ?(tag_value_placeholder="") rt k =
get_nodes_data ~tag_value_placeholder (node_dependency_of_kind_opt k) rt
let get_rdeps_of_kind_data_yojson ?(tag_value_placeholder="") rt k =
let ret = get_rdeps_of_kind_data ~tag_value_placeholder rt k in
[%to_yojson: (string list * string) list] ret |> Yojson.Safe.to_string
let get_path_owner reftree path =
if Util.is_empty path then None
else
if not ((Vytree.exists[@alert "-exn"]) reftree path) then None
else
let func data = data.owner in
(get_ceil_data[@alert "-exn"]) func reftree path
|