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
open Base
type 'a token =
| S of string
| D of 'a
| F of 'a token list
| DEST
| TMP
| NP
| MEM
type 'a t = 'a token list
let rec deps tmpl ~compare =
List.map tmpl ~f:(function
| D r -> [ r ]
| F toks -> deps ~compare toks
| S _ | DEST | TMP | NP | MEM -> []
)
|> List.concat
|> List.dedup_and_sort ~compare
let rec map_token x ~f = match x with
| S s -> S s
| D dep -> D (f dep)
| F toks -> F (List.map toks ~f:(map_token ~f))
| DEST -> DEST
| TMP -> TMP
| NP -> NP
| MEM -> MEM
let map toks ~f = List.map toks ~f:(map_token ~f)