{-# LANGUAGE DeriveDataTypeable #-}
module Data.List.Safe (
module LSafe,
head,
last,
tail,
init,
foldl1,
foldl1',
foldr1,
maximum,
minimum,
maximumBy,
minimumBy,
(!!),
wrap,
EmptyListException(..),
NegativeIndexException(..),
)where
import Prelude hiding (head, tail, init, last, foldl1, foldr1, maximum, minimum, (!!))
import Control.Monad.Catch
import qualified Data.List as L
import Data.List as LSafe hiding (head, last, tail, init, foldl1, foldl1', foldr1, maximum, minimum, maximumBy, minimumBy, (!!))
import Data.Typeable
data EmptyListException = EmptyListException deriving (Int -> EmptyListException -> ShowS
[EmptyListException] -> ShowS
EmptyListException -> String
(Int -> EmptyListException -> ShowS)
-> (EmptyListException -> String)
-> ([EmptyListException] -> ShowS)
-> Show EmptyListException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EmptyListException -> ShowS
showsPrec :: Int -> EmptyListException -> ShowS
$cshow :: EmptyListException -> String
show :: EmptyListException -> String
$cshowList :: [EmptyListException] -> ShowS
showList :: [EmptyListException] -> ShowS
Show, ReadPrec [EmptyListException]
ReadPrec EmptyListException
Int -> ReadS EmptyListException
ReadS [EmptyListException]
(Int -> ReadS EmptyListException)
-> ReadS [EmptyListException]
-> ReadPrec EmptyListException
-> ReadPrec [EmptyListException]
-> Read EmptyListException
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS EmptyListException
readsPrec :: Int -> ReadS EmptyListException
$creadList :: ReadS [EmptyListException]
readList :: ReadS [EmptyListException]
$creadPrec :: ReadPrec EmptyListException
readPrec :: ReadPrec EmptyListException
$creadListPrec :: ReadPrec [EmptyListException]
readListPrec :: ReadPrec [EmptyListException]
Read, EmptyListException -> EmptyListException -> Bool
(EmptyListException -> EmptyListException -> Bool)
-> (EmptyListException -> EmptyListException -> Bool)
-> Eq EmptyListException
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EmptyListException -> EmptyListException -> Bool
== :: EmptyListException -> EmptyListException -> Bool
$c/= :: EmptyListException -> EmptyListException -> Bool
/= :: EmptyListException -> EmptyListException -> Bool
Eq, Eq EmptyListException
Eq EmptyListException =>
(EmptyListException -> EmptyListException -> Ordering)
-> (EmptyListException -> EmptyListException -> Bool)
-> (EmptyListException -> EmptyListException -> Bool)
-> (EmptyListException -> EmptyListException -> Bool)
-> (EmptyListException -> EmptyListException -> Bool)
-> (EmptyListException -> EmptyListException -> EmptyListException)
-> (EmptyListException -> EmptyListException -> EmptyListException)
-> Ord EmptyListException
EmptyListException -> EmptyListException -> Bool
EmptyListException -> EmptyListException -> Ordering
EmptyListException -> EmptyListException -> EmptyListException
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: EmptyListException -> EmptyListException -> Ordering
compare :: EmptyListException -> EmptyListException -> Ordering
$c< :: EmptyListException -> EmptyListException -> Bool
< :: EmptyListException -> EmptyListException -> Bool
$c<= :: EmptyListException -> EmptyListException -> Bool
<= :: EmptyListException -> EmptyListException -> Bool
$c> :: EmptyListException -> EmptyListException -> Bool
> :: EmptyListException -> EmptyListException -> Bool
$c>= :: EmptyListException -> EmptyListException -> Bool
>= :: EmptyListException -> EmptyListException -> Bool
$cmax :: EmptyListException -> EmptyListException -> EmptyListException
max :: EmptyListException -> EmptyListException -> EmptyListException
$cmin :: EmptyListException -> EmptyListException -> EmptyListException
min :: EmptyListException -> EmptyListException -> EmptyListException
Ord, Typeable)
data NegativeIndexException = NegativeIndexException deriving (Int -> NegativeIndexException -> ShowS
[NegativeIndexException] -> ShowS
NegativeIndexException -> String
(Int -> NegativeIndexException -> ShowS)
-> (NegativeIndexException -> String)
-> ([NegativeIndexException] -> ShowS)
-> Show NegativeIndexException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NegativeIndexException -> ShowS
showsPrec :: Int -> NegativeIndexException -> ShowS
$cshow :: NegativeIndexException -> String
show :: NegativeIndexException -> String
$cshowList :: [NegativeIndexException] -> ShowS
showList :: [NegativeIndexException] -> ShowS
Show, ReadPrec [NegativeIndexException]
ReadPrec NegativeIndexException
Int -> ReadS NegativeIndexException
ReadS [NegativeIndexException]
(Int -> ReadS NegativeIndexException)
-> ReadS [NegativeIndexException]
-> ReadPrec NegativeIndexException
-> ReadPrec [NegativeIndexException]
-> Read NegativeIndexException
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS NegativeIndexException
readsPrec :: Int -> ReadS NegativeIndexException
$creadList :: ReadS [NegativeIndexException]
readList :: ReadS [NegativeIndexException]
$creadPrec :: ReadPrec NegativeIndexException
readPrec :: ReadPrec NegativeIndexException
$creadListPrec :: ReadPrec [NegativeIndexException]
readListPrec :: ReadPrec [NegativeIndexException]
Read, NegativeIndexException -> NegativeIndexException -> Bool
(NegativeIndexException -> NegativeIndexException -> Bool)
-> (NegativeIndexException -> NegativeIndexException -> Bool)
-> Eq NegativeIndexException
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NegativeIndexException -> NegativeIndexException -> Bool
== :: NegativeIndexException -> NegativeIndexException -> Bool
$c/= :: NegativeIndexException -> NegativeIndexException -> Bool
/= :: NegativeIndexException -> NegativeIndexException -> Bool
Eq, Eq NegativeIndexException
Eq NegativeIndexException =>
(NegativeIndexException -> NegativeIndexException -> Ordering)
-> (NegativeIndexException -> NegativeIndexException -> Bool)
-> (NegativeIndexException -> NegativeIndexException -> Bool)
-> (NegativeIndexException -> NegativeIndexException -> Bool)
-> (NegativeIndexException -> NegativeIndexException -> Bool)
-> (NegativeIndexException
-> NegativeIndexException -> NegativeIndexException)
-> (NegativeIndexException
-> NegativeIndexException -> NegativeIndexException)
-> Ord NegativeIndexException
NegativeIndexException -> NegativeIndexException -> Bool
NegativeIndexException -> NegativeIndexException -> Ordering
NegativeIndexException
-> NegativeIndexException -> NegativeIndexException
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: NegativeIndexException -> NegativeIndexException -> Ordering
compare :: NegativeIndexException -> NegativeIndexException -> Ordering
$c< :: NegativeIndexException -> NegativeIndexException -> Bool
< :: NegativeIndexException -> NegativeIndexException -> Bool
$c<= :: NegativeIndexException -> NegativeIndexException -> Bool
<= :: NegativeIndexException -> NegativeIndexException -> Bool
$c> :: NegativeIndexException -> NegativeIndexException -> Bool
> :: NegativeIndexException -> NegativeIndexException -> Bool
$c>= :: NegativeIndexException -> NegativeIndexException -> Bool
>= :: NegativeIndexException -> NegativeIndexException -> Bool
$cmax :: NegativeIndexException
-> NegativeIndexException -> NegativeIndexException
max :: NegativeIndexException
-> NegativeIndexException -> NegativeIndexException
$cmin :: NegativeIndexException
-> NegativeIndexException -> NegativeIndexException
min :: NegativeIndexException
-> NegativeIndexException -> NegativeIndexException
Ord, Typeable)
instance Exception EmptyListException
instance Exception NegativeIndexException
wrap :: MonadThrow m => ([a] -> b) -> [a] -> m b
wrap :: forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap [a] -> b
_ [] = EmptyListException -> m b
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM EmptyListException
EmptyListException
wrap [a] -> b
f [a]
xs = b -> m b
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> b -> m b
forall a b. (a -> b) -> a -> b
$ [a] -> b
f [a]
xs
head :: MonadThrow m => [a] -> m a
head :: forall (m :: * -> *) a. MonadThrow m => [a] -> m a
head = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap [a] -> a
forall a. HasCallStack => [a] -> a
L.head
last :: MonadThrow m => [a] -> m a
last :: forall (m :: * -> *) a. MonadThrow m => [a] -> m a
last = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap [a] -> a
forall a. HasCallStack => [a] -> a
L.last
tail :: MonadThrow m => [a] -> m [a]
tail :: forall (m :: * -> *) a. MonadThrow m => [a] -> m [a]
tail = ([a] -> [a]) -> [a] -> m [a]
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap [a] -> [a]
forall a. HasCallStack => [a] -> [a]
L.tail
init :: MonadThrow m => [a] -> m [a]
init :: forall (m :: * -> *) a. MonadThrow m => [a] -> m [a]
init = ([a] -> [a]) -> [a] -> m [a]
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap [a] -> [a]
forall a. HasCallStack => [a] -> [a]
L.init
foldl1 :: MonadThrow m => (a -> a -> a) -> [a] -> m a
foldl1 :: forall (m :: * -> *) a. MonadThrow m => (a -> a -> a) -> [a] -> m a
foldl1 = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap (([a] -> a) -> [a] -> m a)
-> ((a -> a -> a) -> [a] -> a) -> (a -> a -> a) -> [a] -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a -> a) -> [a] -> a
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
L.foldl1
foldl1' :: MonadThrow m => (a -> a -> a) -> [a] -> m a
foldl1' :: forall (m :: * -> *) a. MonadThrow m => (a -> a -> a) -> [a] -> m a
foldl1' = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap (([a] -> a) -> [a] -> m a)
-> ((a -> a -> a) -> [a] -> a) -> (a -> a -> a) -> [a] -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a -> a) -> [a] -> a
forall a. HasCallStack => (a -> a -> a) -> [a] -> a
L.foldl1'
foldr1 :: MonadThrow m => (a -> a -> a) -> [a] -> m a
foldr1 :: forall (m :: * -> *) a. MonadThrow m => (a -> a -> a) -> [a] -> m a
foldr1 = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap (([a] -> a) -> [a] -> m a)
-> ((a -> a -> a) -> [a] -> a) -> (a -> a -> a) -> [a] -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a -> a) -> [a] -> a
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
L.foldr1
maximum :: (MonadThrow m, Ord a) => [a] -> m a
maximum :: forall (m :: * -> *) a. (MonadThrow m, Ord a) => [a] -> m a
maximum = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap [a] -> a
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
L.maximum
minimum :: (MonadThrow m, Ord a) => [a] -> m a
minimum :: forall (m :: * -> *) a. (MonadThrow m, Ord a) => [a] -> m a
minimum = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap [a] -> a
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
L.minimum
maximumBy :: MonadThrow m => (a -> a -> Ordering) -> [a] -> m a
maximumBy :: forall (m :: * -> *) a.
MonadThrow m =>
(a -> a -> Ordering) -> [a] -> m a
maximumBy = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap (([a] -> a) -> [a] -> m a)
-> ((a -> a -> Ordering) -> [a] -> a)
-> (a -> a -> Ordering)
-> [a]
-> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a -> Ordering) -> [a] -> a
forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
L.maximumBy
minimumBy :: MonadThrow m => (a -> a -> Ordering) -> [a] -> m a
minimumBy :: forall (m :: * -> *) a.
MonadThrow m =>
(a -> a -> Ordering) -> [a] -> m a
minimumBy = ([a] -> a) -> [a] -> m a
forall (m :: * -> *) a b. MonadThrow m => ([a] -> b) -> [a] -> m b
wrap (([a] -> a) -> [a] -> m a)
-> ((a -> a -> Ordering) -> [a] -> a)
-> (a -> a -> Ordering)
-> [a]
-> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a -> Ordering) -> [a] -> a
forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
L.minimumBy
(!!) :: (MonadThrow m, Integral n) => [a] -> n -> m a
!! :: forall (m :: * -> *) n a.
(MonadThrow m, Integral n) =>
[a] -> n -> m a
(!!) [a]
xs n
i = [a] -> Integer -> m a
forall (m :: * -> *) n a.
(MonadThrow m, Integral n) =>
[a] -> n -> m a
index [a]
xs (n -> Integer
forall a. Integral a => a -> Integer
toInteger n
i)
where
index :: [a] -> n -> m a
index [] n
_ = EmptyListException -> m a
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM EmptyListException
EmptyListException
index (a
x:[a]
xs) n
n | n
n n -> n -> Bool
forall a. Eq a => a -> a -> Bool
== n
0 = a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
| n
n n -> n -> Bool
forall a. Ord a => a -> a -> Bool
< n
0 = NegativeIndexException -> m a
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM NegativeIndexException
NegativeIndexException
| Bool
otherwise = [a] -> n -> m a
forall (m :: * -> *) n a.
(MonadThrow m, Integral n) =>
[a] -> n -> m a
(!!) [a]
xs (n
nn -> n -> n
forall a. Num a => a -> a -> a
-n
1)