module Unwitch.Convert.Word64
(
toWord8
, toWord16
, toWord32
, toWord
, toNatural
, toInt8
, toInt16
, toInt32
, toInt64
, toInt
, toInteger
, toFloat
, toDouble
#ifdef __GLASGOW_HASKELL__
, toCInt
#endif
#ifdef __GLASGOW_HASKELL__
, toWord8#
, toWord16#
, toWord32#
, toWord#
, toInt8#
, toInt16#
, toInt32#
, toInt64#
, toInt#
, toFloat#
, toDouble#
#endif
)
where
import Unwitch.Errors
import Unwitch.Constant
import qualified Data.Bits as Bits
import Data.Word
import Data.Int
import Numeric.Natural (Natural)
import Prelude hiding (toInteger)
#ifdef __GLASGOW_HASKELL__
import Foreign.C.Types (CInt(CInt))
import GHC.Exts (Int(..), Word(..), Float(..), Double(..),
word64ToWord#, wordToWord64#,
word2Int#,
wordToWord8#, word8ToWord#,
wordToWord16#, word16ToWord#,
wordToWord32#, word32ToWord#,
intToInt8#, intToInt16#, intToInt32#,
intToInt64#,
int2Float#, int2Double#,
eqWord64#, leWord64#,
(>=#))
import GHC.Int (Int8(..), Int16(..), Int32(..), Int64(..))
import GHC.Word (Word8(..), Word16(..), Word32(..), Word64(..))
#endif
#ifdef __GLASGOW_HASKELL__
#endif
toWord8 :: Word64 -> Maybe Word8
toWord8 :: Word64 -> Maybe Word8
toWord8 = Word64 -> Maybe Word8
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toWord16 :: Word64 -> Maybe Word16
toWord16 :: Word64 -> Maybe Word16
toWord16 = Word64 -> Maybe Word16
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toWord32 :: Word64 -> Maybe Word32
toWord32 :: Word64 -> Maybe Word32
toWord32 = Word64 -> Maybe Word32
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toWord :: Word64 -> Maybe Word
toWord :: Word64 -> Maybe Word
toWord = Word64 -> Maybe Word
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toNatural :: Word64 -> Natural
toNatural :: Word64 -> Natural
toNatural = Word64 -> Natural
forall a b. (Integral a, Num b) => a -> b
fromIntegral
toInt8 :: Word64 -> Maybe Int8
toInt8 :: Word64 -> Maybe Int8
toInt8 = Word64 -> Maybe Int8
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toInt16 :: Word64 -> Maybe Int16
toInt16 :: Word64 -> Maybe Int16
toInt16 = Word64 -> Maybe Int16
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toInt32 :: Word64 -> Maybe Int32
toInt32 :: Word64 -> Maybe Int32
toInt32 = Word64 -> Maybe Int32
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toInt64 :: Word64 -> Maybe Int64
toInt64 :: Word64 -> Maybe Int64
toInt64 = Word64 -> Maybe Int64
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toInt :: Word64 -> Maybe Int
toInt :: Word64 -> Maybe Int
toInt = Word64 -> Maybe Int
forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
Bits.toIntegralSized
toInteger :: Word64 -> Integer
toInteger :: Word64 -> Integer
toInteger = Word64 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral
#ifdef __GLASGOW_HASKELL__
toCInt :: Word64 -> Maybe CInt
toCInt :: Word64 -> Maybe CInt
toCInt Word64
x = Int32 -> CInt
CInt (Int32 -> CInt) -> Maybe Int32 -> Maybe CInt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Word64 -> Maybe Int32
toInt32 Word64
x
#endif
toFloat :: Word64 -> Either Overflows Float
toFloat :: Word64 -> Either Overflows Float
toFloat Word64
x = if
| Word64
x Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
> Word64
forall a. Num a => a
maxIntegralRepFloat -> Overflows -> Either Overflows Float
forall a b. a -> Either a b
Left Overflows
Overflow
| Bool
otherwise -> Float -> Either Overflows Float
forall a b. b -> Either a b
Right (Float -> Either Overflows Float)
-> Float -> Either Overflows Float
forall a b. (a -> b) -> a -> b
$ Word64 -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
x
toDouble :: Word64 -> Either Overflows Double
toDouble :: Word64 -> Either Overflows Double
toDouble Word64
x = if
| Word64
x Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
> Word64
forall a. Num a => a
maxIntegralRepDouble -> Overflows -> Either Overflows Double
forall a b. a -> Either a b
Left Overflows
Overflow
| Bool
otherwise -> Double -> Either Overflows Double
forall a b. b -> Either a b
Right (Double -> Either Overflows Double)
-> Double -> Either Overflows Double
forall a b. (a -> b) -> a -> b
$ Word64 -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
x
#ifdef __GLASGOW_HASKELL__
toWord8# :: Word64 -> (# Word8 | (# #) #)
toWord8# :: Word64 -> (# Word8 | (# #) #)
toWord8# (W64# Word64#
w64#) =
let w# :: Word#
w# = Word64# -> Word#
word64ToWord# Word64#
w64#
n# :: Word8#
n# = Word# -> Word8#
wordToWord8# Word#
w#
in case Word64# -> Word64# -> Int#
eqWord64# (Word# -> Word64#
wordToWord64# (Word8# -> Word#
word8ToWord# Word8#
n#)) Word64#
w64# of
Int#
1# -> (# Word8# -> Word8
W8# Word8#
n# | #)
Int#
_ -> (# | (# #) #)
toWord16# :: Word64 -> (# Word16 | (# #) #)
toWord16# :: Word64 -> (# Word16 | (# #) #)
toWord16# (W64# Word64#
w64#) =
let w# :: Word#
w# = Word64# -> Word#
word64ToWord# Word64#
w64#
n# :: Word16#
n# = Word# -> Word16#
wordToWord16# Word#
w#
in case Word64# -> Word64# -> Int#
eqWord64# (Word# -> Word64#
wordToWord64# (Word16# -> Word#
word16ToWord# Word16#
n#)) Word64#
w64# of
Int#
1# -> (# Word16# -> Word16
W16# Word16#
n# | #)
Int#
_ -> (# | (# #) #)
toWord32# :: Word64 -> (# Word32 | (# #) #)
toWord32# :: Word64 -> (# Word32 | (# #) #)
toWord32# (W64# Word64#
w64#) =
let w# :: Word#
w# = Word64# -> Word#
word64ToWord# Word64#
w64#
n# :: Word32#
n# = Word# -> Word32#
wordToWord32# Word#
w#
in case Word64# -> Word64# -> Int#
eqWord64# (Word# -> Word64#
wordToWord64# (Word32# -> Word#
word32ToWord# Word32#
n#)) Word64#
w64# of
Int#
1# -> (# Word32# -> Word32
W32# Word32#
n# | #)
Int#
_ -> (# | (# #) #)
toWord# :: Word64 -> (# Word | (# #) #)
toWord# :: Word64 -> (# Word | (# #) #)
toWord# (W64# Word64#
w64#) =
let w# :: Word#
w# = Word64# -> Word#
word64ToWord# Word64#
w64#
in case Word64# -> Word64# -> Int#
eqWord64# (Word# -> Word64#
wordToWord64# Word#
w#) Word64#
w64# of
Int#
1# -> (# Word# -> Word
W# Word#
w# | #)
Int#
_ -> (# | (# #) #)
toInt8# :: Word64 -> (# Int8 | (# #) #)
toInt8# :: Word64 -> (# Int8 | (# #) #)
toInt8# (W64# Word64#
w64#) = case Word64# -> Word64# -> Int#
leWord64# Word64#
w64# (Word# -> Word64#
wordToWord64# Word#
127##) of
Int#
1# -> (# Int8# -> Int8
I8# (Int# -> Int8#
intToInt8# (Word# -> Int#
word2Int# (Word64# -> Word#
word64ToWord# Word64#
w64#))) | #)
Int#
_ -> (# | (# #) #)
toInt16# :: Word64 -> (# Int16 | (# #) #)
toInt16# :: Word64 -> (# Int16 | (# #) #)
toInt16# (W64# Word64#
w64#) = case Word64# -> Word64# -> Int#
leWord64# Word64#
w64# (Word# -> Word64#
wordToWord64# Word#
32767##) of
Int#
1# -> (# Int16# -> Int16
I16# (Int# -> Int16#
intToInt16# (Word# -> Int#
word2Int# (Word64# -> Word#
word64ToWord# Word64#
w64#))) | #)
Int#
_ -> (# | (# #) #)
toInt32# :: Word64 -> (# Int32 | (# #) #)
toInt32# :: Word64 -> (# Int32 | (# #) #)
toInt32# (W64# Word64#
w64#) = case Word64# -> Word64# -> Int#
leWord64# Word64#
w64# (Word# -> Word64#
wordToWord64# Word#
2147483647##) of
Int#
1# -> (# Int32# -> Int32
I32# (Int# -> Int32#
intToInt32# (Word# -> Int#
word2Int# (Word64# -> Word#
word64ToWord# Word64#
w64#))) | #)
Int#
_ -> (# | (# #) #)
toInt64# :: Word64 -> (# Int64 | (# #) #)
toInt64# :: Word64 -> (# Int64 | (# #) #)
toInt64# (W64# Word64#
w64#) =
let w# :: Word#
w# = Word64# -> Word#
word64ToWord# Word64#
w64#
i# :: Int#
i# = Word# -> Int#
word2Int# Word#
w#
in case Int#
i# Int# -> Int# -> Int#
>=# Int#
0# of
Int#
1# -> case Word64# -> Word64# -> Int#
eqWord64# (Word# -> Word64#
wordToWord64# Word#
w#) Word64#
w64# of
Int#
1# -> (# Int64# -> Int64
I64# (Int# -> Int64#
intToInt64# Int#
i#) | #)
Int#
_ -> (# | (# #) #)
Int#
_ -> (# | (# #) #)
toInt# :: Word64 -> (# Int | (# #) #)
toInt# :: Word64 -> (# Int | (# #) #)
toInt# (W64# Word64#
w64#) =
let w# :: Word#
w# = Word64# -> Word#
word64ToWord# Word64#
w64#
i# :: Int#
i# = Word# -> Int#
word2Int# Word#
w#
in case Int#
i# Int# -> Int# -> Int#
>=# Int#
0# of
Int#
1# -> case Word64# -> Word64# -> Int#
eqWord64# (Word# -> Word64#
wordToWord64# Word#
w#) Word64#
w64# of
Int#
1# -> (# Int# -> Int
I# Int#
i# | #)
Int#
_ -> (# | (# #) #)
Int#
_ -> (# | (# #) #)
toFloat# :: Word64 -> (# Overflows | Float #)
toFloat# :: Word64 -> (# Overflows | Float #)
toFloat# (W64# Word64#
w64#) = case Word64# -> Word64# -> Int#
leWord64# Word64#
w64# (Word# -> Word64#
wordToWord64# Word#
16777215##) of
Int#
1# -> (# | Float# -> Float
F# (Int# -> Float#
int2Float# (Word# -> Int#
word2Int# (Word64# -> Word#
word64ToWord# Word64#
w64#))) #)
Int#
_ -> (# Overflows
Overflow | #)
toDouble# :: Word64 -> (# Overflows | Double #)
toDouble# :: Word64 -> (# Overflows | Double #)
toDouble# (W64# Word64#
w64#) = case Word64# -> Word64# -> Int#
leWord64# Word64#
w64# (Word# -> Word64#
wordToWord64# Word#
9007199254740991##) of
Int#
1# -> (# | Double# -> Double
D# (Int# -> Double#
int2Double# (Word# -> Int#
word2Int# (Word64# -> Word#
word64ToWord# Word64#
w64#))) #)
Int#
_ -> (# Overflows
Overflow | #)
#endif