{-# LANGUAGE Trustworthy #-}
module Relude.Numeric
(
module Data.Bits
, module Data.Int
, module Data.Word
, module GHC.Base
, module GHC.Float
, module GHC.Num
, module GHC.Real
, module Numeric.Natural
, integerToBounded
, integerToNatural
) where
import Data.Bits (toIntegralSized, xor)
import Data.Int (Int, Int16, Int32, Int64, Int8)
import Data.Word (Word, Word16, Word32, Word64, Word8, byteSwap16, byteSwap32, byteSwap64)
import GHC.Base (maxInt, minInt)
import GHC.Float (Double (..), Float (..), Floating (acos, acosh, asin, asinh, atan, atanh, cos, cosh, exp, logBase, pi, sin, sinh, sqrt, tan, tanh, (**)),
RealFloat (atan2, decodeFloat, encodeFloat, floatDigits, floatRadix, floatRange, isDenormalized, isIEEE, isInfinite, isNaN, isNegativeZero))
import GHC.Num (Integer, Num (..), subtract)
import GHC.Real (Fractional (..), Integral (..), Ratio, Rational, Real (..), RealFrac (..),
denominator, even, fromIntegral, gcd, lcm, numerator, odd, realToFrac, (^), (^^))
import Numeric.Natural (Natural)
import Relude.Base (Bounded (..), (<), (>))
import Relude.Bool (otherwise)
import Relude.Function (($))
import Relude.Monad (Maybe (..))
integerToBounded :: forall a. (Integral a, Bounded a) => Integer -> Maybe a
integerToBounded n
| n < toInteger (minBound @a) = Nothing
| n > toInteger (maxBound @a) = Nothing
| otherwise = Just (fromIntegral n)
{-# INLINE integerToBounded #-}
integerToNatural :: Integer -> Maybe Natural
integerToNatural n
| n < 0 = Nothing
| otherwise = Just $ fromIntegral n
{-# INLINE integerToNatural #-}