binrep-0.2.0: Encode precise binary representations directly in types
Safe HaskellSafe-Inferred
LanguageHaskell2010

Binrep.BLen

Synopsis

Documentation

class BLen a where Source #

The length in bytes of a value of the given type can be known on the cheap e.g. by reading a length field, or using compile time information.

Concepts such as null padding require the notion of length in bytes in order to handle. In a hand-rolled parser, you may keep count of the current length as you go. Here, the individual types keep track, and expose it via this typeclass.

Obtaining the length of a value is usually an O(1) operation like reading a field or returning a constant. When it's not, it's often an indicator of a problematic type e.g. plain Haskell lists.

We derive a default instance for constant-size types by throwing away the value and reifying the type level natural.

Note that one can derive a free BLen instance for any type with a Put instance via serializing it and checking the length. _Do not do this._ If you find you can't write a decent BLen instance for a type, it may be that you need to rethink the representation.

Minimal complete definition

Nothing

Methods

blen :: a -> BLenT Source #

default blen :: KnownNat (CBLen a) => a -> BLenT Source #

Instances

Instances details
BLen Int16 Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: Int16 -> BLenT Source #

BLen Int32 Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: Int32 -> BLenT Source #

BLen Int64 Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: Int64 -> BLenT Source #

BLen Int8 Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: Int8 -> BLenT Source #

BLen Word16 Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: Word16 -> BLenT Source #

BLen Word32 Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: Word32 -> BLenT Source #

BLen Word64 Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: Word64 -> BLenT Source #

BLen Word8 Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: Word8 -> BLenT Source #

BLen DCS Source # 
Instance details

Defined in Binrep.Example

Methods

blen :: DCS -> BLenT Source #

BLen DSS Source # 
Instance details

Defined in Binrep.Example

Methods

blen :: DSS -> BLenT Source #

BLen DU Source # 
Instance details

Defined in Binrep.Example

Methods

blen :: DU -> BLenT Source #

BLen DX Source # 
Instance details

Defined in Binrep.Example

Methods

blen :: DX -> BLenT Source #

BLen Tar Source # 
Instance details

Defined in Binrep.Example.Tar

Methods

blen :: Tar -> BLenT Source #

BLen Tiff Source # 
Instance details

Defined in Binrep.Example.Tiff

Methods

blen :: Tiff -> BLenT Source #

BLen WavHeader Source # 
Instance details

Defined in Binrep.Example.Wav

Methods

blen :: WavHeader -> BLenT Source #

BLen ByteString Source # 
Instance details

Defined in Binrep.BLen

(bs ~ MagicVals (TiffMagic end), KnownNat (Length bs)) => BLen (TiffBody end) Source # 
Instance details

Defined in Binrep.Example.Tiff

Methods

blen :: TiffBody end -> BLenT Source #

KnownNat base => BLen (AsciiNat base) Source #

The bytelength of an AsciiNat is the number of digits in the number in the given base. We can calculate this generically with great efficiency using GHC primitives.

Instance details

Defined in Binrep.Type.AsciiNat

Methods

blen :: AsciiNat base -> BLenT Source #

BLen (AsByteString 'C) Source # 
Instance details

Defined in Binrep.Type.ByteString

(itype ~ I 'U size end, irep ~ IRep 'U size, KnownNat (CBLen irep)) => BLen (AsByteString ('Pascal size end)) Source # 
Instance details

Defined in Binrep.Type.ByteString

Methods

blen :: AsByteString ('Pascal size end) -> BLenT Source #

KnownSymbol str => BLen (MagicUTF8 str) Source # 
Instance details

Defined in Binrep.Type.Magic.UTF8

Methods

blen :: MagicUTF8 str -> BLenT Source #

BLen a => BLen [a] Source #
O(n)
Instance details

Defined in Binrep.BLen

Methods

blen :: [a] -> BLenT Source #

KnownNat n => BLen (TarNat n) Source # 
Instance details

Defined in Binrep.Example.Tar

Methods

blen :: TarNat n -> BLenT Source #

KnownNat (Length (MagicVals a)) => BLen (Magic a) Source #

Assumes magic values are individual bytes.

Instance details

Defined in Binrep.Type.Magic

Methods

blen :: Magic a -> BLenT Source #

KnownNat n => BLen (NullPadded n a) Source # 
Instance details

Defined in Binrep.Type.NullPadded

Methods

blen :: NullPadded n a -> BLenT Source #

KnownNat n => BLen (Sized n a) Source # 
Instance details

Defined in Binrep.Type.Sized

Methods

blen :: Sized n a -> BLenT Source #

BLen a => BLen (Vector n a) Source # 
Instance details

Defined in Binrep.Type.Vector

Methods

blen :: Vector n a -> BLenT Source #

(BLen a, BLen b) => BLen (a, b) Source # 
Instance details

Defined in Binrep.BLen

Methods

blen :: (a, b) -> BLenT Source #

KnownNat (CBLen (I sign size end)) => BLen (I sign size end) Source # 
Instance details

Defined in Binrep.Type.Int

Methods

blen :: I sign size end -> BLenT Source #

(BLen a, itype ~ I 'U size end, KnownNat (CBLen itype)) => BLen (LenPfx size end a) Source # 
Instance details

Defined in Binrep.Type.LenPfx

Methods

blen :: LenPfx size end a -> BLenT Source #

type BLenT = Int Source #

typeNatToBLen :: forall n. KnownNat n => BLenT Source #

cblen :: forall a n. (n ~ CBLen a, KnownNat n) => BLenT Source #

Reify a type's constant byte length to the term level.