module Data.List.Located
( module Data.List
, head, tail, last, init, foldr1, foldl1, foldl1'
, maximum, minimum, cycle, (!!)
) where
import Data.List hiding ( head, tail, last, init, foldr1, foldl1, foldl1'
, maximum, minimum, cycle, (!!)
)
import qualified GHC.Err.Located as L
import Prelude hiding ( head, tail, last, init, foldr1, foldl1
, maximum, minimum, cycle, (!!)
)
head :: L.HasCallStack => [a] -> a
head (x:_) = x
head [] = L.error "Prelude.head: empty list"
tail :: L.HasCallStack => [a] -> [a]
tail (_:xs) = xs
tail [] = L.error "Prelude.tail: empty list"
last :: L.HasCallStack => [a] -> a
last [x] = x
last (_:xs) = last xs
last [] = L.error "Prelude.last: empty list"
init :: L.HasCallStack => [a] -> [a]
init [_] = []
init (x:xs) = x : init xs
init [] = L.error "Prelude.init: empty list"
foldr1 :: L.HasCallStack => (a -> a -> a) -> [a] -> a
foldr1 _ [x] = x
foldr1 f (x:xs) = f x (foldr1 f xs)
foldr1 _ [] = L.error "Prelude.foldr1: empty list"
foldl1 :: L.HasCallStack => (a -> a -> a) -> [a] -> a
foldl1 f (x:xs) = foldl f x xs
foldl1 _ [] = L.error "Prelude.foldl1: empty list"
foldl1' :: L.HasCallStack => (a -> a -> a) -> [a] -> a
foldl1' f (x:xs) = foldl' f x xs
foldl1' _ [] = L.error "Prelude.foldl1': empty list"
maximum :: (L.HasCallStack, Ord a) => [a] -> a
maximum [] = L.error "Prelude.maximum: empty list"
maximum xs = foldl1 max xs
minimum :: (L.HasCallStack, Ord a) => [a] -> a
minimum [] = L.error "Prelude.minimum: empty list"
minimum xs = foldl1 min xs
cycle :: L.HasCallStack => [a] -> [a]
cycle [] = L.error "Prelude.cycle: empty list"
cycle xs = xs' where xs' = xs ++ xs'
(!!) :: L.HasCallStack => [a] -> Int -> a
_ !! n | n < 0 = L.error "Prelude.!!: negative index"
[] !! _ = L.error "Prelude.!!: index too large"
(x:_) !! 0 = x
(_:xs) !! n = xs !! (n1)