module List (
    map,
    zipWith,
    zipWith3,
    foldr,
    foldl,
    length,
    sum,
    add,
    scanl,
    scanr,
    reverse,
    replicate,
    repeat,
    cycle,
    iterate,
    (++),
    concat,
    concatMap,
    head,
    tail,
    null,
    (!!),
    take,
    drop,
    filter,
    takeWhile,
    inits,
    tails,
    ) where

import List.Basic
import ListLive
import Function
import Prelude ( (-), (+), Num, Int, Bool(False,True), error )


map :: (a -> b) -> [a] -> [b] ;
map :: forall a b. (a -> b) -> [a] -> [b]
map a -> b
_ [] = [] ;
map a -> b
f (a
x : [a]
xs) = a -> b
f a
x b -> [b] -> [b]
forall a. a -> [a] -> [a]
: (a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map a -> b
f [a]
xs ;

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] ;
zipWith :: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> b -> c
f (a
x : [a]
xs) (b
y : [b]
ys) =
    a -> b -> c
f a
x b
y c -> [c] -> [c]
forall a. a -> [a] -> [a]
: (a -> b -> c) -> [a] -> [b] -> [c]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> b -> c
f [a]
xs [b]
ys ;
zipWith a -> b -> c
_f [a]
_xs [b]
_ys = [] ;

zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] ;
zipWith3 :: forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3 a -> b -> c -> d
f (a
x : [a]
xs) (b
y : [b]
ys) (c
z : [c]
zs) =
    a -> b -> c -> d
f a
x b
y c
z d -> [d] -> [d]
forall a. a -> [a] -> [a]
: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3 a -> b -> c -> d
f [a]
xs [b]
ys [c]
zs ;
zipWith3 a -> b -> c -> d
_f [a]
_xs [b]
_ys [c]
_zs = [] ;

foldr :: (b -> a -> a) -> a -> [b] -> a ;
foldr :: forall b a. (b -> a -> a) -> a -> [b] -> a
foldr b -> a -> a
_ a
a [] = a
a ;
foldr b -> a -> a
f a
a (b
x : [b]
xs) = b -> a -> a
f b
x ( (b -> a -> a) -> a -> [b] -> a
forall b a. (b -> a -> a) -> a -> [b] -> a
foldr b -> a -> a
f a
a [b]
xs ) ;

foldl :: (b -> a -> b) -> b -> [a] -> b ;
foldl :: forall b a. (b -> a -> b) -> b -> [a] -> b
foldl b -> a -> b
_ b
a [] = b
a ;
foldl b -> a -> b
f b
a (a
x : [a]
xs) = (b -> a -> b) -> b -> [a] -> b
forall b a. (b -> a -> b) -> b -> [a] -> b
foldl b -> a -> b
f (b -> a -> b
f b
a a
x) [a]
xs ;

length :: [a] -> Int ;
length :: forall a. [a] -> Int
length = [Int] -> Int
forall a. Integral a => [a] -> a
sumInteger ([Int] -> Int) -> ([a] -> [Int]) -> [a] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Int) -> [a] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> a -> Int
forall a b. a -> b -> a
const Int
1) ;

sum :: (Num a) => [a] -> a ;
sum :: forall a. Num a => [a] -> a
sum = (a -> a -> a) -> a -> [a] -> a
forall b a. (b -> a -> b) -> b -> [a] -> b
foldl a -> a -> a
forall a. Num a => a -> a -> a
add a
0 ;

add :: (Num a) => a -> a -> a ;
add :: forall a. Num a => a -> a -> a
add a
x a
y = a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
y ;


scanl :: (a -> b -> a) -> a -> [b] -> [a] ;
scanl :: forall a b. (a -> b -> a) -> a -> [b] -> [a]
scanl a -> b -> a
_ a
a [] = [a
a] ;
scanl a -> b -> a
f a
a (b
x : [b]
xs) = a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> b -> a) -> a -> [b] -> [a]
forall a b. (a -> b -> a) -> a -> [b] -> [a]
scanl a -> b -> a
f (a -> b -> a
f a
a b
x) [b]
xs ;

scanr :: (b -> a -> a) -> a -> [b] -> [a] ;
scanr :: forall b a. (b -> a -> a) -> a -> [b] -> [a]
scanr b -> a -> a
_ a
a [] = [a
a] ;
scanr b -> a -> a
f a
a (b
x : [b]
xs) = (b -> a -> a) -> b -> [a] -> [a]
forall b a. (b -> a -> a) -> b -> [a] -> [a]
scanrAux b -> a -> a
f b
x ((b -> a -> a) -> a -> [b] -> [a]
forall b a. (b -> a -> a) -> a -> [b] -> [a]
scanr b -> a -> a
f a
a [b]
xs) ;

scanrAux :: (b -> a -> a) -> b -> [a] -> [a] ;
scanrAux :: forall b a. (b -> a -> a) -> b -> [a] -> [a]
scanrAux b -> a -> a
f b
x [a]
ys = b -> a -> a
f b
x ([a] -> a
forall a. [a] -> a
head [a]
ys) a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ys ;


reverse :: [a] -> [a] ;
reverse :: forall a. [a] -> [a]
reverse = ([a] -> a -> [a]) -> [a] -> [a] -> [a]
forall b a. (b -> a -> b) -> b -> [a] -> b
foldl ((a -> [a] -> [a]) -> [a] -> a -> [a]
forall b a c. (b -> a -> c) -> a -> b -> c
flip a -> [a] -> [a]
forall a. a -> [a] -> [a]
cons) [] ;

replicate :: Int -> a -> [a] ;
replicate :: forall a. Int -> a -> [a]
replicate Int
n a
x = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
n ( a -> [a]
forall a. a -> [a]
repeat a
x ) ;

repeat :: a -> [a] ;
repeat :: forall a. a -> [a]
repeat a
s = a
s a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a -> [a]
forall a. a -> [a]
repeat a
s ;

cycle :: [a] -> [a] ;
cycle :: forall a. [a] -> [a]
cycle [a]
s = [a]
s [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. [a] -> [a]
cycle [a]
s ;

iterate :: (a -> a) -> a -> [a] ;
iterate :: forall a. (a -> a) -> a -> [a]
iterate a -> a
f a
x = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate a -> a
f (a -> a
f a
x) ;


concatMap :: (a -> [b]) -> [a] -> [b] ;
concatMap :: forall a b. (a -> [b]) -> [a] -> [b]
concatMap a -> [b]
f = [[b]] -> [b]
forall a. [[a]] -> [a]
concat ([[b]] -> [b]) -> ([a] -> [[b]]) -> [a] -> [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> [b]) -> [a] -> [[b]]
forall a b. (a -> b) -> [a] -> [b]
map a -> [b]
f ;

head :: [a] -> a ;
head :: forall a. [a] -> a
head (a
x:[a]
_) = a
x ;
head [] = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"head: empty list" ;

tail :: [a] -> [a] ;
tail :: forall a. [a] -> [a]
tail (a
_:[a]
xs) = [a]
xs ;
tail [] = [Char] -> [a]
forall a. HasCallStack => [Char] -> a
error [Char]
"tail: empty list" ;

null :: [a] -> Bool ;
null :: forall a. [a] -> Bool
null [] = Bool
True ;
null [a]
_ = Bool
False ;

(!!) :: [a] -> Int -> a ;
(a
x:[a]
_)  !! :: forall a. [a] -> Int -> a
!! Int
0 = a
x ;
(a
_:[a]
xs) !! Int
n = [a]
xs [a] -> Int -> a
forall a. [a] -> Int -> a
!! (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) ;
[] !! Int
_ = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"!!: index too large" ;

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


inits :: [a] -> [[a]] ;
inits :: forall a. [a] -> [[a]]
inits [a]
xs = [] [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
forall a. [a] -> [[a]]
initsAux [a]
xs ;

initsAux :: [a] -> [[a]] ;
initsAux :: forall a. [a] -> [[a]]
initsAux [] = [] ;
initsAux (a
x:[a]
xs) = ([a] -> [a]) -> [[a]] -> [[a]]
forall a b. (a -> b) -> [a] -> [b]
map (a -> [a] -> [a]
forall a. a -> [a] -> [a]
cons a
x) ([a] -> [[a]]
forall a. [a] -> [[a]]
inits [a]
xs) ;

tails :: [a] -> [[a]] ;
tails :: forall a. [a] -> [[a]]
tails [a]
xs = [a]
xs [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
forall a. [a] -> [[a]]
tailsAux [a]
xs ;

tailsAux :: [a] -> [[a]] ;
tailsAux :: forall a. [a] -> [[a]]
tailsAux [] = [] ;
tailsAux (a
_:[a]
xs) = [a] -> [[a]]
forall a. [a] -> [[a]]
tails [a]
xs ;