bytes-0.15.0.1: Sharing code for serialization between binary and cereal

LicenseBSD3
Stabilityexperimental
Portabilitytype-families, generalized newtype deriving
Safe HaskellNone
LanguageHaskell98

Data.Bytes.VarInt

Description

This module provides a VarInt wrapper with a Serial instance that generates base-128 variable-width ints. Values are encoded 7 bits at a time, with the most significant being a continuation bit. Thus, the numbers from 0 to 127 require only a single byte to encode, those from 128 to 16383 require two bytes, etc.

This format is taken from Google's Protocol Buffers, which provides a bit more verbiage on the encoding: https://developers.google.com/protocol-buffers/docs/encoding#varints.

Documentation

newtype VarInt n Source

Constructors

VarInt 

Fields

unVarInt :: n
 

Instances

Bounded n => Bounded (VarInt n) 
Enum n => Enum (VarInt n) 
Eq n => Eq (VarInt n) 
Integral n => Integral (VarInt n) 
Num n => Num (VarInt n) 
Ord n => Ord (VarInt n) 
Real n => Real (VarInt n) 
Show n => Show (VarInt n) 
Bits n => Bits (VarInt n) 
(Bits n, Integral n, Bits (Unsigned n), Integral (Unsigned n)) => Serial (VarInt n)

$setup >>> import Data.Word >>> import Data.Fixed >>> import Data.Bytes.Serial

Integer/Word types serialized to base-128 variable-width ints.

>>> import Data.Monoid (mconcat)
>>> import qualified Data.ByteString.Lazy as BSL
>>> mconcat $ BSL.toChunks $ runPutL $ serialize (97 :: Word64)
"\NUL\NUL\NUL\NUL\NUL\NUL\NULa"
>>> mconcat $ BSL.toChunks $ runPutL $ serialize (97 :: VarInt Word64)
"a"
type Signed (VarInt n) = VarInt (Signed n) 
type Unsigned (VarInt n) = VarInt (Unsigned n)