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) 
 
         |