{-# LANGUAGE CPP
           , MultiParamTypeClasses
           , FlexibleInstances
           #-}
#if __GLASGOW_HASKELL__ < 710
{-# LANGUAGE OverlappingInstances #-}
#endif
           
{-# OPTIONS_GHC -XMagicHash #-}
{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
module Data.Number.RealToFrac (RealToFrac(..)) where
import Prelude hiding    (realToFrac, isInfinite, isNaN)
import qualified Prelude (realToFrac)
import Data.Number.Transfinite
#ifdef __GLASGOW_HASKELL__
import GHC.Exts
    ( Int(..), Float(..), Double(..)
    , int2Double#
    , int2Float#
    , double2Float#
    , float2Double#
    )
#endif
class (Real a, Fractional b) => RealToFrac a b where
    realToFrac :: a -> b
instance (Real a, Fractional a) => RealToFrac a a where
    realToFrac :: a -> a
realToFrac = a -> a
forall a. a -> a
id
instance
#if __GLASGOW_HASKELL__ >= 710
    {-# OVERLAPPABLE #-}
#endif
    (Real a, Transfinite a, Fractional b, Transfinite b)
    => RealToFrac a b
    where
    realToFrac :: a -> b
realToFrac a
x
        | a -> Bool
forall a. Transfinite a => a -> Bool
isNaN      a
x = b
forall a. Transfinite a => a
notANumber
        | a -> Bool
forall a. Transfinite a => a -> Bool
isInfinite a
x = if a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0 then b
forall a. Transfinite a => a
infinity
                                  else b
forall a. Transfinite a => a
negativeInfinity
        | Bool
otherwise    = a -> b
forall a b. (Real a, Fractional b) => a -> b
Prelude.realToFrac a
x
#ifdef __GLASGOW_HASKELL__
instance
#if __GLASGOW_HASKELL__ >= 710
    {-# OVERLAPPING #-}
#endif
    RealToFrac Int Float where
    {-# INLINE realToFrac #-}
    realToFrac :: Int -> Float
realToFrac (I# Int#
i) = Float# -> Float
F# (Int# -> Float#
int2Float# Int#
i)
instance
#if __GLASGOW_HASKELL__ >= 710
    {-# OVERLAPPING #-}
#endif
    RealToFrac Int Double where
    {-# INLINE realToFrac #-}
    realToFrac :: Int -> Double
realToFrac (I# Int#
i) = Double# -> Double
D# (Int# -> Double#
int2Double# Int#
i)
instance
#if __GLASGOW_HASKELL__ >= 710
    {-# OVERLAPPING #-}
#endif
    RealToFrac Integer Float where
    
    {-# INLINE realToFrac #-}
    realToFrac :: Integer -> Float
realToFrac Integer
j = Integer -> Float
forall a b. (Real a, Fractional b) => a -> b
Prelude.realToFrac Integer
j
instance
#if __GLASGOW_HASKELL__ >= 710
    {-# OVERLAPPING #-}
#endif
    RealToFrac Integer Double where
    
    {-# INLINE realToFrac #-}
    realToFrac :: Integer -> Double
realToFrac Integer
j = Integer -> Double
forall a b. (Real a, Fractional b) => a -> b
Prelude.realToFrac Integer
j
instance
#if __GLASGOW_HASKELL__ >= 710
    {-# OVERLAPPING #-}
#endif
    RealToFrac Float Double where
    {-# INLINE realToFrac #-}
    realToFrac :: Float -> Double
realToFrac (F# Float#
f) = Double# -> Double
D# (Float# -> Double#
float2Double# Float#
f)
    
instance
#if __GLASGOW_HASKELL__ >= 710
    {-# OVERLAPPING #-}
#endif
    RealToFrac Double Float where
    {-# INLINE realToFrac #-}
    realToFrac :: Double -> Float
realToFrac (D# Double#
d) = Float# -> Float
F# (Double# -> Float#
double2Float# Double#
d)
#endif