{-# Language Safe #-}
module Data.Connection.Word (
c08bin
, binc08
, w08c08
, w08i08
, w08w16
, w08w32
, w08w64
, w08wxx
, w08nat
, w16c16
, w16i16
, w16w32
, w16w64
, w16wxx
, w16nat
, w32c32
, w32i32
, w32w64
, w32wxx
, w32nat
, w64c64
, w64i64
, w64nat
, wxxw64
, wxxnat
) where
import safe Data.Connection.Conn
import safe Data.Int
import safe Data.Order
import safe Data.Order.Syntax
import safe Data.Word
import safe Foreign.C.Types
import safe Numeric.Natural
import safe Prelude hiding (Ord(..), Eq(..))
c08bin :: ConnL CBool Bool
c08bin = ConnL f g where
f (CBool i) | i == 255 = True
| otherwise = False
g True = CBool 255
g _ = CBool 254
binc08 :: ConnL Bool CBool
binc08 = ConnL f g where
f False = CBool 0
f _ = CBool 1
g (CBool i) | i == 0 = False
| otherwise = True
w08c08 :: ConnL Word8 CUChar
w08c08 = ConnL CUChar $ \(CUChar x) -> x
w08i08 :: ConnL Word8 Int8
w08i08 = signed
w08nat :: ConnL Word8 Natural
w08nat = unsigned
w08w16 :: ConnL Word8 Word16
w08w16 = unsigned
w08w32 :: ConnL Word8 Word32
w08w32 = unsigned
w08w64 :: ConnL Word8 Word64
w08w64 = unsigned
w08wxx :: ConnL Word8 Word
w08wxx = unsigned
w16c16 :: ConnL Word16 CUShort
w16c16 = ConnL CUShort $ \(CUShort x) -> x
w16i16 :: ConnL Word16 Int16
w16i16 = signed
w16w32 :: ConnL Word16 Word32
w16w32 = unsigned
w16w64 :: ConnL Word16 Word64
w16w64 = unsigned
w16wxx :: ConnL Word16 Word
w16wxx = unsigned
w16nat :: ConnL Word16 Natural
w16nat = unsigned
w32c32 :: ConnL Word32 CUInt
w32c32 = ConnL CUInt $ \(CUInt x) -> x
w32i32 :: ConnL Word32 Int32
w32i32 = signed
w32w64 :: ConnL Word32 Word64
w32w64 = unsigned
w32wxx :: ConnL Word32 Word
w32wxx = unsigned
w32nat :: ConnL Word32 Natural
w32nat = unsigned
w64c64 :: ConnL Word64 CULong
w64c64 = ConnL CULong $ \(CULong x) -> x
w64i64 :: ConnL Word64 Int64
w64i64 = signed
w64nat :: ConnL Word64 Natural
w64nat = unsigned
wxxw64 :: Conn k Word Word64
wxxw64 = Conn fromIntegral fromIntegral fromIntegral
wxxnat :: ConnL Word Natural
wxxnat = ConnL fromIntegral (fromIntegral . min 18446744073709551615)
signed :: (Bounded b, Integral a, Integral b) => ConnL a b
signed = ConnL (\x -> fromIntegral x - minBound)
(\y -> fromIntegral (y + maxBound + 1))
unsigned :: (Bounded a, Preorder b, Integral a, Integral b) => ConnL a b
unsigned = ConnL f g where
f = fromIntegral
g = fromIntegral . min (f maxBound)