{----------------------------------------------------------
    Datei mit Beispielen zu Funktionen hoeherer Ordnung
-----------------------------------------------------------

-- einige in Prelude.hs vordefinierte Funktionen hoeherer Ordnung:

-- Funktionskomposition
(.)            :: (b -> c) -> (a -> b) -> (a -> c)
(f . g) x       = f (g x)

-- Listentransformation
map              :: (a -> b) -> [a] -> [b]
map f xs          = [ f x | x <- xs ]

-- Listenfilterung
filter           :: (a -> Bool) -> [a] -> [a]
filter p xs       = [ x | x <- xs, p x ]

-- Listenfaltung

foldl            :: (a -> b -> a) -> a -> [b] -> a
foldl f z []      = z
foldl f z (x:xs)  = foldl f (f z x) xs

foldr            :: (a -> b -> b) -> b -> [a] -> b
foldr f z []      = z
foldr f z (x:xs)  = f x (foldr f z xs)

-----------------------------------------------------------}


-- Textverschluesselung nach der Caesarmethode

code            :: Char -> Char
code x 
    | letter x  =  xox 
    | otherwise =  x
    where 
        ox  =  ord x + 13
        xox =  if (upperLetter x && ox > ord 'Z') 
                    || (lowerLetter x && ox > ord 'z')
               then chr (ox - 26)
               else chr ox

caesar     :: String -> String 
caesar str =  map code str

upperLetter, lowerLetter, letter :: Char
upperLetter x = x >= 'A' && x <= 'Z'
lowerLetter x = x >= 'a' && x <= 'z'
letter x = upperLetter x || lowerLetter x