module List.Basic where
{-
This module contains implementations of list functions
using plain recursion.
The definitions become a bit longer
but the reductions look a bit nicer
and there are usually less one than in higher-order style.
-}

import Bool
import Prelude ( (-), Int, Bool )


infixr 5 ++

(++) :: [a] -> [a] -> [a] ;
(a
x:[a]
xs) ++ :: forall a. [a] -> [a] -> [a]
++ [a]
ys = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: ([a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
ys) ;
[] ++ [a]
ys = [a]
ys ;

concat :: [[a]] -> [a] ;
concat :: forall a. [[a]] -> [a]
concat ([a]
x:[[a]]
xs) = [a]
x [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [[a]] -> [a]
forall a. [[a]] -> [a]
concat [[a]]
xs ;
concat [] = [] ;


take :: Int -> [a] -> [a] ;
take :: forall a. Int -> [a] -> [a]
take Int
0 [a]
_xs = [] ;
take Int
n (a
x:[a]
xs) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [a]
xs ;
take Int
_ [] = [] ;

filter :: (a -> Bool) -> [a] -> [a] ;
filter :: forall a. (a -> Bool) -> [a] -> [a]
filter a -> Bool
p (a
x:[a]
xs) = Bool -> [a] -> [a] -> [a]
forall a. Bool -> a -> a -> a
ifThenElse (a -> Bool
p a
x) (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter a -> Bool
p [a]
xs) ((a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter a -> Bool
p [a]
xs) ;
filter a -> Bool
_ [] = [] ;

takeWhile :: (a -> Bool) -> [a] -> [a] ;
takeWhile :: forall a. (a -> Bool) -> [a] -> [a]
takeWhile a -> Bool
p (a
x:[a]
xs) = Bool -> [a] -> [a] -> [a]
forall a. Bool -> a -> a -> a
ifThenElse (a -> Bool
p a
x) (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile a -> Bool
p [a]
xs) [] ;
takeWhile a -> Bool
_ [] = [] ;