summaryrefslogtreecommitdiff
path: root/src/util_reference_tree.ml
blob: 018489e3e7358f694cc78f04bb0243f74301cab2 (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

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