|
Packit Service |
a2ae7a |
module Pass_square_rec =
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Utilities lens *)
|
|
Packit Service |
a2ae7a |
let dels (s:string) = del s s
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(************************************************************************
|
|
Packit Service |
a2ae7a |
* Recursive square lens
|
|
Packit Service |
a2ae7a |
*************************************************************************)
|
|
Packit Service |
a2ae7a |
(* test square with left and right as dels *)
|
|
Packit Service |
a2ae7a |
let lr (body:lens) =
|
|
Packit Service |
a2ae7a |
let k = key "c" . body* in
|
|
Packit Service |
a2ae7a |
let d = dels "ab" in
|
|
Packit Service |
a2ae7a |
[ square d k d ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec lr2 = lr lr2
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test lr2 get "abcabcabab" =
|
|
Packit Service |
a2ae7a |
{ "c"
|
|
Packit Service |
a2ae7a |
{ "c" }
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let open_tag = key /[a-z]+/
|
|
Packit Service |
a2ae7a |
let close_tag = del /[a-z]+/ "a"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Basic element *)
|
|
Packit Service |
a2ae7a |
let xml_element (body:lens) =
|
|
Packit Service |
a2ae7a |
let g = del ">" ">" . body . del "</" "</" in
|
|
Packit Service |
a2ae7a |
[ del "<" "<" . square open_tag g close_tag . del ">" ">" ] *
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec xml_rec = xml_element xml_rec
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test xml_rec get "<c><d><e></e></d></c>" =
|
|
Packit Service |
a2ae7a |
{ "a"
|
|
Packit Service |
a2ae7a |
{ "b"
|
|
Packit Service |
a2ae7a |
{ "c"
|
|
Packit Service |
a2ae7a |
{ "d"
|
|
Packit Service |
a2ae7a |
{ "e" }
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test xml_rec get "<c></c><d></d><e></e>" =
|
|
Packit Service |
a2ae7a |
{ "a"
|
|
Packit Service |
a2ae7a |
{ "b" }
|
|
Packit Service |
a2ae7a |
{ "c" }
|
|
Packit Service |
a2ae7a |
{ "d" }
|
|
Packit Service |
a2ae7a |
{ "e" }
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test xml_rec put "<c></c>" after clear "/x/y/z" = "<c></c><x><y><z></z></y></x>"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* mismatch tag *)
|
|
Packit Service |
a2ae7a |
test xml_rec get "</c>" = *
|
|
Packit Service |
a2ae7a |
test xml_rec get "</c>" = *
|
|
Packit Service |
a2ae7a |
test xml_rec get "</c>" = *
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* test ctype_nullable and typecheck *)
|
|
Packit Service |
a2ae7a |
let rec z =
|
|
Packit Service |
a2ae7a |
let k = key "ab" in
|
|
Packit Service |
a2ae7a |
let d = dels "ab" in
|
|
Packit Service |
a2ae7a |
[ square k z? d ]
|
|
Packit Service |
a2ae7a |
test z get "abab" = { "ab" }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* test tip handling when using store inside body *)
|
|
Packit Service |
a2ae7a |
let c (body:lens) =
|
|
Packit Service |
a2ae7a |
let sto = store "c" . body* in
|
|
Packit Service |
a2ae7a |
let d = dels "ab" in
|
|
Packit Service |
a2ae7a |
let k = key "ab" in
|
|
Packit Service |
a2ae7a |
[ square k sto d ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec cc = c cc
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test cc get "abcabcabab" =
|
|
Packit Service |
a2ae7a |
{ "ab" = "c"
|
|
Packit Service |
a2ae7a |
{ "ab" = "c" }
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* test mixing regular and recursive lenses *)
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let reg1 =
|
|
Packit Service |
a2ae7a |
let k = key "y" in
|
|
Packit Service |
a2ae7a |
let d = dels "y" in
|
|
Packit Service |
a2ae7a |
let e = dels "" in
|
|
Packit Service |
a2ae7a |
[ square k e d ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let reg2 =
|
|
Packit Service |
a2ae7a |
let k = key "y" in
|
|
Packit Service |
a2ae7a |
let d = dels "y" in
|
|
Packit Service |
a2ae7a |
[ square k reg1 d ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec rec2 =
|
|
Packit Service |
a2ae7a |
let d1 = dels "x" in
|
|
Packit Service |
a2ae7a |
let k1 = key "x" in
|
|
Packit Service |
a2ae7a |
let body = reg2 | rec2 in
|
|
Packit Service |
a2ae7a |
[ square k1 body d1 ]?
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test rec2 get "xyyyyx" =
|
|
Packit Service |
a2ae7a |
{ "x"
|
|
Packit Service |
a2ae7a |
{ "y"
|
|
Packit Service |
a2ae7a |
{ "y" }
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test rec2 put "" after clear "/x/y/y" = "xyyyyx"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* test correct put behavior *)
|
|
Packit Service |
a2ae7a |
let input3 = "aaxyxbbaaaxyxbb"
|
|
Packit Service |
a2ae7a |
let b3 = dels "y"
|
|
Packit Service |
a2ae7a |
let sqr3 =
|
|
Packit Service |
a2ae7a |
let k = key /[x]/ in
|
|
Packit Service |
a2ae7a |
let d = dels "x" in
|
|
Packit Service |
a2ae7a |
[ del /[a]*/ "a" . square k b3 d . del /[b]*/ "b" ]*
|
|
Packit Service |
a2ae7a |
test sqr3 get input3 = { "x" }{ "x" }
|
|
Packit Service |
a2ae7a |
test sqr3 put input3 after clear "/x[1]" = input3
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let b4 = dels "x"
|
|
Packit Service |
a2ae7a |
let rec sqr4 =
|
|
Packit Service |
a2ae7a |
let k = key /[b]|[c]/ in
|
|
Packit Service |
a2ae7a |
let d = del /[b]|[c]/ "b" in
|
|
Packit Service |
a2ae7a |
[ del /[a]+/ "a" . square k (b4|sqr4) d ]
|
|
Packit Service |
a2ae7a |
test sqr4 put "aabaaacxcb" after rm "x" = "aabaaacxcb"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* test concat multiple squares *)
|
|
Packit Service |
a2ae7a |
let rex = /[a-z]/
|
|
Packit Service |
a2ae7a |
let rec csqr =
|
|
Packit Service |
a2ae7a |
let k = key rex in
|
|
Packit Service |
a2ae7a |
let d = del rex "a" in
|
|
Packit Service |
a2ae7a |
let e = dels "" in
|
|
Packit Service |
a2ae7a |
[ square k e d . csqr* . square d e d ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test csqr get "aabbccdd" =
|
|
Packit Service |
a2ae7a |
{ "a"
|
|
Packit Service |
a2ae7a |
{ "b" }
|
|
Packit Service |
a2ae7a |
}
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test csqr put "aabbccdd" after clear "/a" = "aabbccdd"
|
|
Packit Service |
a2ae7a |
test csqr put "aabb" after clear "/a/z" = "aazzaabb"
|