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

Binrep.Type.Varint

Description

Variable-length integers (varints), a method to store arbitrarily large integers in a space efficient manner.

Note that varints aren't particularly efficient due to their decoding being slow. They are most interesting when you wish to provide support for large integers, but know that many (most?) inputs will be small, and want to be space efficient for them. Protocol Buffers uses them extensively, while Cap'n Proto swears them off.

TODO

Synopsis

Documentation

newtype Varnat (enc :: Encoding) (cont :: ContinuationBitBehaviour) (e :: Endianness) i Source #

A variable-length unsigned integer (natural).

The base algorithm is to split the natural into groups of 7 bits, and use the MSB to indicate whether another octet follows. You must specify a handful of type variables, which select precise varint behaviour beyond this. See their documentation for details.

You may select the type to use varnats at, but error handling isn't provided: negatives won't work correctly, and overflow cannot be detected. So most of the time, you probably want Natural and Integer.

Some examples:

Constructors

Varnat 

Fields

Instances

Instances details
Enum i => Enum (Varnat enc cont e i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

succ :: Varnat enc cont e i -> Varnat enc cont e i #

pred :: Varnat enc cont e i -> Varnat enc cont e i #

toEnum :: Int -> Varnat enc cont e i #

fromEnum :: Varnat enc cont e i -> Int #

enumFrom :: Varnat enc cont e i -> [Varnat enc cont e i] #

enumFromThen :: Varnat enc cont e i -> Varnat enc cont e i -> [Varnat enc cont e i] #

enumFromTo :: Varnat enc cont e i -> Varnat enc cont e i -> [Varnat enc cont e i] #

enumFromThenTo :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i -> [Varnat enc cont e i] #

Num i => Num (Varnat enc cont e i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

(+) :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

(-) :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

(*) :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

negate :: Varnat enc cont e i -> Varnat enc cont e i #

abs :: Varnat enc cont e i -> Varnat enc cont e i #

signum :: Varnat enc cont e i -> Varnat enc cont e i #

fromInteger :: Integer -> Varnat enc cont e i #

Integral i => Integral (Varnat enc cont e i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

quot :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

rem :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

div :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

mod :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

quotRem :: Varnat enc cont e i -> Varnat enc cont e i -> (Varnat enc cont e i, Varnat enc cont e i) #

divMod :: Varnat enc cont e i -> Varnat enc cont e i -> (Varnat enc cont e i, Varnat enc cont e i) #

toInteger :: Varnat enc cont e i -> Integer #

Real i => Real (Varnat enc cont e i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

toRational :: Varnat enc cont e i -> Rational #

Show i => Show (Varnat enc cont e i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

showsPrec :: Int -> Varnat enc cont e i -> ShowS #

show :: Varnat enc cont e i -> String #

showList :: [Varnat enc cont e i] -> ShowS #

(VarintContinuation cont, Integral i, Bits i) => Get (Varnat 'Bijective cont 'BE i) Source #

TODO nothing to test against - unsure if correct

Instance details

Defined in Binrep.Type.Varint

Methods

get :: Getter (Varnat 'Bijective cont 'BE i) Source #

(VarintContinuation cont, Integral i, Bits i) => Get (Varnat 'Bijective cont 'LE i) Source #

Git varint (cont=on), BPS (beat patches) (cont=off)

Instance details

Defined in Binrep.Type.Varint

Methods

get :: Getter (Varnat 'Bijective cont 'LE i) Source #

(VarintContinuation cont, Integral i, Bits i) => Get (Varnat 'Redundant cont 'BE i) Source #

VLQ (cont=on)

Instance details

Defined in Binrep.Type.Varint

Methods

get :: Getter (Varnat 'Redundant cont 'BE i) Source #

(VarintContinuation cont, Integral i, Bits i) => Get (Varnat 'Redundant cont 'LE i) Source #

protobuf (cont=on), LEB128 (cont=on)

not truly infinite length since shifters take Int, but practically infinite

Instance details

Defined in Binrep.Type.Varint

Methods

get :: Getter (Varnat 'Redundant cont 'LE i) Source #

(VarintContinuation cont, Integral i, Bits i) => Put (Varnat 'Redundant cont 'BE i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

put :: Varnat 'Redundant cont 'BE i -> Builder Source #

(VarintContinuation cont, Integral i, Bits i) => Put (Varnat 'Redundant cont 'LE i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

put :: Varnat 'Redundant cont 'LE i -> Builder Source #

Eq i => Eq (Varnat enc cont e i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

(==) :: Varnat enc cont e i -> Varnat enc cont e i -> Bool #

(/=) :: Varnat enc cont e i -> Varnat enc cont e i -> Bool #

Ord i => Ord (Varnat enc cont e i) Source # 
Instance details

Defined in Binrep.Type.Varint

Methods

compare :: Varnat enc cont e i -> Varnat enc cont e i -> Ordering #

(<) :: Varnat enc cont e i -> Varnat enc cont e i -> Bool #

(<=) :: Varnat enc cont e i -> Varnat enc cont e i -> Bool #

(>) :: Varnat enc cont e i -> Varnat enc cont e i -> Bool #

(>=) :: Varnat enc cont e i -> Varnat enc cont e i -> Bool #

max :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

min :: Varnat enc cont e i -> Varnat enc cont e i -> Varnat enc cont e i #

data ContinuationBitBehaviour Source #

Constructors

OnContinues

on=continue, off=end

OffContinues

on=end, off=continue

data Encoding Source #

Constructors

Redundant

simple, some varints have the same value

Bijective

each integer has exactly 1 varint encoding

class VarintContinuation (cont :: ContinuationBitBehaviour) where Source #

Instances

Instances details
VarintContinuation 'OffContinues Source # 
Instance details

Defined in Binrep.Type.Varint

VarintContinuation 'OnContinues Source # 
Instance details

Defined in Binrep.Type.Varint

testVarintCont :: forall cont a. VarintContinuation cont => Bits a => a -> Int -> Bool Source #

setVarintCont :: forall cont a. VarintContinuation cont => Bits a => a -> Int -> a Source #