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
let contains_double_underscore s =
let len = String.length s in
let rec aux i =
if i > len - 2 then false
else if s.[i] = '_' && s.[i + 1] = '_' then true
else aux (i + 1)
in
aux 0
module Package = struct
type t = string
module Table = Hashtbl.Make (struct
type nonrec t = t
let equal : t -> t -> bool = ( = )
let hash : t -> int = Hashtbl.hash
end)
end
module Odoc_file = struct
type compilation_unit = { name : string; hidden : bool }
type t = Page of string | Compilation_unit of compilation_unit
let create_unit ~force_hidden name =
let hidden = force_hidden || contains_double_underscore name in
Compilation_unit { name; hidden }
let create_page name = Page name
let name = function Page name | Compilation_unit { name; _ } -> name
let hidden = function Page _ -> false | Compilation_unit m -> m.hidden
end
type t = {
id : Paths.Identifier.OdocId.t;
file : Odoc_file.t;
digest : Digest.t;
}
let equal : t -> t -> bool = ( = )
let hash : t -> int = Hashtbl.hash
let to_string t =
let rec pp fmt (id : Paths.Identifier.OdocId.t) =
match id.iv with
| `LeafPage (parent, name) | `Page (parent, name) -> (
match parent with
| Some p ->
Format.fprintf fmt "%a::%a" pp
(p :> Paths.Identifier.OdocId.t)
Names.PageName.fmt name
| None -> Format.fprintf fmt "%a" Names.PageName.fmt name)
| `Root (Some parent, name) ->
Format.fprintf fmt "%a::%a" pp
(parent :> Paths.Identifier.OdocId.t)
Names.ModuleName.fmt name
| `Root (None, name) -> Format.fprintf fmt "%a" Names.ModuleName.fmt name
in
Format.asprintf "%a" pp t.id
let compare x y = String.compare x.digest y.digest
module Hash_table = Hashtbl.Make (struct
type nonrec t = t
let equal = equal
let hash = hash
end)