{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Data.Connection.Int (
w08i16,
i08i16,
w08i32,
w16i32,
i08i32,
i16i32,
w08i64,
w16i64,
w32i64,
i08i64,
i16i64,
i32i64,
w08ixx,
w16ixx,
w32ixx,
i08ixx,
i16ixx,
i32ixx,
i64ixx,
w08int,
w16int,
w32int,
w64int,
wxxint,
natint,
i08int,
i16int,
i32int,
i64int,
ixxint,
) where
import safe Control.Applicative
import safe Control.Monad
import safe Data.Connection.Conn
import safe Data.Int
import safe Data.Word
import safe Numeric.Natural
import safe Prelude
w08i16 :: Conn 'L Word8 (Maybe Int16)
w08i16 = signed
i08i16 :: Conn 'L Int8 (Maybe Int16)
i08i16 = signed
w08i32 :: Conn 'L Word8 (Maybe Int32)
w08i32 = signed
w16i32 :: Conn 'L Word16 (Maybe Int32)
w16i32 = signed
i08i32 :: Conn 'L Int8 (Maybe Int32)
i08i32 = signed
i16i32 :: Conn 'L Int16 (Maybe Int32)
i16i32 = signed
w08i64 :: Conn 'L Word8 (Maybe Int64)
w08i64 = signed
w16i64 :: Conn 'L Word16 (Maybe Int64)
w16i64 = signed
w32i64 :: Conn 'L Word32 (Maybe Int64)
w32i64 = signed
i08i64 :: Conn 'L Int8 (Maybe Int64)
i08i64 = signed
i16i64 :: Conn 'L Int16 (Maybe Int64)
i16i64 = signed
i32i64 :: Conn 'L Int32 (Maybe Int64)
i32i64 = signed
w08ixx :: Conn 'L Word8 (Maybe Int)
w08ixx = signed
w16ixx :: Conn 'L Word16 (Maybe Int)
w16ixx = signed
w32ixx :: Conn 'L Word32 (Maybe Int)
w32ixx = signed
i08ixx :: Conn 'L Int8 (Maybe Int)
i08ixx = signed
i16ixx :: Conn 'L Int16 (Maybe Int)
i16ixx = signed
i32ixx :: Conn 'L Int32 (Maybe Int)
i32ixx = signed
i64ixx :: Conn k Int64 Int
i64ixx = Conn fromIntegral fromIntegral fromIntegral
w08int :: Conn 'L Word8 (Maybe Integer)
w08int = signed
w16int :: Conn 'L Word16 (Maybe Integer)
w16int = signed
w32int :: Conn 'L Word32 (Maybe Integer)
w32int = signed
w64int :: Conn 'L Word64 (Maybe Integer)
w64int = signed
wxxint :: Conn 'L Word (Maybe Integer)
wxxint = signed
natint :: Conn 'L Natural (Maybe Integer)
natint = ConnL (fmap fromIntegral . fromPred (/= 0)) (maybe 0 $ fromInteger . max 0)
i08int :: Conn 'L Int8 (Maybe Integer)
i08int = signed
i16int :: Conn 'L Int16 (Maybe Integer)
i16int = signed
i32int :: Conn 'L Int32 (Maybe Integer)
i32int = signed
i64int :: Conn 'L Int64 (Maybe Integer)
i64int = signed
ixxint :: Conn 'L Int (Maybe Integer)
ixxint = signed
fromPred :: (a -> Bool) -> a -> Maybe a
fromPred p a = a <$ guard (p a)
signed :: forall a b. (Bounded a, Integral a, Integral b) => Conn 'L a (Maybe b)
signed = ConnL f g
where
f = fmap fromIntegral . fromPred (/= minBound)
g = maybe minBound $ fromIntegral @b . min (fromIntegral @a maxBound) . max (fromIntegral @a minBound)