{-# LANGUAGE CPP #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
module Util
( liftEither
, readMaybe
, readEither
, fromIntegerMaybe
, module X
) where
import Control.Applicative as X
import Control.Monad as X
import Data.Int as X
import Data.Word as X
import Numeric.Natural as X (Natural)
import Control.Monad.Except
import Control.Monad.Identity as X
import Data.Char as X (chr, ord)
import Data.Map as X (Map)
import Data.Monoid as X (Monoid (mappend, mempty))
import Data.Set as X (Set)
import Data.Text as X (Text)
import Text.ParserCombinators.ReadP as P
import Text.Read
#if !MIN_VERSION_mtl(2,2,2)
liftEither :: MonadError e m => Either e a -> m a
liftEither = either throwError return
#endif
#if !MIN_VERSION_base(4,6,0)
readMaybe :: Read a => String -> Maybe a
readMaybe = either (const Nothing) id . readEither
readEither :: Read a => String -> Either String a
readEither s = case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of
[x] -> Right x
[] -> Left "Prelude.read: no parse"
_ -> Left "Prelude.read: ambiguous parse"
where
read' = do x <- readPrec
Text.Read.lift P.skipSpaces
return x
#endif
fromIntegerMaybe :: forall n . (Integral n, Bounded n) => Integer -> Maybe n
fromIntegerMaybe j
| l <= j, j <= u = Just (fromInteger j)
| otherwise = Nothing
where
u = toInteger (maxBound :: n)
l = toInteger (minBound :: n)