{-# LANGUAGE Safe #-}
{-# LANGUAGE DataKinds #-}
module Data.Connection.Word (
bndbin,
i08w08,
w08w16,
i08w16,
i16w16,
w08w32,
w16w32,
i08w32,
i16w32,
i32w32,
w08w64,
w16w64,
w32w64,
wxxw64,
i08w64,
i16w64,
i32w64,
i64w64,
ixxw64,
w08wxx,
w16wxx,
w32wxx,
w64wxx,
i08wxx,
i16wxx,
i32wxx,
i64wxx,
ixxwxx,
w08nat,
w16nat,
w32nat,
w64nat,
wxxnat,
i08nat,
i16nat,
i32nat,
i64nat,
ixxnat,
intnat,
) where
import safe Data.Connection.Cast
import safe Data.Int
import safe Data.Word
import safe Numeric.Natural
{-# INLINEABLE bndbin #-}
bndbin :: (Eq a, Bounded a) => Cast k a Bool
bndbin = Cast f g h
where
f i
| i == minBound = False
| otherwise = True
g x = if x then maxBound else minBound
h i
| i == maxBound = True
| otherwise = False
i08w08 :: Cast 'L Int8 Word8
i08w08 = conn
w08w16 :: Cast 'L Word8 Word16
w08w16 = conn
i08w16 :: Cast 'L Int8 Word16
i08w16 = conn
i16w16 :: Cast 'L Int16 Word16
i16w16 = conn
w08w32 :: Cast 'L Word8 Word32
w08w32 = conn
w16w32 :: Cast 'L Word16 Word32
w16w32 = conn
i08w32 :: Cast 'L Int8 Word32
i08w32 = conn
i16w32 :: Cast 'L Int16 Word32
i16w32 = conn
i32w32 :: Cast 'L Int32 Word32
i32w32 = conn
w08w64 :: Cast 'L Word8 Word64
w08w64 = conn
w16w64 :: Cast 'L Word16 Word64
w16w64 = conn
w32w64 :: Cast 'L Word32 Word64
w32w64 = conn
wxxw64 :: Cast k Word Word64
wxxw64 = Cast fromIntegral fromIntegral fromIntegral
i08w64 :: Cast 'L Int8 Word64
i08w64 = conn
i16w64 :: Cast 'L Int16 Word64
i16w64 = conn
i32w64 :: Cast 'L Int32 Word64
i32w64 = conn
i64w64 :: Cast 'L Int64 Word64
i64w64 = conn
ixxw64 :: Cast 'L Int Word64
ixxw64 = conn
w08wxx :: Cast 'L Word8 Word
w08wxx = conn
w16wxx :: Cast 'L Word16 Word
w16wxx = conn
w32wxx :: Cast 'L Word32 Word
w32wxx = conn
w64wxx :: Cast k Word64 Word
w64wxx = Cast fromIntegral fromIntegral fromIntegral
i08wxx :: Cast 'L Int8 Word
i08wxx = conn
i16wxx :: Cast 'L Int16 Word
i16wxx = conn
i32wxx :: Cast 'L Int32 Word
i32wxx = conn
i64wxx :: Cast 'L Int64 Word
i64wxx = conn
ixxwxx :: Cast 'L Int Word
ixxwxx = conn
w08nat :: Cast 'L Word8 Natural
w08nat = conn
w16nat :: Cast 'L Word16 Natural
w16nat = conn
w32nat :: Cast 'L Word32 Natural
w32nat = conn
w64nat :: Cast 'L Word64 Natural
w64nat = conn
wxxnat :: Cast 'L Word Natural
wxxnat = conn
i08nat :: Cast 'L Int8 Natural
i08nat = conn
i16nat :: Cast 'L Int16 Natural
i16nat = conn
i32nat :: Cast 'L Int32 Natural
i32nat = conn
i64nat :: Cast 'L Int64 Natural
i64nat = conn
ixxnat :: Cast 'L Int Natural
ixxnat = conn
intnat :: Cast 'L Integer Natural
intnat = CastL (fromIntegral . max 0) fromIntegral
{-# INLINE conn #-}
conn :: (Bounded a, Integral a, Integral b) => Cast 'L a b
conn = CastL f g
where
f = fromIntegral . max 0
g = fromIntegral . min (f maxBound)