Null und Identität
|
none = arr $ const []
this = arr $ id
|
Allgemeiner Test
|
|
|
isA :: (b -> Bool) -> LA b b
isA p = LA $
\ x -> if p x
then [x]
else []
|
getNode, getChildren
|
Knotenattribut, alle Kinder, Selektor-Funktionen
|
|
getChildren :: TreeFilter n
getChildren = LA $
\ (NTree n cs) -> cs
getNode :: LA (NTree n) n
getNode = arr $
\ (NTree n cs) -> n
|
Knoten und Kinder transformieren
|
changeNode :: (n -> n) -> TreeFilter n
changeNode f
= arr $
\ (NTree n cs) ->
NTree (f n) cs
processChildren
:: TreeFilter n -> TreeFilter n
processChildren f
= arr $
\ (NTree n cs) ->
NTree n (concatMap (runLA f) cs)
|
| |
Auswahl
entweder - oder
|
orElse :: LA b c -> LA b c -> LA b c
f `orElse` g
= LA $
\ x ->
let
res = runLA f $ x
in
if null res
then runLA g $ x
else res
|
Verzweigung
|
if auf Filter angehoben
|
|
iff :: LA b c' -> LA b c -> LA b c ->
LA b c
iff p f g
= LA $
\ x ->
if (not . null . runLA $ p) x
then runLA f $ x
else runLA g $ x
|
Verzweigung
|
einfache Varianten: when und guards
|
|
when :: LA b b -> LA b c ->
LA b b
f `when` p
= iff p f this
guards :: LA b c -> LA b b ->
LA b b
p `guards` f
= iff p f none
|
Suchen
|
top down aller Teilbäume mit einer Eigenschaft
|
|
deep :: TreeFilter n ->
TreeFilter n
deep f = f
`orElse`
( getChildren >>> deep f )
deep isTableElem
|
Suchen
|
aller Teilbäume mit einer Eigenschaft
|
|
multi :: TreeFilter n ->
TreeFilter n
multi f = f
<+>
( getChildren >>> multi f )
multi isTableElem
|
Modifizieren
|
aller Knoten (top down)
|
|
processTopDown
:: TreeFilter n -> TreeFilter n
processTopDown f
= f
>>>
processChildren
(processTopDown f)
|