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
type name = string * string
(** Input *)
type signal = [
| `Comment of string
| `End_element
| `Start_element of name * (name * string) list
| `Text of string list
]
exception Malformed_stream
module Import
(Xml : Xml_sigs.T)
= struct
let of_list l =
List.fold_right
(fun a b -> Xml.W.(cons (return a) b))
l (Xml.W.nil ())
let mk_attribs attrs =
let f ((_,name), v) = Xml.string_attrib name (Xml.W.return v) in
List.map f attrs
let rec mk children (seq : signal Seq.t) = match seq () with
| Cons (`Comment s, q) ->
mk (Xml.comment s :: children) q
| Cons (`Text s, q) ->
mk (List.map (fun x -> Xml.pcdata @@ Xml.W.return x) s @ children) q
| Cons (`Start_element ((_, name), attrs), q) ->
let a = mk_attribs attrs in
let sub_children, rest = mk [] q in
mk (Xml.node ~a name sub_children :: children) rest
| Cons (`End_element, rest) ->
of_list (List.rev children), rest
| Nil ->
of_list (List.rev children), Seq.empty
let of_seq seq =
let l, rest = mk [] seq in
match rest () with
| Seq.Nil -> l
| _ -> raise Malformed_stream
end