{-# LANGUAGE AllowAmbiguousTypes #-}
module Binrep.BLen
( module Binrep.BLen
, module Binrep.BLen.Internal.AsBLen
) where
import Binrep.BLen.Internal.AsBLen
import Binrep.CBLen
import Binrep.Util ( natVal'' )
import GHC.TypeNats
import Data.ByteString qualified as B
import Data.Word
import Data.Int
type BLenT = Int
class BLen a where
blen :: a -> BLenT
default blen :: KnownNat (CBLen a) => a -> BLenT
blen a
_ = forall a (n :: Natural). (n ~ CBLen a, KnownNat n) => BLenT
cblen @a
typeNatToBLen :: forall n. KnownNat n => BLenT
typeNatToBLen :: forall (n :: Natural). KnownNat n => BLenT
typeNatToBLen = Natural -> BLenT
forall a. AsBLen a => Natural -> a
natToBLen (Natural -> BLenT) -> Natural -> BLenT
forall a b. (a -> b) -> a -> b
$ forall (a :: Natural). KnownNat a => Natural
natVal'' @n
{-# INLINE typeNatToBLen #-}
cblen :: forall a n. (n ~ CBLen a, KnownNat n) => BLenT
cblen :: forall a (n :: Natural). (n ~ CBLen a, KnownNat n) => BLenT
cblen = forall (n :: Natural). KnownNat n => BLenT
typeNatToBLen @n
{-# INLINE cblen #-}
instance BLen a => BLen [a] where
blen :: [a] -> BLenT
blen = [BLenT] -> BLenT
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([BLenT] -> BLenT) -> ([a] -> [BLenT]) -> [a] -> BLenT
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> BLenT) -> [a] -> [BLenT]
forall a b. (a -> b) -> [a] -> [b]
map a -> BLenT
forall a. BLen a => a -> BLenT
blen
instance (BLen a, BLen b) => BLen (a, b) where
blen :: (a, b) -> BLenT
blen (a
a, b
b) = a -> BLenT
forall a. BLen a => a -> BLenT
blen a
a BLenT -> BLenT -> BLenT
forall a. Num a => a -> a -> a
+ b -> BLenT
forall a. BLen a => a -> BLenT
blen b
b
instance BLen B.ByteString where
blen :: ByteString -> BLenT
blen = BLenT -> BLenT
forall a. AsBLen a => BLenT -> a
posIntToBLen (BLenT -> BLenT) -> (ByteString -> BLenT) -> ByteString -> BLenT
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> BLenT
B.length
deriving anyclass instance BLen Word8
deriving anyclass instance BLen Int8
deriving anyclass instance BLen Word16
deriving anyclass instance BLen Int16
deriving anyclass instance BLen Word32
deriving anyclass instance BLen Int32
deriving anyclass instance BLen Word64
deriving anyclass instance BLen Int64