{-
    Opgaver på ugeseddel 9
-}
module Chapter9 where

-- Opgave 9.1 p. 159

doubleAll1 :: [Int] -> [Int]
doubleAll1 xs = [2*x | x <- xs]

doubleAll2 :: [Int] -> [Int]
doubleAll2 [] = []
doubleAll2 (x:xs) = 2*x : doubleAll2 xs

doubleAll3 :: [Int] -> [Int]
doubleAll3 xs = map (2*) xs

doubleAll4 :: [Int] -> [Int]
doubleAll4 = map (2*)

-- udregn doubleAll[1..3] på listen [2,1,7]


-- Opgave 9.2 p. 159

one :: a -> Int
one _ = 1

length2 :: [a] -> Int
length2 = sum . map one

-- eller

length3 :: [a] -> Int
length3 = sum . map (\ _ -> 1)


-- Opgave 9.3 p. 159

-- map før filter
addUp1 ns = filter (>1) (map (+1) ns)

-- filter før map
addUp2 ns = map (+1) (filter (>0) ns)


-- Opgave 9.4 p. 160

-- map addOne (map addOne ns)

-- Diskutér


-- Opgave 9.9 p. 160

iter :: Int -> (a -> a) -> a -> a
iter n f x
  | n <= 0     = x
  | otherwise  = iter (n-1) f (f x)


-- Opgave 9.10 p. 161

double :: Int -> Int
double = (2*)

power2 :: Int -> Int
power2 n = iter n double 1


-- Opgave 9.14 p. 164

sing x = [x]

mystery xs = foldr (++) [] (map sing xs)

-- Diskutér


-- Opgave 9.16 p. 164

filterFirst :: (a -> Bool) -> [a] -> [a]
filterFirst _ [] = []
filterFirst p (x:xs)
    | p x        = x : filterFirst p xs
    | otherwise  = xs 


-- Opgave 9.17 p. 164

filterLast :: (a -> Bool) -> [a] -> [a]
filterLast p [] = []
filterLast p (x:xs)
    | p x                      = x : rest
    | length xs == length rest =     rest
    | otherwise                = x : rest
    where
      rest = filterLast p xs

filterLast2 :: (a -> Bool) -> [a] -> [a]
filterLast2 p = reverse . filterFirst p . reverse

