-
Notifications
You must be signed in to change notification settings - Fork 0
/
combinator.jl
53 lines (39 loc) · 1.3 KB
/
combinator.jl
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
OpenXML(filename) =
Lift(f -> parsexml(readstring(f)), convert(Combinator, filename))
XMLRoot() =
Lift(getroot, It)
XMLRoot(name; kw...) =
XMLRoot() >> ThenFilter(_xmlchildfilter(name; kw...))
XMLName() =
Lift(getname, It)
LiftQuery{V}(fn, argtypes::Tuple{Vararg{Type}}, restype::Type{XMLElementVector{V}}, qs::Vector{Query}) =
let q = invoke(LiftQuery, (Any, Tuple{Vararg{Type}}, Type, Vector{Query}), fn, argtypes, restype, qs)
q >> Query(DecodeVectorSig(), Input(XMLElementVector{V}), Output(XMLElement) |> setoptional() |> setplural())
end
XMLParent() =
Lift(getparent, It)
XMLChild() =
Lift(getchildren, It)
XMLChild(name; kw...) =
XMLChild() >> ThenFilter(_xmlchildfilter(name; kw...))
XMLDescendant() =
Lift(getdescendants, It)
XMLDescendant(name; kw...) =
XMLDescendant() >> ThenFilter(_xmlchildfilter(name; kw...))
function _xmlchildfilter(name; kw...)
C = XMLName() .== name
for (k, v) in kw
if v == true
C = C & Exists(XMLAttribute(string(k)))
elseif v == false
C = C & ~Exists(XMLAttribute(string(k)))
else
C = C & (XMLAttribute(string(k)) .== v)
end
end
C
end
XMLText() =
Lift(gettext, It)
XMLAttribute(attr) =
Lift(getattribute, It, convert(Combinator, attr))