HaRe-0.6: tools/hs2alfa/tests/PreludeList.hs
module PreludeList where
infixr 5 ++
infixl 9 !!
infix 4 `elem`,`notElem`
map f [] = []
map f (x:xs) = f x:map f xs
[]++ys = ys
(x:xs)++ys = x:(xs++ys)
concatMap f = concat . map f
filter p [] = []
filter p (x:xs) = if p x then x:filter p xs else filter p xs
concat = foldr (++) []
null [] = True
null (_:_) = False
head (x:_) = x
tail (_:xs) = xs
foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
foldl f z [] = z
foldl f z (x:xs) = foldl f (f z x) xs
zip (x:xs) (y:ys) = (x,y):zip xs ys
zip _ _ = []
unzip [] = ([],[])
unzip ((x,y):xys) = case unzip xys of (xs,ys) -> (x:xs,y:ys)
length :: [a] -> Int
length [] = 0
length (_:xs) = 1+length xs
replicate n x = take n (repeat x)
repeat x = xs where xs = x:xs
take n xs =
if n<=0
then []
else case xs of
[] -> []
x:xs -> x:take (n-1) xs
drop n xs =
if n<=0
then xs
else case xs of
[] -> []
x:xs -> drop (n-1) xs
all p xs = foldr ((&&).p) True xs
any p xs = foldr ((||).p) False xs
x `elem` xs = any (x==) xs
x `notElem` xs = all (x/=) xs
span p xs = (takeWhile p xs,dropWhile p xs)
takeWhile p [] = []
takeWhile p (x:xs) = if p x then x:takeWhile p xs else []
dropWhile p [] = []
dropWhile p (x:xs) = if p x then dropWhile p xs else x:xs
reverse xs = foldl (\ys y->y:ys) [] xs
foldl1 f (x:xs) = foldl f x xs
minimum xs = foldl1 min xs
lookup :: Eq a => a -> [(a,b)] -> Maybe b
lookup x [] = Nothing
lookup x ((x',y):xys) = if x'==x then Just y else lookup x xys
(!!) :: [a] -> Int -> a
xs !! n = if n<0
then error "Prelude.!!: negative index"
else case xs of
[] -> error "Prelude.!!: index too large"
x:xs -> if n==0
then x
else xs!!(n-1)