{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ConstraintKinds  #-}
{- |
A module wrapping @Prelude@/@Data.List@ functions that can throw exceptions, such as @head@ and @!!@.
Each unsafe function has up to four variants, e.g. with @tail@:

* @'tail' :: [a] -> [a]@, raises an error on @tail []@.

* @'tailMay' :: [a] -> /Maybe/ [a]@, turns errors into @Nothing@.

* @'tailDef' :: /[a]/ -> [a] -> [a]@, takes a default to return on errors.

* @'tailNote' :: 'Partial' => /String/ -> [a] -> [a]@, takes an extra argument which supplements the error message.

* @'tailSafe' :: [a] -> [a]@, returns some sensible default if possible, @[]@ in the case of @tail@.

All functions marked with the @'Partial'@ constraint are not total, and will produce stack traces on error, on GHC
versions which support them (see "GHC.Stack").

This module also introduces some new functions, documented at the top of the module.
-}

module Safe(
    -- * New functions
    abort, at, lookupJust, findJust, elemIndexJust, findIndexJust,
    -- * Safe wrappers
    tailMay, tailDef, tailNote, tailSafe,
    initMay, initDef, initNote, initSafe,
    headMay, headDef, headNote,
    lastMay, lastDef, lastNote,
    minimumMay, minimumNote,
    maximumMay, maximumNote,
    minimumByMay, minimumByNote,
    maximumByMay, maximumByNote,
    minimumBoundBy, maximumBoundBy,
    maximumBounded, maximumBound,
    minimumBounded, minimumBound,
    foldr1May, foldr1Def, foldr1Note,
    foldl1May, foldl1Def, foldl1Note,
    foldl1May', foldl1Def', foldl1Note',
    scanl1May, scanl1Def, scanl1Note,
    scanr1May, scanr1Def, scanr1Note,
    cycleMay, cycleDef, cycleNote,
    fromJustDef, fromJustNote,
    assertNote,
    atMay, atDef, atNote,
    readMay, readDef, readNote, readEitherSafe,
    lookupJustDef, lookupJustNote,
    findJustDef, findJustNote,
    elemIndexJustDef, elemIndexJustNote,
    findIndexJustDef, findIndexJustNote,
    toEnumMay, toEnumDef, toEnumNote, toEnumSafe,
    succMay, succDef, succNote, succSafe,
    predMay, predDef, predNote, predSafe,
    indexMay, indexDef, indexNote,
    -- * Discouraged
    minimumDef, maximumDef, minimumByDef, maximumByDef
    ) where

import Safe.Util
import Data.Ix
import Data.List
import Data.Maybe
import Safe.Partial

---------------------------------------------------------------------
-- UTILITIES

fromNote :: Partial => String -> String -> Maybe a -> a
fromNote :: forall a. Partial => String -> String -> Maybe a -> a
fromNote = forall a. Partial => String -> String -> String -> Maybe a -> a
fromNoteModule String
"Safe"

fromNoteEither :: Partial => String -> String -> Either String a -> a
fromNoteEither :: forall a. Partial => String -> String -> Either String a -> a
fromNoteEither = forall a.
Partial =>
String -> String -> String -> Either String a -> a
fromNoteEitherModule String
"Safe"


---------------------------------------------------------------------
-- IMPLEMENTATIONS

-- | Synonym for 'error'. Used for instances where the program
--   has decided to exit because of invalid user input, or the user pressed
--   quit etc. This function allows 'error' to be reserved for programmer errors.
abort :: Partial => String -> a
abort :: forall a. Partial => String -> a
abort String
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack (forall a. Partial => String -> a
error String
x)


at_ :: [a] -> Int -> Either String a
at_ :: forall a. [a] -> Int -> Either String a
at_ [a]
xs Int
o | Int
o forall a. Ord a => a -> a -> Bool
< Int
0 = forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"index must not be negative, index=" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
o
         | Bool
otherwise = forall {b}. Int -> [b] -> Either String b
f Int
o [a]
xs
    where f :: Int -> [b] -> Either String b
f Int
0 (b
x:[b]
xs) = forall a b. b -> Either a b
Right b
x
          f Int
i (b
x:[b]
xs) = Int -> [b] -> Either String b
f (Int
iforall a. Num a => a -> a -> a
-Int
1) [b]
xs
          f Int
i [] = forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"index too large, index=" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
o forall a. [a] -> [a] -> [a]
++ String
", length=" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Int
oforall a. Num a => a -> a -> a
-Int
i)


---------------------------------------------------------------------
-- WRAPPERS

-- |
-- > tailMay [] = Nothing
-- > tailMay [1,3,4] = Just [3,4]
tailMay :: [a] -> Maybe [a]
tailMay :: forall a. [a] -> Maybe [a]
tailMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall a. [a] -> [a]
tail

-- |
-- > tailDef [12] [] = [12]
-- > tailDef [12] [1,3,4] = [3,4]
tailDef :: [a] -> [a] -> [a]
tailDef :: forall a. [a] -> [a] -> [a]
tailDef [a]
def = forall a. a -> Maybe a -> a
fromMaybe [a]
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe [a]
tailMay

-- |
-- > tailNote "help me" [] = error "Safe.tailNote [], help me"
-- > tailNote "help me" [1,3,4] = [3,4]
tailNote :: Partial => String -> [a] -> [a]
tailNote :: forall a. Partial => String -> [a] -> [a]
tailNote String
note [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"tailNote []" forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe [a]
tailMay [a]
x

-- |
-- > tailSafe [] = []
-- > tailSafe [1,3,4] = [3,4]
tailSafe :: [a] -> [a]
tailSafe :: forall a. [a] -> [a]
tailSafe = forall a. [a] -> [a] -> [a]
tailDef []


initMay :: [a] -> Maybe [a]
initMay :: forall a. [a] -> Maybe [a]
initMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall a. [a] -> [a]
init

initDef :: [a] -> [a] -> [a]
initDef :: forall a. [a] -> [a] -> [a]
initDef [a]
def = forall a. a -> Maybe a -> a
fromMaybe [a]
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe [a]
initMay

initNote :: Partial => String -> [a] -> [a]
initNote :: forall a. Partial => String -> [a] -> [a]
initNote String
note [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"initNote []" forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe [a]
initMay [a]
x

initSafe :: [a] -> [a]
initSafe :: forall a. [a] -> [a]
initSafe = forall a. [a] -> [a] -> [a]
initDef []



headMay, lastMay :: [a] -> Maybe a
headMay :: forall a. [a] -> Maybe a
headMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall a. [a] -> a
head
lastMay :: forall a. [a] -> Maybe a
lastMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall a. [a] -> a
last

headDef, lastDef :: a -> [a] -> a
headDef :: forall a. a -> [a] -> a
headDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe a
headMay
lastDef :: forall a. a -> [a] -> a
lastDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe a
lastMay

headNote, lastNote :: Partial => String -> [a] -> a
headNote :: forall a. Partial => String -> [a] -> a
headNote String
note [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"headNote []" forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
headMay [a]
x
lastNote :: forall a. Partial => String -> [a] -> a
lastNote String
note [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"lastNote []" forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
lastMay [a]
x

minimumMay, maximumMay :: Ord a => [a] -> Maybe a
minimumMay :: forall a. Ord a => [a] -> Maybe a
minimumMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum
maximumMay :: forall a. Ord a => [a] -> Maybe a
maximumMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum

minimumNote, maximumNote :: (Partial, Ord a) => String -> [a] -> a
minimumNote :: forall a. (Partial, Ord a) => String -> [a] -> a
minimumNote String
note [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"minumumNote []" forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> Maybe a
minimumMay [a]
x
maximumNote :: forall a. (Partial, Ord a) => String -> [a] -> a
maximumNote String
note [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"maximumNote []" forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> Maybe a
maximumMay [a]
x

minimumByMay, maximumByMay :: (a -> a -> Ordering) -> [a] -> Maybe a
minimumByMay :: forall a. (a -> a -> Ordering) -> [a] -> Maybe a
minimumByMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
minimumBy
maximumByMay :: forall a. (a -> a -> Ordering) -> [a] -> Maybe a
maximumByMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
maximumBy

minimumByNote, maximumByNote :: Partial => String -> (a -> a -> Ordering) -> [a] -> a
minimumByNote :: forall a. Partial => String -> (a -> a -> Ordering) -> [a] -> a
minimumByNote String
note a -> a -> Ordering
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"minumumByNote []" forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> Ordering) -> [a] -> Maybe a
minimumByMay a -> a -> Ordering
f [a]
x
maximumByNote :: forall a. Partial => String -> (a -> a -> Ordering) -> [a] -> a
maximumByNote String
note a -> a -> Ordering
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"maximumByNote []" forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> Ordering) -> [a] -> Maybe a
maximumByMay a -> a -> Ordering
f [a]
x

-- | The largest element of a list with respect to the
-- given comparison function. The result is bounded by the value given as the first argument.
maximumBoundBy :: a -> (a -> a -> Ordering) -> [a] -> a
maximumBoundBy :: forall a. a -> (a -> a -> Ordering) -> [a] -> a
maximumBoundBy a
x a -> a -> Ordering
f [a]
xs = forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
maximumBy a -> a -> Ordering
f forall a b. (a -> b) -> a -> b
$ a
x forall a. a -> [a] -> [a]
: [a]
xs

-- | The smallest element of a list with respect to the
-- given comparison function. The result is bounded by the value given as the first argument.
minimumBoundBy :: a -> (a -> a -> Ordering) -> [a] -> a
minimumBoundBy :: forall a. a -> (a -> a -> Ordering) -> [a] -> a
minimumBoundBy a
x a -> a -> Ordering
f [a]
xs = forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
minimumBy a -> a -> Ordering
f forall a b. (a -> b) -> a -> b
$ a
x forall a. a -> [a] -> [a]
: [a]
xs

-- | The largest element of a list.
-- The result is bounded by the value given as the first argument.
maximumBound :: Ord a => a -> [a] -> a
maximumBound :: forall a. Ord a => a -> [a] -> a
maximumBound a
x [a]
xs = forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ a
x forall a. a -> [a] -> [a]
: [a]
xs

-- | The smallest element of a list.
-- The result is bounded by the value given as the first argument.
minimumBound :: Ord a => a -> [a] -> a
minimumBound :: forall a. Ord a => a -> [a] -> a
minimumBound a
x [a]
xs = forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum forall a b. (a -> b) -> a -> b
$ a
x forall a. a -> [a] -> [a]
: [a]
xs

-- | The largest element of a list.
-- The result is bounded by 'minBound'.
maximumBounded :: (Ord a, Bounded a) => [a] -> a
maximumBounded :: forall a. (Ord a, Bounded a) => [a] -> a
maximumBounded = forall a. Ord a => a -> [a] -> a
maximumBound forall a. Bounded a => a
minBound

-- | The largest element of a list.
-- The result is bounded by 'maxBound'.
minimumBounded :: (Ord a, Bounded a) => [a] -> a
minimumBounded :: forall a. (Ord a, Bounded a) => [a] -> a
minimumBounded = forall a. Ord a => a -> [a] -> a
minimumBound forall a. Bounded a => a
maxBound

foldr1May, foldl1May, foldl1May' :: (a -> a -> a) -> [a] -> Maybe a
foldr1May :: forall a. (a -> a -> a) -> [a] -> Maybe a
foldr1May = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1
foldl1May :: forall a. (a -> a -> a) -> [a] -> Maybe a
foldl1May = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1
foldl1May' :: forall a. (a -> a -> a) -> [a] -> Maybe a
foldl1May' = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> a) -> [a] -> a
foldl1'

foldr1Note, foldl1Note, foldl1Note' :: Partial => String -> (a -> a -> a) -> [a] -> a
foldr1Note :: forall a. Partial => String -> (a -> a -> a) -> [a] -> a
foldr1Note String
note a -> a -> a
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"foldr1Note []" forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> a) -> [a] -> Maybe a
foldr1May a -> a -> a
f [a]
x
foldl1Note :: forall a. Partial => String -> (a -> a -> a) -> [a] -> a
foldl1Note String
note a -> a -> a
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"foldl1Note []" forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> a) -> [a] -> Maybe a
foldl1May a -> a -> a
f [a]
x
foldl1Note' :: forall a. Partial => String -> (a -> a -> a) -> [a] -> a
foldl1Note' String
note a -> a -> a
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"foldl1Note []" forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> a) -> [a] -> Maybe a
foldl1May' a -> a -> a
f [a]
x

scanr1May, scanl1May :: (a -> a -> a) -> [a] -> Maybe [a]
scanr1May :: forall a. (a -> a -> a) -> [a] -> Maybe [a]
scanr1May = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> a) -> [a] -> [a]
scanr1
scanl1May :: forall a. (a -> a -> a) -> [a] -> Maybe [a]
scanl1May = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> a) -> [a] -> [a]
scanl1

scanr1Def, scanl1Def :: [a] -> (a -> a -> a) -> [a] -> [a]
scanr1Def :: forall a. [a] -> (a -> a -> a) -> [a] -> [a]
scanr1Def [a]
def = forall a. a -> Maybe a -> a
fromMaybe [a]
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. (a -> a -> a) -> [a] -> Maybe [a]
scanr1May
scanl1Def :: forall a. [a] -> (a -> a -> a) -> [a] -> [a]
scanl1Def [a]
def = forall a. a -> Maybe a -> a
fromMaybe [a]
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. (a -> a -> a) -> [a] -> Maybe [a]
scanl1May

scanr1Note, scanl1Note :: Partial => String -> (a -> a -> a) -> [a] -> [a]
scanr1Note :: forall a. Partial => String -> (a -> a -> a) -> [a] -> [a]
scanr1Note String
note a -> a -> a
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"scanr1Note []" forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> a) -> [a] -> Maybe [a]
scanr1May a -> a -> a
f [a]
x
scanl1Note :: forall a. Partial => String -> (a -> a -> a) -> [a] -> [a]
scanl1Note String
note a -> a -> a
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"scanl1Note []" forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> a) -> [a] -> Maybe [a]
scanl1May a -> a -> a
f [a]
x

cycleMay :: [a] -> Maybe [a]
cycleMay :: forall a. [a] -> Maybe [a]
cycleMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall a. [a] -> [a]
cycle

cycleDef :: [a] -> [a] -> [a]
cycleDef :: forall a. [a] -> [a] -> [a]
cycleDef [a]
def = forall a. a -> Maybe a -> a
fromMaybe [a]
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe [a]
cycleMay

cycleNote :: Partial => String -> [a] -> [a]
cycleNote :: forall a. Partial => String -> [a] -> [a]
cycleNote String
note [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"cycleNote []" forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe [a]
cycleMay [a]
x

-- | An alternative name for 'fromMaybe', to fit the naming scheme of this package.
--   Generally using 'fromMaybe' directly would be considered better style.
fromJustDef :: a -> Maybe a -> a
fromJustDef :: forall a. a -> Maybe a -> a
fromJustDef  = forall a. a -> Maybe a -> a
fromMaybe

fromJustNote :: Partial => String -> Maybe a -> a
fromJustNote :: forall a. Partial => String -> Maybe a -> a
fromJustNote String
note Maybe a
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"fromJustNote Nothing" Maybe a
x

assertNote :: Partial => String -> Bool -> a -> a
assertNote :: forall a. Partial => String -> Bool -> a -> a
assertNote String
note Bool
True a
val = a
val
assertNote String
note Bool
False a
val = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"assertNote False" forall a. Maybe a
Nothing


-- | Synonym for '!!', but includes more information in the error message.
at :: Partial => [a] -> Int -> a
at :: forall a. Partial => [a] -> Int -> a
at = forall a. Partial => String -> String -> Either String a -> a
fromNoteEither String
"" String
"at" forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. [a] -> Int -> Either String a
at_

atMay :: [a] -> Int -> Maybe a
atMay :: forall a. [a] -> Int -> Maybe a
atMay = forall a b. Either a b -> Maybe b
eitherToMaybe forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. [a] -> Int -> Either String a
at_

atDef :: a -> [a] -> Int -> a
atDef :: forall a. a -> [a] -> Int -> a
atDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. [a] -> Int -> Maybe a
atMay

atNote :: Partial => String -> [a] -> Int -> a
atNote :: forall a. Partial => String -> [a] -> Int -> a
atNote String
note [a]
f Int
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Either String a -> a
fromNoteEither String
note String
"atNote" forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Int -> Either String a
at_ [a]
f Int
x

-- | This function provides a more precise error message than 'readEither' from 'base'.
readEitherSafe :: Read a => String -> Either String a
readEitherSafe :: forall a. Read a => String -> Either String a
readEitherSafe String
s = case [a
x | (a
x,String
t) <- forall a. Read a => ReadS a
reads String
s, (String
"",String
"") <- ReadS String
lex String
t] of
        [a
x] -> forall a b. b -> Either a b
Right a
x
        []  -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"no parse on " forall a. [a] -> [a] -> [a]
++ String
prefix
        [a]
_   -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"ambiguous parse on " forall a. [a] -> [a] -> [a]
++ String
prefix
    where
        maxLength :: Int
maxLength = Int
15
        prefix :: String
prefix = Char
'\"' forall a. a -> [a] -> [a]
: String
a forall a. [a] -> [a] -> [a]
++ if forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s forall a. Ord a => a -> a -> Bool
<= Int
maxLength then String
b forall a. [a] -> [a] -> [a]
++ String
"\"" else String
"...\""
            where (String
a,String
b) = forall a. Int -> [a] -> ([a], [a])
splitAt (Int
maxLength forall a. Num a => a -> a -> a
- Int
3) String
s

readMay :: Read a => String -> Maybe a
readMay :: forall a. Read a => String -> Maybe a
readMay = forall a b. Either a b -> Maybe b
eitherToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Read a => String -> Either String a
readEitherSafe

readDef :: Read a => a -> String -> a
readDef :: forall a. Read a => a -> String -> a
readDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Read a => String -> Maybe a
readMay

-- | 'readNote' uses 'readEitherSafe' for the error message.
readNote :: (Partial, Read a) => String -> String -> a
readNote :: forall a. (Partial, Read a) => String -> String -> a
readNote String
note String
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Either String a -> a
fromNoteEither String
note String
"readNote" forall a b. (a -> b) -> a -> b
$ forall a. Read a => String -> Either String a
readEitherSafe String
x

-- |
-- > lookupJust key = fromJust . lookup key
lookupJust :: (Eq a, Partial) => a -> [(a,b)] -> b
lookupJust :: forall a b. (Eq a, Partial) => a -> [(a, b)] -> b
lookupJust a
x [(a, b)]
xs = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
"" String
"lookupJust, no matching value" forall a b. (a -> b) -> a -> b
$ forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup a
x [(a, b)]
xs

lookupJustDef :: Eq a => b -> a -> [(a,b)] -> b
lookupJustDef :: forall a b. Eq a => b -> a -> [(a, b)] -> b
lookupJustDef b
def = forall a. a -> Maybe a -> a
fromMaybe b
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup

lookupJustNote :: (Partial, Eq a) => String -> a -> [(a,b)] -> b
lookupJustNote :: forall a b. (Partial, Eq a) => String -> a -> [(a, b)] -> b
lookupJustNote String
note a
x [(a, b)]
xs = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"lookupJustNote, no matching value" forall a b. (a -> b) -> a -> b
$ forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup a
x [(a, b)]
xs

-- |
-- > findJust op = fromJust . find op
findJust :: (a -> Bool) -> [a] -> a
findJust :: forall a. (a -> Bool) -> [a] -> a
findJust = forall a. Partial => String -> String -> Maybe a -> a
fromNote String
"" String
"findJust, no matching value" forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find

findJustDef :: a -> (a -> Bool) -> [a] -> a
findJustDef :: forall a. a -> (a -> Bool) -> [a] -> a
findJustDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find

findJustNote :: Partial => String -> (a -> Bool) -> [a] -> a
findJustNote :: forall a. Partial => String -> (a -> Bool) -> [a] -> a
findJustNote String
note a -> Bool
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"findJustNote, no matching value" forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find a -> Bool
f [a]
x

-- |
-- > elemIndexJust op = fromJust . elemIndex op
elemIndexJust :: (Partial, Eq a) => a -> [a] -> Int
elemIndexJust :: forall a. (Partial, Eq a) => a -> [a] -> Int
elemIndexJust a
x [a]
xs = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
"" String
"elemIndexJust, no matching value" forall a b. (a -> b) -> a -> b
$ forall a. Eq a => a -> [a] -> Maybe Int
elemIndex a
x [a]
xs

elemIndexJustDef :: Eq a => Int -> a -> [a] -> Int
elemIndexJustDef :: forall a. Eq a => Int -> a -> [a] -> Int
elemIndexJustDef Int
def = forall a. a -> Maybe a -> a
fromMaybe Int
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. Eq a => a -> [a] -> Maybe Int
elemIndex

elemIndexJustNote :: (Partial, Eq a) => String -> a -> [a] -> Int
elemIndexJustNote :: forall a. (Partial, Eq a) => String -> a -> [a] -> Int
elemIndexJustNote String
note a
x [a]
xs = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"elemIndexJustNote, no matching value" forall a b. (a -> b) -> a -> b
$ forall a. Eq a => a -> [a] -> Maybe Int
elemIndex a
x [a]
xs

-- |
-- > findIndexJust op = fromJust . findIndex op
findIndexJust :: (a -> Bool) -> [a] -> Int
findIndexJust :: forall a. (a -> Bool) -> [a] -> Int
findIndexJust a -> Bool
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
"" String
"findIndexJust, no matching value" forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> Maybe Int
findIndex a -> Bool
f [a]
x

findIndexJustDef :: Int -> (a -> Bool) -> [a] -> Int
findIndexJustDef :: forall a. Int -> (a -> Bool) -> [a] -> Int
findIndexJustDef Int
def = forall a. a -> Maybe a -> a
fromMaybe Int
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. (a -> Bool) -> [a] -> Maybe Int
findIndex

findIndexJustNote :: Partial => String -> (a -> Bool) -> [a] -> Int
findIndexJustNote :: forall a. Partial => String -> (a -> Bool) -> [a] -> Int
findIndexJustNote String
note a -> Bool
f [a]
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"findIndexJustNote, no matching value" forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> Maybe Int
findIndex a -> Bool
f [a]
x

-- From http://stackoverflow.com/questions/2743858/safe-and-polymorphic-toenum
-- answer by C. A. McCann
toEnumMay :: (Enum a, Bounded a) => Int -> Maybe a
toEnumMay :: forall a. (Enum a, Bounded a) => Int -> Maybe a
toEnumMay Int
i =
  let r :: a
r = forall a. Enum a => Int -> a
toEnum Int
i
      max :: a
max = forall a. Bounded a => a
maxBound forall a. a -> a -> a
`asTypeOf` a
r
      min :: a
min = forall a. Bounded a => a
minBound forall a. a -> a -> a
`asTypeOf` a
r
  in if Int
i forall a. Ord a => a -> a -> Bool
>= forall a. Enum a => a -> Int
fromEnum a
min Bool -> Bool -> Bool
&& Int
i forall a. Ord a => a -> a -> Bool
<= forall a. Enum a => a -> Int
fromEnum a
max
  then forall a. a -> Maybe a
Just a
r
  else forall a. Maybe a
Nothing

toEnumDef :: (Enum a, Bounded a) => a -> Int -> a
toEnumDef :: forall a. (Enum a, Bounded a) => a -> Int -> a
toEnumDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Enum a, Bounded a) => Int -> Maybe a
toEnumMay

toEnumNote :: (Partial, Enum a, Bounded a) => String -> Int -> a
toEnumNote :: forall a. (Partial, Enum a, Bounded a) => String -> Int -> a
toEnumNote String
note Int
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"toEnumNote, out of range" forall a b. (a -> b) -> a -> b
$ forall a. (Enum a, Bounded a) => Int -> Maybe a
toEnumMay Int
x

toEnumSafe :: (Enum a, Bounded a) => Int -> a
toEnumSafe :: forall a. (Enum a, Bounded a) => Int -> a
toEnumSafe = forall a. (Enum a, Bounded a) => a -> Int -> a
toEnumDef forall a. Bounded a => a
minBound

succMay :: (Enum a, Eq a, Bounded a) => a -> Maybe a
succMay :: forall a. (Enum a, Eq a, Bounded a) => a -> Maybe a
succMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay (forall a. Eq a => a -> a -> Bool
== forall a. Bounded a => a
maxBound) forall a. Enum a => a -> a
succ

succDef :: (Enum a, Eq a, Bounded a) => a -> a -> a
succDef :: forall a. (Enum a, Eq a, Bounded a) => a -> a -> a
succDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Enum a, Eq a, Bounded a) => a -> Maybe a
succMay

succNote :: (Partial, Enum a, Eq a, Bounded a) => String -> a -> a
succNote :: forall a. (Partial, Enum a, Eq a, Bounded a) => String -> a -> a
succNote String
note a
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"succNote, out of range" forall a b. (a -> b) -> a -> b
$ forall a. (Enum a, Eq a, Bounded a) => a -> Maybe a
succMay a
x

succSafe :: (Enum a, Eq a, Bounded a) => a -> a
succSafe :: forall a. (Enum a, Eq a, Bounded a) => a -> a
succSafe = forall a. (Enum a, Eq a, Bounded a) => a -> a -> a
succDef forall a. Bounded a => a
maxBound

predMay :: (Enum a, Eq a, Bounded a) => a -> Maybe a
predMay :: forall a. (Enum a, Eq a, Bounded a) => a -> Maybe a
predMay = forall a b. (a -> Bool) -> (a -> b) -> a -> Maybe b
liftMay (forall a. Eq a => a -> a -> Bool
== forall a. Bounded a => a
minBound) forall a. Enum a => a -> a
pred

predDef :: (Enum a, Eq a, Bounded a) => a -> a -> a
predDef :: forall a. (Enum a, Eq a, Bounded a) => a -> a -> a
predDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Enum a, Eq a, Bounded a) => a -> Maybe a
predMay

predNote :: (Partial, Enum a, Eq a, Bounded a) => String -> a -> a
predNote :: forall a. (Partial, Enum a, Eq a, Bounded a) => String -> a -> a
predNote String
note a
x = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"predNote, out of range" forall a b. (a -> b) -> a -> b
$ forall a. (Enum a, Eq a, Bounded a) => a -> Maybe a
predMay a
x

predSafe :: (Enum a, Eq a, Bounded a) => a -> a
predSafe :: forall a. (Enum a, Eq a, Bounded a) => a -> a
predSafe = forall a. (Enum a, Eq a, Bounded a) => a -> a -> a
predDef forall a. Bounded a => a
minBound

indexMay :: Ix a => (a, a) -> a -> Maybe Int
indexMay :: forall a. Ix a => (a, a) -> a -> Maybe Int
indexMay (a, a)
b a
i = if forall a. Ix a => (a, a) -> a -> Bool
inRange (a, a)
b a
i then forall a. a -> Maybe a
Just (forall a. Ix a => (a, a) -> a -> Int
index (a, a)
b a
i) else forall a. Maybe a
Nothing

indexDef :: Ix a => Int -> (a, a) -> a -> Int
indexDef :: forall a. Ix a => Int -> (a, a) -> a -> Int
indexDef Int
def (a, a)
b = forall a. a -> Maybe a -> a
fromMaybe Int
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ix a => (a, a) -> a -> Maybe Int
indexMay (a, a)
b

indexNote :: (Partial, Ix a) => String -> (a, a) -> a -> Int
indexNote :: forall a. (Partial, Ix a) => String -> (a, a) -> a -> Int
indexNote String
note (a, a)
x a
y = forall a. Partial => (Partial => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall a. Partial => String -> String -> Maybe a -> a
fromNote String
note String
"indexNote, out of range" forall a b. (a -> b) -> a -> b
$ forall a. Ix a => (a, a) -> a -> Maybe Int
indexMay (a, a)
x a
y


---------------------------------------------------------------------
-- DISCOURAGED

-- | New users are recommended to use 'minimumBound' or 'maximumBound' instead.
minimumDef, maximumDef :: Ord a => a -> [a] -> a
minimumDef :: forall a. Ord a => a -> [a] -> a
minimumDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => [a] -> Maybe a
minimumMay
maximumDef :: forall a. Ord a => a -> [a] -> a
maximumDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => [a] -> Maybe a
maximumMay

-- | New users are recommended to use 'minimumBoundBy' or 'maximumBoundBy' instead.
minimumByDef, maximumByDef :: a -> (a -> a -> Ordering) -> [a] -> a
minimumByDef :: forall a. a -> (a -> a -> Ordering) -> [a] -> a
minimumByDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. (a -> a -> Ordering) -> [a] -> Maybe a
minimumByMay
maximumByDef :: forall a. a -> (a -> a -> Ordering) -> [a] -> a
maximumByDef a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. (a -> a -> Ordering) -> [a] -> Maybe a
maximumByMay


---------------------------------------------------------------------
-- DEPRECATED

{-# DEPRECATED foldr1Def "Use @foldr1May@ instead." #-}
{-# DEPRECATED foldl1Def "Use @foldl1May@ instead." #-}
{-# DEPRECATED foldl1Def' "Use @foldl1May'@ instead." #-}
foldr1Def, foldl1Def, foldl1Def' :: a -> (a -> a -> a) -> [a] -> a
foldr1Def :: forall a. a -> (a -> a -> a) -> [a] -> a
foldr1Def a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. (a -> a -> a) -> [a] -> Maybe a
foldr1May
foldl1Def :: forall a. a -> (a -> a -> a) -> [a] -> a
foldl1Def a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. (a -> a -> a) -> [a] -> Maybe a
foldl1May
foldl1Def' :: forall a. a -> (a -> a -> a) -> [a] -> a
foldl1Def' a
def = forall a. a -> Maybe a -> a
fromMaybe a
def forall b c a1 a2.
Partial =>
(b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
.^ forall a. (a -> a -> a) -> [a] -> Maybe a
foldl1May'