-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Principled and efficient bit-oriented binary serialization.
--   
--   See the <a>online tutorial</a>.
@package flat
@version 0.3


-- | Convert to/from strict ByteStrings
module Data.ByteString.Convert
class AsByteString a
toByteString :: AsByteString a => a -> ByteString
fromByteString :: AsByteString a => ByteString -> a
instance Data.ByteString.Convert.AsByteString Data.ByteString.Internal.ByteString
instance Data.ByteString.Convert.AsByteString Data.ByteString.Lazy.Internal.ByteString
instance Data.ByteString.Convert.AsByteString [GHC.Word.Word8]


-- | Strict Decoder Types
module Data.Flat.Decoder.Types
strictDecoder :: Get a -> ByteString -> Either DecodeException a
strictDecoderPart :: Get a -> ByteString -> Either DecodeException a

-- | Decoder monad
newtype Get a
Get :: (Ptr Word8 -> S -> IO (GetResult a)) -> Get a
[runGet] :: Get a -> Ptr Word8 -> S -> IO (GetResult a)

-- | Decoder state
data S
S :: {-# UNPACK #-} !(Ptr Word8) -> {-# UNPACK #-} !Int -> S
[currPtr] :: S -> {-# UNPACK #-} !(Ptr Word8)
[usedBits] :: S -> {-# UNPACK #-} !Int
data GetResult a
GetResult :: {-# UNPACK #-} !S -> !a -> GetResult a

-- | A decoded value
type Decoded a = Either DecodeException a

-- | An exception during decoding
data DecodeException
notEnoughSpace :: Ptr Word8 -> S -> IO a
tooMuchSpace :: Ptr Word8 -> S -> IO a
badEncoding :: Ptr Word8 -> S -> String -> IO a
instance GHC.Classes.Ord Data.Flat.Decoder.Types.DecodeException
instance GHC.Classes.Eq Data.Flat.Decoder.Types.DecodeException
instance GHC.Show.Show Data.Flat.Decoder.Types.DecodeException
instance GHC.Base.Functor Data.Flat.Decoder.Types.Get
instance GHC.Base.Functor Data.Flat.Decoder.Types.GetResult
instance GHC.Classes.Ord Data.Flat.Decoder.Types.S
instance GHC.Classes.Eq Data.Flat.Decoder.Types.S
instance GHC.Show.Show Data.Flat.Decoder.Types.S
instance GHC.Exception.Exception Data.Flat.Decoder.Types.DecodeException
instance Control.DeepSeq.NFData (Data.Flat.Decoder.Types.Get a)
instance GHC.Show.Show (Data.Flat.Decoder.Types.Get a)
instance GHC.Base.Applicative Data.Flat.Decoder.Types.Get
instance GHC.Base.Monad Data.Flat.Decoder.Types.Get


-- | Memory access primitives
module Data.Flat.Memory
chunksToByteString :: (Ptr Word8, [Int]) -> ByteString
chunksToByteArray :: (Ptr Word8, [Int]) -> (ByteArray, Int)

-- | Byte arrays
data ByteArray :: *
ByteArray :: ByteArray# -> ByteArray
pokeByteArray :: ByteArray# -> Int -> Int -> Ptr Word8 -> IO (Ptr Word8)

-- | Copy bytestring to given pointer, returns new pointer
pokeByteString :: ByteString -> Ptr Word8 -> IO (Ptr Word8)
unsafeCreateUptoN' :: Int -> (Ptr Word8 -> IO (Int, a)) -> (ByteString, a)

-- | Computes the offset required to get from the second to the first
--   argument. We have
--   
--   <pre>
--   p2 == p1 `plusPtr` (p2 `minusPtr` p1)
--   </pre>
minusPtr :: () => Ptr a -> Ptr b -> Int


-- | Common Types
module Data.Flat.Types

-- | Number of bits
type NumBits = Int

-- | Type representing arbitrary-precision non-negative integers.
--   
--   Operations whose result would be negative <tt><tt>throw</tt>
--   (<tt>Underflow</tt> :: <tt>ArithException</tt>)</tt>.
data Natural :: *

-- | A compact representation of a <a>Word8</a> vector.
--   
--   It has a lower memory overhead than a <a>ByteString</a> and and does
--   not contribute to heap fragmentation. It can be converted to or from a
--   <a>ByteString</a> (at the cost of copying the string data). It
--   supports very few other operations.
--   
--   It is suitable for use as an internal representation for code that
--   needs to keep many short strings in memory, but it <i>should not</i>
--   be used as an interchange type. That is, it should not generally be
--   used in public APIs. The <a>ByteString</a> type is usually more
--   suitable for use in interfaces; it is more flexible and it supports a
--   wide range of operations.
data ShortByteString :: *

-- | A space efficient, packed, unboxed Unicode text type.
data Text :: *

-- | A wrapper to encode/decode Text as UTF8 (slower but more compact)
newtype UTF8Text
UTF8Text :: Text -> UTF8Text

-- | A wrapper to encode/decode Text as UTF16 (faster but bigger)
newtype UTF16Text
UTF16Text :: Text -> UTF16Text
instance GHC.Show.Show Data.Flat.Types.UTF16Text
instance GHC.Classes.Ord Data.Flat.Types.UTF16Text
instance GHC.Classes.Eq Data.Flat.Types.UTF16Text
instance GHC.Show.Show Data.Flat.Types.UTF8Text
instance GHC.Classes.Ord Data.Flat.Types.UTF8Text
instance GHC.Classes.Eq Data.Flat.Types.UTF8Text


-- | Encoder Types
module Data.Flat.Encoder.Types

-- | Calculate the size (in bits) of the encoding of a value
type Size a = a -> NumBits -> NumBits

-- | Number of bits
type NumBits = Int

-- | A basic encoder
type Prim = S -> IO S

-- | Strict encoder state
data S
S :: {-# UNPACK #-} !(Ptr Word8) -> {-# UNPACK #-} !Word8 -> {-# UNPACK #-} !NumBits -> S
[nextPtr] :: S -> {-# UNPACK #-} !(Ptr Word8)
[currByte] :: S -> {-# UNPACK #-} !Word8
[usedBits] :: S -> {-# UNPACK #-} !NumBits
instance GHC.Show.Show Data.Flat.Encoder.Types.S


-- | Primitives to convert between Float<i>Double and Word32</i>Word64 |
--   This code was copied from <tt>binary</tt> | This module was written
--   based on
--   <a>http://hackage.haskell.org/package/reinterpret-cast-0.1.0/docs/src/Data-ReinterpretCast-Internal-ImplArray.html</a>.
--   
--   Implements casting via a 1-element STUArray, as described in
--   <a>http://stackoverflow.com/a/7002812/263061</a>.
module Data.FloatCast

-- | Reinterpret-casts a <a>Float</a> to a <a>Word32</a>.
floatToWord :: Float -> Word32

-- | Reinterpret-casts a <a>Word32</a> to a <a>Float</a>.
wordToFloat :: Word32 -> Float

-- | Reinterpret-casts a <a>Double</a> to a <a>Word64</a>.
doubleToWord :: Double -> Word64

-- | Reinterpret-casts a <a>Word64</a> to a <a>Double</a>.
wordToDouble :: Word64 -> Double


-- | Strict Decoder Primitives
module Data.Flat.Decoder.Prim

-- | Decode a boolean
dBool :: Get Bool

-- | Return the 8 most significant bits (same as dBE8)
dWord8 :: Get Word8

-- | Return the 8 most significant bits
dBE8 :: Get Word8

-- | Return the 16 most significant bits
dBE16 :: Get Word16

-- | Return the 32 most significant bits
dBE32 :: Get Word32

-- | Return the 64 most significant bits
dBE64 :: Get Word64

-- | Return the n most significant bits (up to maximum of 8) The bits are
--   returned right shifted.
--   
--   <pre>
--   &gt;&gt;&gt; unflatWith (dBEBits8 3) [128+64+32+1::Word8]
--   Right 7
--   </pre>
dBEBits8 :: Int -> Get Word8

-- | Return the n most significant bits (up to maximum of 16) The bits are
--   returned right shifted.
dBEBits16 :: Int -> Get Word16

-- | Return the n most significant bits (up to maximum of 8) The bits are
--   returned right shifted.
dBEBits32 :: Int -> Get Word32

-- | Return the n most significant bits (up to maximum of 8) The bits are
--   returned right shifted.
dBEBits64 :: Int -> Get Word64

-- | Drop the specified number of bits
dropBits :: Int -> Get ()

-- | Decode a Float
dFloat :: Get Float

-- | Decode a Double
dDouble :: Get Double

-- | Decode an Array (a list of chunks up to 255 bytes long) returning the
--   pointer to the first data byte and a list of chunk sizes
getChunksInfo :: Get (Ptr Word8, [Int])

-- | Decode a ByteString
dByteString_ :: Get ByteString

-- | Decode a Lazy ByteString
dLazyByteString_ :: Get ByteString

-- | Decode a ByteArray and its length
dByteArray_ :: Get (ByteArray, Int)

module Data.ZigZag
zzEncode :: (Num b, Integral a, FiniteBits a) => a -> b
zzEncodeInteger :: Integer -> Integer
zzDecode8 :: Word8 -> Int8
zzDecode16 :: Word16 -> Int16
zzDecode32 :: Word32 -> Int32
zzDecode64 :: Word64 -> Int64
zzDecodeInteger :: Integer -> Integer
zzDecode :: (Num a, Integral a1, Bits a1) => a1 -> a


-- | Encoding Primitives
module Data.Flat.Encoder.Prim

-- | Encode up to 8 bits.
eBitsF :: NumBits -> Word8 -> Prim
eFloatF :: Float -> Prim
eDoubleF :: Double -> Prim
eUTF16F :: Text -> Prim
eUTF8F :: Text -> Prim
eCharF :: Char -> Prim
eNaturalF :: Natural -> Prim
eIntegerF :: Integer -> Prim
eInt64F :: Int64 -> Prim
eInt32F :: Int32 -> Prim
eIntF :: Int -> Prim
eInt16F :: Int16 -> Prim
eInt8F :: Int8 -> Prim
eWordF :: Word -> Prim
eWord64F :: Word64 -> Prim
eWord32F :: Word32 -> Prim
eWord16F :: Word16 -> Prim
eBytesF :: ByteString -> Prim
eLazyBytesF :: ByteString -> Prim
eShortBytesF :: ShortByteString -> Prim
eWord8F :: Word8 -> Prim
eFillerF :: Prim
eBoolF :: Bool -> Prim
eTrueF :: Prim
eFalseF :: Prim
varWordF :: (Bits t, Integral t) => t -> Prim
w7l :: (Bits t, Integral t) => t -> [Word8]


-- | Primitives to calculate the encoding size of a value
module Data.Flat.Encoder.Size
sFillerMax :: NumBits
sBool :: NumBits
sWord8 :: NumBits
sInt8 :: NumBits
sFloat :: NumBits
sDouble :: NumBits
sChar :: Char -> NumBits
sCharMax :: NumBits
sWord :: Word -> NumBits
sInt :: Int -> NumBits
sInt16 :: Int16 -> NumBits
sInt32 :: Int32 -> NumBits
sInt64 :: Int64 -> NumBits
sWord16 :: Word16 -> NumBits
sWord32 :: Word32 -> NumBits
sWord64 :: Word64 -> NumBits
sInteger :: Integer -> NumBits
sNatural :: Natural -> NumBits
sIntegral :: (Bits t, Integral t) => t -> Int
sUTF8Max :: Text -> NumBits
sUTF16 :: Text -> NumBits
sBytes :: ByteString -> NumBits
sLazyBytes :: ByteString -> NumBits
sShortBytes :: ShortByteString -> NumBits
textBytes :: Text -> Int
bitsToBytes :: Int -> Int
numBlks :: Integral t => t -> t -> t
arrayBits :: Int -> NumBits
arrayChunks :: Int -> NumBits
blobBits :: Int -> NumBits
blkBitsBS :: ByteString -> NumBits
blksBits :: Int -> NumBits


-- | Strict encoder
module Data.Flat.Encoder.Strict

-- | Strict encoder
strictEncoder :: NumBits -> Encoding -> ByteString
newtype Encoding
Encoding :: Prim -> Encoding
[run] :: Encoding -> Prim
encodersS :: [Encoding] -> Encoding

-- | Encode as a List
encodeListWith :: (t -> Encoding) -> [t] -> Encoding

-- | Encode as Array
encodeArrayWith :: (t -> Encoding) -> [t] -> Encoding
eChar :: Char -> Encoding
eUTF16 :: Text -> Encoding
eUTF8 :: Text -> Encoding
eBytes :: ByteString -> Encoding
eLazyBytes :: ByteString -> Encoding
eShortBytes :: ShortByteString -> Encoding
eNatural :: Natural -> Encoding
eFloat :: Float -> Encoding
eDouble :: Double -> Encoding
eInteger :: Integer -> Encoding
eInt64 :: Int64 -> Encoding
eInt32 :: Int32 -> Encoding
eInt16 :: Int16 -> Encoding
eInt8 :: Int8 -> Encoding
eInt :: Int -> Encoding
eWord64 :: Word64 -> Encoding
eWord32 :: Word32 -> Encoding
eWord16 :: Word16 -> Encoding
eWord8 :: Word8 -> Encoding
eWord :: Word -> Encoding
eBits :: NumBits -> Word8 -> Encoding
eFiller :: Encoding
eBool :: Bool -> Encoding
eTrue :: Encoding
eFalse :: Encoding
vsize :: (t -> NumBits) -> t -> NumBits -> NumBits
csize :: NumBits -> t -> NumBits -> NumBits
sChar :: Size Char
sInt64 :: Size Int64
sInt32 :: Size Int32
sInt16 :: Size Int16
sInt8 :: Size Int8
sInt :: Size Int
sWord64 :: Size Word64
sWord32 :: Size Word32
sWord16 :: Size Word16
sWord8 :: Size Word8
sWord :: Size Word
sFloat :: Size Float
sDouble :: Size Double
sBytes :: Size ByteString
sLazyBytes :: Size ByteString
sShortBytes :: Size ShortByteString
sNatural :: Size Natural
sInteger :: Size Integer
sUTF8Max :: Size Text
sUTF16 :: Size Text
sFillerMax :: Size a
sBool :: Size Bool
instance GHC.Show.Show Data.Flat.Encoder.Strict.Encoding
instance GHC.Base.Monoid Data.Flat.Encoder.Strict.Encoding

module Data.Flat.Encoder
data Encoding

-- | An infix synonym for <a>mappend</a>.
(<>) :: Monoid m => m -> m -> m
infixr 6 <>

-- | Number of bits
type NumBits = Int
encodersS :: [Encoding] -> Encoding

-- | Identity of <a>mappend</a>
mempty :: Monoid a => a

-- | Strict encoder
strictEncoder :: NumBits -> Encoding -> ByteString
eTrueF :: Prim
eFalseF :: Prim
eFloat :: Float -> Encoding
eDouble :: Double -> Encoding
eInteger :: Integer -> Encoding
eNatural :: Natural -> Encoding
eWord16 :: Word16 -> Encoding
eWord32 :: Word32 -> Encoding
eWord64 :: Word64 -> Encoding
eWord8 :: Word8 -> Encoding
eBits :: NumBits -> Word8 -> Encoding
eFiller :: Encoding
eBool :: Bool -> Encoding
eTrue :: Encoding
eFalse :: Encoding
eBytes :: ByteString -> Encoding
eUTF16 :: Text -> Encoding
eLazyBytes :: ByteString -> Encoding
eShortBytes :: ShortByteString -> Encoding
eInt :: Int -> Encoding
eInt8 :: Int8 -> Encoding
eInt16 :: Int16 -> Encoding
eInt32 :: Int32 -> Encoding
eInt64 :: Int64 -> Encoding
eWord :: Word -> Encoding
eChar :: Char -> Encoding

-- | Encode as Array
encodeArrayWith :: (t -> Encoding) -> [t] -> Encoding

-- | Encode as a List
encodeListWith :: (t -> Encoding) -> [t] -> Encoding

-- | Calculate the size (in bits) of the encoding of a value
type Size a = a -> NumBits -> NumBits
arrayBits :: Int -> NumBits
sWord :: Size Word
sWord8 :: Size Word8
sWord16 :: Size Word16
sWord32 :: Size Word32
sWord64 :: Size Word64
sInt :: Size Int
sInt8 :: Size Int8
sInt16 :: Size Int16
sInt32 :: Size Int32
sInt64 :: Size Int64
sNatural :: Size Natural
sInteger :: Size Integer
sFloat :: Size Float
sDouble :: Size Double
sChar :: Size Char
sBytes :: Size ByteString
sLazyBytes :: Size ByteString
sShortBytes :: Size ShortByteString
sUTF16 :: Size Text
sFillerMax :: Size a
sBool :: Size Bool
sUTF8Max :: Size Text
eUTF8 :: Text -> Encoding


-- | Strict Decoder
module Data.Flat.Decoder.Strict
decodeArrayWith :: Get a -> Get [a]
decodeListWith :: Get a -> Get [a]
dByteString :: Get ByteString
dLazyByteString :: Get ByteString
dShortByteString :: Get ShortByteString
dShortByteString_ :: Get ShortByteString
dUTF16 :: Get Text
dUTF8 :: Get Text
dInteger :: Get Integer
dNatural :: Get Natural
dChar :: Get Char

-- | Return the 8 most significant bits (same as dBE8)
dWord8 :: Get Word8
dWord16 :: Get Word16
dWord32 :: Get Word32
dWord64 :: Get Word64
dWord :: Get Word
dInt8 :: Get Int8
dInt16 :: Get Int16
dInt32 :: Get Int32
dInt64 :: Get Int64
dInt :: Get Int


-- | Strict Decoder
module Data.Flat.Decoder
strictDecoder :: Get a -> ByteString -> Either DecodeException a
strictDecoderPart :: Get a -> ByteString -> Either DecodeException a

-- | A decoded value
type Decoded a = Either DecodeException a

-- | An exception during decoding
data DecodeException

-- | Decoder monad
data Get a
dByteString :: Get ByteString
dLazyByteString :: Get ByteString
dShortByteString :: Get ShortByteString
dShortByteString_ :: Get ShortByteString
dUTF16 :: Get Text
dUTF8 :: Get Text
decodeArrayWith :: Get a -> Get [a]
decodeListWith :: Get a -> Get [a]

-- | Decode a Float
dFloat :: Get Float

-- | Decode a Double
dDouble :: Get Double
dInteger :: Get Integer
dNatural :: Get Natural
dChar :: Get Char

-- | Decode a boolean
dBool :: Get Bool

-- | Return the 8 most significant bits (same as dBE8)
dWord8 :: Get Word8
dWord16 :: Get Word16
dWord32 :: Get Word32
dWord64 :: Get Word64
dWord :: Get Word
dInt8 :: Get Int8
dInt16 :: Get Int16
dInt32 :: Get Int32
dInt64 :: Get Int64
dInt :: Get Int

-- | Return the 8 most significant bits
dBE8 :: Get Word8

-- | Return the 16 most significant bits
dBE16 :: Get Word16

-- | Return the 32 most significant bits
dBE32 :: Get Word32

-- | Return the 64 most significant bits
dBE64 :: Get Word64

-- | Return the n most significant bits (up to maximum of 8) The bits are
--   returned right shifted.
--   
--   <pre>
--   &gt;&gt;&gt; unflatWith (dBEBits8 3) [128+64+32+1::Word8]
--   Right 7
--   </pre>
dBEBits8 :: Int -> Get Word8

-- | Return the n most significant bits (up to maximum of 16) The bits are
--   returned right shifted.
dBEBits16 :: Int -> Get Word16

-- | Return the n most significant bits (up to maximum of 8) The bits are
--   returned right shifted.
dBEBits32 :: Int -> Get Word32

-- | Return the n most significant bits (up to maximum of 8) The bits are
--   returned right shifted.
dBEBits64 :: Int -> Get Word64

-- | Drop the specified number of bits
dropBits :: Int -> Get ()


-- | Generics-based generation of Flat instances
module Data.Flat.Class

-- | Class of types that can be encoded/decoded
class Flat a
encode :: Flat a => a -> Encoding
encode :: (Flat a, Generic a, GEncode (Rep a)) => a -> Encoding
decode :: Flat a => Get a
decode :: (Flat a, Generic a, GDecode (Rep a)) => Get a
size :: Flat a => a -> NumBits -> NumBits
size :: (Flat a, Generic a, GSize (Rep a)) => a -> NumBits -> NumBits

-- | Calculate the size in bits of the serialisation of the value
getSize :: Flat a => a -> NumBits
instance (Data.Flat.Class.NumConstructors (a GHC.Generics.:+: b) GHC.TypeNats.<= 255, Data.Flat.Class.GSizeSum 0 (a GHC.Generics.:+: b)) => Data.Flat.Class.GSize (a GHC.Generics.:+: b)
instance (Data.Flat.Class.GSizeSum (n GHC.TypeNats.+ 1) a, Data.Flat.Class.GSizeSum (n GHC.TypeNats.+ 1) b, GHC.TypeNats.KnownNat n) => Data.Flat.Class.GSizeSum n (a GHC.Generics.:+: b)
instance (Data.Flat.Class.GSize a, GHC.TypeNats.KnownNat n) => Data.Flat.Class.GSizeSum n (GHC.Generics.C1 c a)
instance Data.Flat.Class.Flat a => Data.Flat.Class.GEncode (GHC.Generics.K1 i a)
instance Data.Flat.Class.Flat a => Data.Flat.Class.GEncoders (GHC.Generics.K1 i a)
instance Data.Flat.Class.Flat a => Data.Flat.Class.GDecode (GHC.Generics.K1 i a)
instance Data.Flat.Class.Flat a => Data.Flat.Class.GSize (GHC.Generics.K1 i a)
instance Data.Flat.Class.GSize f => Data.Flat.Class.GSize (GHC.Generics.M1 i c f)
instance Data.Flat.Class.GSize GHC.Generics.V1
instance Data.Flat.Class.GSize GHC.Generics.U1
instance (Data.Flat.Class.GSize a, Data.Flat.Class.GSize b) => Data.Flat.Class.GSize (a GHC.Generics.:*: b)
instance Data.Flat.Class.GDecode a => Data.Flat.Class.GDecode (GHC.Generics.M1 i c a)
instance Data.Flat.Class.GDecode GHC.Generics.V1
instance Data.Flat.Class.GDecode GHC.Generics.U1
instance (Data.Flat.Class.GDecode a, Data.Flat.Class.GDecode b) => Data.Flat.Class.GDecode (a GHC.Generics.:*: b)
instance (Data.Flat.Class.GDecode a, Data.Flat.Class.GDecode b) => Data.Flat.Class.GDecode (a GHC.Generics.:+: b)
instance (Data.Flat.Class.NumConstructors (a GHC.Generics.:+: b) GHC.TypeNats.<= 255, Data.Flat.Class.GEncodeSum 0 0 (a GHC.Generics.:+: b)) => Data.Flat.Class.GEncode (a GHC.Generics.:+: b)
instance (Data.Flat.Class.GEncodeSum (n GHC.TypeNats.+ 1) (m GHC.TypeNats.* 2) a, Data.Flat.Class.GEncodeSum (n GHC.TypeNats.+ 1) ((m GHC.TypeNats.* 2) GHC.TypeNats.+ 1) b, GHC.TypeNats.KnownNat n, GHC.TypeNats.KnownNat m) => Data.Flat.Class.GEncodeSum n m (a GHC.Generics.:+: b)
instance (Data.Flat.Class.GEncoders a, GHC.TypeNats.KnownNat n, GHC.TypeNats.KnownNat m) => Data.Flat.Class.GEncodeSum n m (GHC.Generics.C1 c a)
instance Data.Flat.Class.GEncoders a => Data.Flat.Class.GEncode (GHC.Generics.D1 i (GHC.Generics.C1 c a))
instance Data.Flat.Class.GEncoders a => Data.Flat.Class.GEncoders (GHC.Generics.M1 i c a)
instance Data.Flat.Class.GEncoders a => Data.Flat.Class.GEncoders (GHC.Generics.D1 i (GHC.Generics.C1 c a))
instance Data.Flat.Class.GEncoders GHC.Generics.V1
instance Data.Flat.Class.GEncoders GHC.Generics.U1
instance (Data.Flat.Class.GEncoders a, Data.Flat.Class.GEncoders b) => Data.Flat.Class.GEncoders (a GHC.Generics.:*: b)
instance Data.Flat.Class.GEncode a => Data.Flat.Class.GEncode (GHC.Generics.M1 i c a)
instance Data.Flat.Class.GEncode GHC.Generics.V1
instance Data.Flat.Class.GEncode GHC.Generics.U1
instance Data.Flat.Class.GEncode (a GHC.Generics.:*: b)


-- | Flat Instances for common, primitive and abstract data types for which
--   instances cannot be automatically derived
module Data.Flat.Instances

-- | Calculate size of an instance of IsMap
sizeMap :: (Flat (ContainerKey r), Flat (MapValue r), IsMap r) => Size r

-- | Encode an instance of IsMap, as a list
encodeMap :: (Flat (ContainerKey map), Flat (MapValue map), IsMap map) => map -> Encoding

-- | Decode an instance of IsMap, as a list
decodeMap :: (Flat (ContainerKey map), Flat (MapValue map), IsMap map) => Get map

-- | Calculate size of an instance of IsSequence
sizeSequence :: (IsSequence mono, Flat (Element mono)) => mono -> NumBits -> NumBits

-- | Encode an instance of IsSequence, as an array
encodeSequence :: (Flat (Element mono), IsSequence mono) => mono -> Encoding

-- | Decode an instance of IsSequence, as an array
decodeSequence :: (Flat (Element b), IsSequence b) => Get b
instance Data.Flat.Class.Flat ()
instance Data.Flat.Class.Flat GHC.Types.Bool
instance Data.Flat.Class.Flat a => Data.Flat.Class.Flat (GHC.Base.Maybe a)
instance (Data.Flat.Class.Flat a, Data.Flat.Class.Flat b) => Data.Flat.Class.Flat (Data.Either.Either a b)
instance (Data.Flat.Class.Flat a, Data.Flat.Class.Flat b) => Data.Flat.Class.Flat (a, b)
instance (Data.Flat.Class.Flat a, Data.Flat.Class.Flat b, Data.Flat.Class.Flat c) => Data.Flat.Class.Flat (a, b, c)
instance (Data.Flat.Class.Flat a, Data.Flat.Class.Flat b, Data.Flat.Class.Flat c, Data.Flat.Class.Flat d) => Data.Flat.Class.Flat (a, b, c, d)
instance (Data.Flat.Class.Flat a, Data.Flat.Class.Flat b, Data.Flat.Class.Flat c, Data.Flat.Class.Flat d, Data.Flat.Class.Flat e) => Data.Flat.Class.Flat (a, b, c, d, e)
instance (Data.Flat.Class.Flat a, Data.Flat.Class.Flat b, Data.Flat.Class.Flat c, Data.Flat.Class.Flat d, Data.Flat.Class.Flat e, Data.Flat.Class.Flat f) => Data.Flat.Class.Flat (a, b, c, d, e, f)
instance (Data.Flat.Class.Flat a, Data.Flat.Class.Flat b, Data.Flat.Class.Flat c, Data.Flat.Class.Flat d, Data.Flat.Class.Flat e, Data.Flat.Class.Flat f, Data.Flat.Class.Flat g) => Data.Flat.Class.Flat (a, b, c, d, e, f, g)
instance Data.Flat.Class.Flat a => Data.Flat.Class.Flat [a]
instance Data.Flat.Class.Flat [GHC.Types.Char]
instance Data.Flat.Class.Flat Data.ByteString.Internal.ByteString
instance Data.Flat.Class.Flat Data.ByteString.Lazy.Internal.ByteString
instance Data.Flat.Class.Flat Data.ByteString.Short.Internal.ShortByteString
instance Data.Flat.Class.Flat Data.Text.Internal.Text
instance Data.Flat.Class.Flat Data.Flat.Types.UTF8Text
instance Data.Flat.Class.Flat Data.Flat.Types.UTF16Text
instance Data.Flat.Class.Flat GHC.Word.Word8
instance Data.Flat.Class.Flat GHC.Word.Word16
instance Data.Flat.Class.Flat GHC.Word.Word32
instance Data.Flat.Class.Flat GHC.Word.Word64
instance Data.Flat.Class.Flat GHC.Types.Word
instance Data.Flat.Class.Flat GHC.Int.Int8
instance Data.Flat.Class.Flat GHC.Int.Int16
instance Data.Flat.Class.Flat GHC.Int.Int32
instance Data.Flat.Class.Flat GHC.Int.Int64
instance Data.Flat.Class.Flat GHC.Types.Int
instance Data.Flat.Class.Flat GHC.Integer.Type.Integer
instance Data.Flat.Class.Flat GHC.Natural.Natural
instance Data.Flat.Class.Flat GHC.Types.Float
instance Data.Flat.Class.Flat GHC.Types.Double
instance Data.Flat.Class.Flat GHC.Types.Char
instance (Data.Flat.Class.Flat a, Data.Flat.Class.Flat b, GHC.Classes.Ord a) => Data.Flat.Class.Flat (Data.Map.Internal.Map a b)
instance Data.Flat.Class.Flat a => Data.Flat.Class.Flat (Data.Sequence.Internal.Seq a)


-- | Pre-value and post-value byte alignments
module Data.Flat.Filler

-- | A meaningless sequence of 0 bits terminated with a 1 bit (easier to
--   implement than the reverse) Useful to align an encoded value at
--   byte/word boundaries.
data Filler
FillerBit :: Filler -> Filler
FillerEnd :: Filler

-- | Length of a filler in bits
fillerLength :: Num a => Filler -> a

-- | A Pre aligned value, a value preceded by a filler
data PreAligned a
PreAligned :: Filler -> a -> PreAligned a
[preFiller] :: PreAligned a -> Filler
[preValue] :: PreAligned a -> a

-- | Pre align a value
preAligned :: a -> PreAligned a

-- | A Post aligned value, a value followed by a filler
data PostAligned a
PostAligned :: a -> Filler -> PostAligned a
[postValue] :: PostAligned a -> a
[postFiller] :: PostAligned a -> Filler

-- | Post align a value
postAligned :: a -> PostAligned a
postAlignedDecoder :: Get b -> Get b
instance Data.Flat.Class.Flat a => Data.Flat.Class.Flat (Data.Flat.Filler.PreAligned a)
instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Flat.Filler.PreAligned a)
instance GHC.Generics.Generic (Data.Flat.Filler.PreAligned a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Flat.Filler.PreAligned a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Flat.Filler.PreAligned a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Flat.Filler.PreAligned a)
instance Data.Flat.Class.Flat a => Data.Flat.Class.Flat (Data.Flat.Filler.PostAligned a)
instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Flat.Filler.PostAligned a)
instance GHC.Generics.Generic (Data.Flat.Filler.PostAligned a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Flat.Filler.PostAligned a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Flat.Filler.PostAligned a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Flat.Filler.PostAligned a)
instance Control.DeepSeq.NFData Data.Flat.Filler.Filler
instance GHC.Generics.Generic Data.Flat.Filler.Filler
instance GHC.Classes.Ord Data.Flat.Filler.Filler
instance GHC.Classes.Eq Data.Flat.Filler.Filler
instance GHC.Show.Show Data.Flat.Filler.Filler
instance Data.Flat.Class.Flat Data.Flat.Filler.Filler


-- | Encoding and decoding functions
module Data.Flat.Run

-- | Encode padded value.
flat :: Flat a => a -> ByteString

-- | Encode unpadded value
flatRaw :: (Flat a, AsByteString b) => a -> b

-- | Decode padded value.
unflat :: (Flat a, AsByteString b) => b -> Decoded a

-- | Decode padded value, using the provided unpadded decoder.
unflatWith :: AsByteString b => Get a -> b -> Decoded a

-- | Decode unpadded value.
unflatRaw :: (Flat a, AsByteString b) => b -> Decoded a

-- | Unflat unpadded value, using provided decoder
unflatRawWith :: AsByteString b => Get a -> b -> Decoded a


-- | Utilities to represent and display bit sequences
module Data.Flat.Bits

-- | A sequence of bits
type Bits = Vector Bool
toBools :: Bits -> [Bool]
fromBools :: [Bool] -> Bits

-- | The sequence of bits corresponding to the serialization of the passed
--   value (without any final byte padding)
bits :: forall a. Flat a => a -> Bits

-- | The sequence of bits corresponding to the byte-padded serialization of
--   the passed value
paddedBits :: forall a. Flat a => a -> Bits

-- | Convert a sequence of bits to the corresponding list of bytes
asBytes :: Bits -> [Word8]

-- | asBits (5::Word8) | &gt;
--   [False,False,False,False,False,True,False,True]
asBits :: FiniteBits a => a -> Bits
instance Text.PrettyPrint.HughesPJClass.Pretty Data.Flat.Bits.Bits

module Data.Flat

-- | A wrapper to encode/decode Text as UTF8 (slower but more compact)
newtype UTF8Text
UTF8Text :: Text -> UTF8Text

-- | A wrapper to encode/decode Text as UTF16 (faster but bigger)
newtype UTF16Text
UTF16Text :: Text -> UTF16Text

-- | Decoder monad
data Get a

-- | A decoded value
type Decoded a = Either DecodeException a

-- | An exception during decoding
data DecodeException
