module Numeric.Convert.Internal
(
FromInteger (..),
ToInteger (..),
FromRational (..),
ToRational (..),
FromReal (..),
ToReal (..),
)
where
import Data.Coerce (coerce)
import Data.Complex (Complex)
import Data.Fixed (Fixed, HasResolution)
import Data.Int (Int16, Int32, Int64, Int8)
import Data.Kind (Constraint, Type)
import Data.Ratio (Ratio)
import Data.Word (Word16, Word32, Word64, Word8)
import GHC.Natural (Natural)
import GHC.Stack.Types (HasCallStack)
import Numeric.Algebra.Deriving
( AsFractional (MkAsFractional),
AsIntegral (MkAsIntegral),
AsNum (MkAsNum),
AsReal (MkAsReal),
)
type FromInteger :: Type -> Constraint
class FromInteger a where
fromZ :: (HasCallStack) => Integer -> a
instance (Fractional a) => FromInteger (AsFractional a) where
fromZ :: HasCallStack => Integer -> AsFractional a
fromZ = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(Integer -> a) @(Integer -> AsFractional a) Integer -> a
forall a. Num a => Integer -> a
fromInteger
{-# INLINE fromZ #-}
instance (Num a) => FromInteger (AsNum a) where
fromZ :: HasCallStack => Integer -> AsNum a
fromZ = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(Integer -> a) @(Integer -> AsNum a) Integer -> a
forall a. Num a => Integer -> a
fromInteger
{-# INLINE fromZ #-}
deriving via (AsNum Float) instance FromInteger Float
deriving via (AsNum Double) instance FromInteger Double
deriving via (AsNum Int) instance FromInteger Int
deriving via (AsNum Int8) instance FromInteger Int8
deriving via (AsNum Int16) instance FromInteger Int16
deriving via (AsNum Int32) instance FromInteger Int32
deriving via (AsNum Int64) instance FromInteger Int64
instance FromInteger Integer where
fromZ :: HasCallStack => Integer -> Integer
fromZ = Integer -> Integer
forall a. a -> a
id
{-# INLINE fromZ #-}
deriving via (AsNum Word) instance FromInteger Word
deriving via (AsNum Word8) instance FromInteger Word8
deriving via (AsNum Word16) instance FromInteger Word16
deriving via (AsNum Word32) instance FromInteger Word32
deriving via (AsNum Word64) instance FromInteger Word64
deriving via (AsNum Natural) instance FromInteger Natural
deriving via (AsNum (Ratio Integer)) instance FromInteger (Ratio Integer)
deriving via (AsNum (Ratio Natural)) instance FromInteger (Ratio Natural)
deriving via (AsNum (Complex a)) instance (RealFloat a) => FromInteger (Complex a)
deriving via (AsNum (Fixed a)) instance (HasResolution a) => FromInteger (Fixed a)
type ToInteger :: Type -> Constraint
class (ToRational a) => ToInteger a where
toZ :: (HasCallStack) => a -> Integer
instance (Integral a) => ToInteger (AsIntegral a) where
toZ :: HasCallStack => AsIntegral a -> Integer
toZ = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(a -> Integer) @(AsIntegral a -> Integer) a -> Integer
forall a. Integral a => a -> Integer
toInteger
{-# INLINE toZ #-}
deriving via (AsIntegral Int) instance ToInteger Int
deriving via (AsIntegral Int8) instance ToInteger Int8
deriving via (AsIntegral Int16) instance ToInteger Int16
deriving via (AsIntegral Int32) instance ToInteger Int32
deriving via (AsIntegral Int64) instance ToInteger Int64
instance ToInteger Integer where
toZ :: HasCallStack => Integer -> Integer
toZ = Integer -> Integer
forall a. a -> a
id
{-# INLINE toZ #-}
deriving via (AsIntegral Word) instance ToInteger Word
deriving via (AsIntegral Word8) instance ToInteger Word8
deriving via (AsIntegral Word16) instance ToInteger Word16
deriving via (AsIntegral Word32) instance ToInteger Word32
deriving via (AsIntegral Word64) instance ToInteger Word64
deriving via (AsIntegral Natural) instance ToInteger Natural
type FromRational :: Type -> Constraint
class (FromInteger a) => FromRational a where
fromQ :: (HasCallStack) => Rational -> a
instance (Fractional a) => FromRational (AsFractional a) where
fromQ :: HasCallStack => Ratio Integer -> AsFractional a
fromQ = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(Rational -> a) @(Rational -> AsFractional a) Ratio Integer -> a
forall a. Fractional a => Ratio Integer -> a
fromRational
{-# INLINE fromQ #-}
deriving via (AsFractional Float) instance FromRational Float
deriving via (AsFractional Double) instance FromRational Double
instance FromRational (Ratio Integer) where
fromQ :: HasCallStack => Ratio Integer -> Ratio Integer
fromQ = Ratio Integer -> Ratio Integer
forall a. a -> a
id
{-# INLINE fromQ #-}
deriving via (AsFractional (Ratio Natural)) instance FromRational (Ratio Natural)
deriving via (AsFractional (Complex a)) instance (RealFloat a) => FromRational (Complex a)
deriving via (AsFractional (Fixed k)) instance (HasResolution k) => FromRational (Fixed k)
type ToRational :: Type -> Constraint
class (ToReal a) => ToRational a where
toQ :: (HasCallStack) => a -> Rational
instance (Real a) => ToRational (AsReal a) where
toQ :: HasCallStack => AsReal a -> Ratio Integer
toQ = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(a -> Rational) @(AsReal a -> Rational) a -> Ratio Integer
forall a. Real a => a -> Ratio Integer
toRational
{-# INLINE toQ #-}
instance (Integral a) => ToRational (AsIntegral a) where
toQ :: HasCallStack => AsIntegral a -> Ratio Integer
toQ = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(a -> Rational) @(AsIntegral a -> Rational) a -> Ratio Integer
forall a. Real a => a -> Ratio Integer
toRational
{-# INLINE toQ #-}
deriving via (AsReal Float) instance ToRational Float
deriving via (AsReal Double) instance ToRational Double
deriving via (AsReal Int) instance ToRational Int
deriving via (AsReal Int8) instance ToRational Int8
deriving via (AsReal Int16) instance ToRational Int16
deriving via (AsReal Int32) instance ToRational Int32
deriving via (AsReal Int64) instance ToRational Int64
deriving via (AsReal Integer) instance ToRational Integer
deriving via (AsReal Word) instance ToRational Word
deriving via (AsReal Word8) instance ToRational Word8
deriving via (AsReal Word16) instance ToRational Word16
deriving via (AsReal Word32) instance ToRational Word32
deriving via (AsReal Word64) instance ToRational Word64
deriving via (AsReal Natural) instance ToRational Natural
instance ToRational (Ratio Integer) where
toQ :: HasCallStack => Ratio Integer -> Ratio Integer
toQ = Ratio Integer -> Ratio Integer
forall a. a -> a
id
{-# INLINE toQ #-}
deriving via (AsReal (Ratio Natural)) instance ToRational (Ratio Natural)
deriving via (AsReal (Fixed k)) instance (HasResolution k) => ToRational (Fixed k)
type FromReal :: Type -> Constraint
class (FromRational a) => FromReal a where
fromR :: (HasCallStack) => Double -> a
instance (Fractional a) => FromReal (AsFractional a) where
fromR :: HasCallStack => Double -> AsFractional a
fromR = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(Double -> a) @(Double -> AsFractional a) Double -> a
forall a b. (Real a, Fractional b) => a -> b
realToFrac
{-# INLINE fromR #-}
deriving via (AsFractional Float) instance FromReal Float
instance FromReal Double where
fromR :: HasCallStack => Double -> Double
fromR = Double -> Double
forall a. a -> a
id
{-# INLINE fromR #-}
deriving via (AsFractional (Ratio Integer)) instance FromReal (Ratio Integer)
deriving via (AsFractional (Ratio Natural)) instance FromReal (Ratio Natural)
deriving via (AsFractional (Complex a)) instance (RealFloat a) => FromReal (Complex a)
deriving via (AsFractional (Fixed k)) instance (HasResolution k) => FromReal (Fixed k)
type ToReal :: Type -> Constraint
class ToReal a where
toR :: (HasCallStack) => a -> Double
instance (Integral a) => ToReal (AsIntegral a) where
toR :: HasCallStack => AsIntegral a -> Double
toR = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(a -> Double) @(AsIntegral a -> Double) a -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac
{-# INLINE toR #-}
instance (Real a) => ToReal (AsReal a) where
toR :: HasCallStack => AsReal a -> Double
toR = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(a -> Double) @(AsReal a -> Double) a -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac
{-# INLINE toR #-}
deriving via (AsReal Float) instance ToReal Float
instance ToReal Double where
toR :: HasCallStack => Double -> Double
toR = Double -> Double
forall a. a -> a
id
{-# INLINE toR #-}
deriving via (AsReal Int) instance ToReal Int
deriving via (AsReal Int8) instance ToReal Int8
deriving via (AsReal Int16) instance ToReal Int16
deriving via (AsReal Int32) instance ToReal Int32
deriving via (AsReal Int64) instance ToReal Int64
deriving via (AsReal Integer) instance ToReal Integer
deriving via (AsReal Word) instance ToReal Word
deriving via (AsReal Word8) instance ToReal Word8
deriving via (AsReal Word16) instance ToReal Word16
deriving via (AsReal Word32) instance ToReal Word32
deriving via (AsReal Word64) instance ToReal Word64
deriving via (AsReal Natural) instance ToReal Natural
deriving via (AsReal (Ratio Integer)) instance ToReal (Ratio Integer)
deriving via (AsReal (Ratio Natural)) instance ToReal (Ratio Natural)
deriving via (AsReal (Fixed k)) instance (HasResolution k) => ToReal (Fixed k)