binary-tagged-0.1.4.0: Tagged binary serialisation.

Copyright(C) 2015 Oleg Grenrus
LicenseBSD3
MaintainerOleg Grenrus <oleg.grenrus@iki.fi>
Safe HaskellNone
LanguageHaskell2010

Data.Binary.Tagged

Contents

Description

Structurally tag binary serialisation stream.

Say you have:

data Record = Record
  { _recordFields :: HM.HashMap Text (Integer, ByteString)
  , _recordEnabled :: Bool
  }
  deriving (Eq, Show, Generic)

instance Binary Record
instance HasStructuralInfo Record
instance HasSemanticVersion Record

then you can serialise and deserialise Record values with a structure tag by simply

encodeTaggedFile "cachefile" record
decodeTaggedFile "cachefile" :: IO Record

If structure of Record changes in between, deserialisation will fail early.

Synopsis

Data

newtype BinaryTagged v a Source

Binary serialisable class, which tries to be less error-prone to data structure changes.

Values are serialised with header consisting of version v and hash of structuralInfo.

Constructors

BinaryTagged 

Fields

unBinaryTagged :: a
 

Instances

Monad (BinaryTagged k v) Source 
Functor (BinaryTagged k v) Source 
Applicative (BinaryTagged k v) Source 
Foldable (BinaryTagged k v) Source 
Traversable (BinaryTagged k v) Source 
Generic1 (BinaryTagged k v) Source 
Eq a => Eq (BinaryTagged k v a) Source 
Ord a => Ord (BinaryTagged k v a) Source 
Read a => Read (BinaryTagged k v a) Source 
Show a => Show (BinaryTagged k v a) Source 
Generic (BinaryTagged k v a) Source 
Monoid a => Monoid (BinaryTagged k v a) Source 
(Binary a, HasStructuralInfo a, KnownNat v) => Binary (BinaryTagged Nat v a) Source

Version and structure hash are prepended to serialised stream

type Rep1 (BinaryTagged k v) Source 
type Rep (BinaryTagged k v a) Source 

Serialisation

taggedEncode :: forall a. (HasStructuralInfo a, HasSemanticVersion a, Binary a) => a -> ByteString Source

Tagged version of encode

taggedDecode :: forall a. (HasStructuralInfo a, HasSemanticVersion a, Binary a) => ByteString -> a Source

Tagged version of decode

IO functions for serialisation

taggedEncodeFile :: forall a. (HasStructuralInfo a, HasSemanticVersion a, Binary a) => FilePath -> a -> IO () Source

Tagged version of encodeFile

Class

class HasStructuralInfo a where Source

Type class providing StructuralInfo for each data type.

For regular non-recursive ADTs HasStructuralInfo can be derived generically.

data Record = Record { a :: Int, b :: Bool, c :: [Char] } deriving (Generic)
instance hasStructuralInfo Record

For stable types, you can provide only type name

instance HasStructuralInfo Int where structuralInfo = ghcNominalType -- infer name from Generic information
instance HasStructuralInfo Integer where structuralInfo _ = NominalType "Integer"

Recursive type story is a bit sad atm. If the type structure is stable, you can do:

instance HasStructuralInfo a => HasStructuralInfo [a] where structuralInfo = ghcStructuralInfo1

Minimal complete definition

Nothing

Instances

HasStructuralInfo Bool Source 
HasStructuralInfo Char Source 
HasStructuralInfo Double Source

Since binary-tagged-0.1.3.0

HasStructuralInfo Float Source

Since binary-tagged-0.1.3.0

HasStructuralInfo Int Source 
HasStructuralInfo Int8 Source 
HasStructuralInfo Int16 Source 
HasStructuralInfo Int32 Source 
HasStructuralInfo Int64 Source 
HasStructuralInfo Integer Source 
HasStructuralInfo Ordering Source

Since binary-tagged-0.1.3.0

HasStructuralInfo Word Source 
HasStructuralInfo Word8 Source 
HasStructuralInfo Word16 Source 
HasStructuralInfo Word32 Source 
HasStructuralInfo Word64 Source 
HasStructuralInfo () Source

Since binary-tagged-0.1.3.0

HasStructuralInfo ByteString Source 
HasStructuralInfo ByteString Source 
HasStructuralInfo Text Source 
HasStructuralInfo UTCTime Source 
HasStructuralInfo Value Source 
HasStructuralInfo Text Source 
HasStructuralInfo E0 Source 
HasStructuralInfo E1 Source 
HasStructuralInfo E2 Source 
HasStructuralInfo E3 Source 
HasStructuralInfo E6 Source 
HasStructuralInfo E9 Source 
HasStructuralInfo E12 Source 
HasStructuralInfo Natural Source

Since binary-tagged-0.1.4.0

HasStructuralInfo Version Source

Since binary-tagged-0.1.3.0

HasStructuralInfo All Source

Since binary-tagged-0.1.4.0

HasStructuralInfo Any Source

Since binary-tagged-0.1.4.0

HasStructuralInfo IntSet Source 
HasStructuralInfo LocalTime Source 
HasStructuralInfo TimeOfDay Source 
HasStructuralInfo TimeZone Source 
HasStructuralInfo NominalDiffTime Source 
HasStructuralInfo Day Source 
HasStructuralInfo UniversalTime Source 
HasStructuralInfo DiffTime Source 
HasStructuralInfo StructuralInfo Source 
HasStructuralInfo a => HasStructuralInfo [a] Source 
HasStructuralInfo a => HasStructuralInfo (Ratio a) Source 
HasStructuralInfo a => HasStructuralInfo (Maybe a) Source 
HasStructuralInfo a => HasStructuralInfo (Fixed a) Source

Since binary-tagged-0.1.3.0

HasStructuralInfo a => HasStructuralInfo (Dual a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Sum a) Source 
HasStructuralInfo a => HasStructuralInfo (Product a) Source 
HasStructuralInfo a => HasStructuralInfo (First a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Last a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (IntMap a) Source 
HasStructuralInfo a => HasStructuralInfo (Set a) Source 
HasStructuralInfo a => HasStructuralInfo (Seq a) Source 
HasStructuralInfo a => HasStructuralInfo (Min a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Max a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (First a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Last a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (WrappedMonoid a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Option a) Source

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (NonEmpty a) Source 
HasStructuralInfo a => HasStructuralInfo (HashSet a) Source 
HasStructuralInfo a => HasStructuralInfo (Vector a) Source 
HasStructuralInfo a => HasStructuralInfo (Vector a) Source 
HasStructuralInfo a => HasStructuralInfo (Vector a) Source 
(HasStructuralInfo a, HasStructuralInfo b) => HasStructuralInfo (Either a b) Source 
(HasStructuralInfo a, HasStructuralInfo b) => HasStructuralInfo (a, b) Source 
(HasStructuralInfo k, HasStructuralInfo v) => HasStructuralInfo (HashMap k v) Source 
(HasStructuralInfo k, HasStructuralInfo v) => HasStructuralInfo (Map k v) Source 
(HasStructuralInfo i, HasStructuralInfo e) => HasStructuralInfo (UArray i e) Source 
(HasStructuralInfo i, HasStructuralInfo e) => HasStructuralInfo (Array i e) Source 
(HasStructuralInfo a, HasStructuralInfo b, HasStructuralInfo c) => HasStructuralInfo (a, b, c) Source 
(HasStructuralInfo a, HasStructuralInfo b, HasStructuralInfo c, HasStructuralInfo d) => HasStructuralInfo (a, b, c, d) Source 

class KnownNat (SemanticVersion a) => HasSemanticVersion a Source

A helper type family for encodeTaggedFile and decodeTaggedFile.

The default definition is SemanticVersion a = 0

Associated Types

type SemanticVersion a :: Nat Source

Instances

HasSemanticVersion Bool Source 
HasSemanticVersion Char Source 
HasSemanticVersion Double Source

Since binary-tagged-0.1.3.0

HasSemanticVersion Float Source

Since binary-tagged-0.1.3.0

HasSemanticVersion Int Source 
HasSemanticVersion Int8 Source 
HasSemanticVersion Int16 Source 
HasSemanticVersion Int32 Source 
HasSemanticVersion Int64 Source 
HasSemanticVersion Integer Source 
HasSemanticVersion Ordering Source

Since binary-tagged-0.1.3.0

HasSemanticVersion Word Source 
HasSemanticVersion Word8 Source 
HasSemanticVersion Word16 Source 
HasSemanticVersion Word32 Source 
HasSemanticVersion Word64 Source 
HasSemanticVersion () Source

Since binary-tagged-0.1.3.0

HasSemanticVersion ByteString Source 
HasSemanticVersion ByteString Source 
HasSemanticVersion Text Source 
HasSemanticVersion UTCTime Source 
HasSemanticVersion Value Source 
HasSemanticVersion Text Source 
HasSemanticVersion Natural Source

Since binary-tagged-0.1.4.0

HasSemanticVersion Version Source

Since binary-tagged-0.1.3.0

HasSemanticVersion All Source

Since binary-tagged-0.1.4.0

HasSemanticVersion Any Source

Since binary-tagged-0.1.4.0

HasSemanticVersion IntSet Source 
HasSemanticVersion LocalTime Source 
HasSemanticVersion TimeOfDay Source 
HasSemanticVersion TimeZone Source 
HasSemanticVersion NominalDiffTime Source 
HasSemanticVersion Day Source 
HasSemanticVersion UniversalTime Source 
HasSemanticVersion DiffTime Source 
HasSemanticVersion StructuralInfo Source 
HasSemanticVersion a => HasSemanticVersion [a] Source 
HasSemanticVersion a => HasSemanticVersion (Ratio a) Source 
HasSemanticVersion a => HasSemanticVersion (Maybe a) Source 
HasSemanticVersion (Fixed a) Source

Since binary-tagged-0.1.3.0

HasSemanticVersion a => HasSemanticVersion (Dual a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Sum a) Source 
HasSemanticVersion a => HasSemanticVersion (Product a) Source 
HasSemanticVersion a => HasSemanticVersion (First a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Last a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (IntMap a) Source 
HasSemanticVersion a => HasSemanticVersion (Set a) Source 
HasSemanticVersion a => HasSemanticVersion (Seq a) Source 
HasSemanticVersion a => HasSemanticVersion (Min a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Max a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (First a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Last a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (WrappedMonoid a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Option a) Source

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (NonEmpty a) Source 
HasSemanticVersion a => HasSemanticVersion (HashSet a) Source 
HasSemanticVersion a => HasSemanticVersion (Vector a) Source 
HasSemanticVersion a => HasSemanticVersion (Vector a) Source 
HasSemanticVersion a => HasSemanticVersion (Vector a) Source 
(HasSemanticVersion a, HasSemanticVersion b, KnownNat (SemanticVersion (Either a b))) => HasSemanticVersion (Either a b) Source 
(HasSemanticVersion a, HasSemanticVersion b, KnownNat (SemanticVersion (a, b))) => HasSemanticVersion (a, b) Source 
(HasSemanticVersion k, HasSemanticVersion v, KnownNat (SemanticVersion (HashMap k v))) => HasSemanticVersion (HashMap k v) Source 
(HasSemanticVersion k, HasSemanticVersion v, KnownNat (SemanticVersion (Map k v))) => HasSemanticVersion (Map k v) Source 
(HasSemanticVersion i, HasSemanticVersion e, KnownNat (SemanticVersion (UArray i e))) => HasSemanticVersion (UArray i e) Source 
(HasSemanticVersion i, HasSemanticVersion e, KnownNat (SemanticVersion (Array i e))) => HasSemanticVersion (Array i e) Source 
(HasSemanticVersion a, HasSemanticVersion b, HasSemanticVersion c, KnownNat (SemanticVersion (a, b, c))) => HasSemanticVersion (a, b, c) Source

Since binary-tagged-0.1.3.0

(HasSemanticVersion a, HasSemanticVersion b, HasSemanticVersion c, HasSemanticVersion d, KnownNat (SemanticVersion (a, b, c, d))) => HasSemanticVersion (a, b, c, d) Source

Since binary-tagged-0.1.3.0

type Version = Word32 Source

Type the semantic version is serialised with.

Type level calculations

type Interleave n m = SumUpTo (n + m) + m Source

Interleaving

3 | 9  .  .  .  .
2 | 5  8  .  .  .
1 | 2  4  7 11  .
0 | 0  1  3  6 10
-----------------
    0  1  2  3  4

This can be calculated by f x y = sum ([0..x+y]) + y

type SumUpTo n = Div2 (n * (n + 1)) Source

type family Div2 n :: Nat Source

Equations

Div2 0 = 0 
Div2 1 = 0 
Div2 n = 1 + Div2 (n - 2) 

Generic derivation

GHC

SOP

SOP direct

Hash