{-# LANGUAGE UndecidableInstances #-}
module Binrep.Util.Prefix where
import Binrep.Util.ByteOrder ( ByteOrdered(ByteOrdered) )
import GHC.TypeNats
import Data.Word
import Data.Kind
class Prefix a where
type Max a :: Natural
lenToPfx :: Int -> a
pfxToLen :: a -> Int
instance Prefix () where
type Max () = 0
lenToPfx :: Int -> ()
lenToPfx = \case
Int
0 -> ()
Int
_ -> [Char] -> ()
forall a. HasCallStack => [Char] -> a
error [Char]
"you lied to refine and broke everything :("
pfxToLen :: () -> Int
pfxToLen () = Int
0
deriving via (a :: Type) instance Prefix a => Prefix (ByteOrdered end a)
instance Prefix Word8 where
type Max Word8 = 2^8 - 1
lenToPfx :: Int -> Word8
lenToPfx = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral
pfxToLen :: Word8 -> Int
pfxToLen = Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral
instance Prefix Word16 where
type Max Word16 = 2^16 - 1
lenToPfx :: Int -> Word16
lenToPfx = Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral
pfxToLen :: Word16 -> Int
pfxToLen = Word16 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral
instance Prefix Word32 where
type Max Word32 = 2^32 - 1
lenToPfx :: Int -> Word32
lenToPfx = Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral
pfxToLen :: Word32 -> Int
pfxToLen = Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral
instance Prefix Word64 where
type Max Word64 = 2^64 - 1
lenToPfx :: Int -> Word64
lenToPfx = Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral
pfxToLen :: Word64 -> Int
pfxToLen = Word64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral