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


-- | Tagged binary serialisation.
--   
--   Check <a>README on Github</a>
@package binary-tagged
@version 0.1.3.1


-- | Structurally tag binary serialisation stream.
--   
--   Say you have:
--   
--   <pre>
--   data Record = Record
--     { _recordFields :: HM.HashMap Text (Integer, ByteString)
--     , _recordEnabled :: Bool
--     }
--     deriving (Eq, Show, Generic)
--   
--   instance Binary Record
--   instance HasStructuralInfo Record
--   instance HasSemanticVersion Record
--   </pre>
--   
--   then you can serialise and deserialise <tt>Record</tt> values with a
--   structure tag by simply
--   
--   <pre>
--   encodeTaggedFile "cachefile" record
--   decodeTaggedFile "cachefile" :: IO Record
--   </pre>
--   
--   If structure of <tt>Record</tt> changes in between, deserialisation
--   will fail early.
module Data.Binary.Tagged

-- | <a>Binary</a> serialisable class, which tries to be less error-prone
--   to data structure changes.
--   
--   Values are serialised with header consisting of version <tt>v</tt> and
--   hash of <a>structuralInfo</a>.
newtype BinaryTagged (v :: k) a
BinaryTagged :: a -> BinaryTagged a
[unBinaryTagged] :: BinaryTagged a -> a
type BinaryTagged' a = BinaryTagged (SemanticVersion a) a
binaryTag :: Proxy v -> a -> BinaryTagged v a
binaryTag' :: HasSemanticVersion a => a -> BinaryTagged' a
binaryUntag :: Proxy v -> BinaryTagged v a -> a
binaryUntag' :: HasSemanticVersion a => BinaryTagged' a -> a

-- | Data type structure, with (some) nominal information.
data StructuralInfo
NominalType :: String -> StructuralInfo
NominalNewtype :: String -> StructuralInfo -> StructuralInfo
StructuralInfo :: String -> [[StructuralInfo]] -> StructuralInfo

-- | Tagged version of <a>encode</a>
taggedEncode :: (HasStructuralInfo a, HasSemanticVersion a, Binary a) => a -> ByteString

-- | Tagged version of <a>decode</a>
taggedDecode :: (HasStructuralInfo a, HasSemanticVersion a, Binary a) => ByteString -> a

-- | Tagged version of <a>decodeOrFail</a>
taggedDecodeOrFail :: (HasStructuralInfo a, HasSemanticVersion a, Binary a) => ByteString -> Either (ByteString, ByteOffset, String) (ByteString, ByteOffset, a)

-- | Tagged version of <a>encodeFile</a>
taggedEncodeFile :: (HasStructuralInfo a, HasSemanticVersion a, Binary a) => FilePath -> a -> IO ()

-- | Tagged version of <a>decodeFile</a>
taggedDecodeFile :: (HasStructuralInfo a, HasSemanticVersion a, Binary a) => FilePath -> IO a

-- | Tagged version of <a>decodeFileOrFail</a>
taggedDecodeFileOrFail :: (HasStructuralInfo a, HasSemanticVersion a, Binary a) => FilePath -> IO (Either (ByteOffset, String) a)

-- | Type class providing <a>StructuralInfo</a> for each data type.
--   
--   For regular non-recursive ADTs <a>HasStructuralInfo</a> can be derived
--   generically.
--   
--   <pre>
--   data Record = Record { a :: Int, b :: Bool, c :: [Char] } deriving (Generic)
--   instance hasStructuralInfo Record
--   </pre>
--   
--   For stable types, you can provide only type name
--   
--   <pre>
--   instance HasStructuralInfo Int where structuralInfo = ghcNominalType -- infer name from Generic information
--   instance HasStructuralInfo Integer where structuralInfo _ = NominalType "Integer"
--   </pre>
--   
--   Recursive type story is a bit sad atm. If the type structure is
--   stable, you can do:
--   
--   <pre>
--   instance HasStructuralInfo a =&gt; HasStructuralInfo [a] where structuralInfo = ghcStructuralInfo1
--   </pre>
class HasStructuralInfo a where structuralInfo = ghcStructuralInfo
structuralInfo :: HasStructuralInfo a => Proxy a -> StructuralInfo

-- | A helper type family for <tt>encodeTaggedFile</tt> and
--   <tt>decodeTaggedFile</tt>.
--   
--   The default definition is <tt><a>SemanticVersion</a> a = 0</tt>
class KnownNat (SemanticVersion a) => HasSemanticVersion (a :: *) where type family SemanticVersion a :: Nat SemanticVersion a = 0

-- | Type the semantic version is serialised with.
type Version = Word32

-- | Interleaving
--   
--   <pre>
--   3 | 9  .  .  .  .
--   2 | 5  8  .  .  .
--   1 | 2  4  7 11  .
--   0 | 0  1  3  6 10
--   -----------------
--       0  1  2  3  4
--   </pre>
--   
--   This can be calculated by <tt>f x y = sum ([0..x+y]) + y</tt>
type Interleave (n :: Nat) (m :: Nat) = SumUpTo (n + m) + m
type SumUpTo (n :: Nat) = Div2 (n * (n + 1))
ghcStructuralInfo :: (Generic a, All2 HasStructuralInfo (GCode a), GDatatypeInfo a, SListI2 (GCode a)) => Proxy a -> StructuralInfo
ghcNominalType :: (Generic a, GDatatypeInfo a) => Proxy a -> StructuralInfo
ghcStructuralInfo1 :: (Generic1 f, GDatatypeInfo (f a), HasStructuralInfo a) => Proxy (f a) -> StructuralInfo
sopStructuralInfo :: (Generic a, HasDatatypeInfo a, All2 HasStructuralInfo (Code a)) => Proxy a -> StructuralInfo
sopNominalType :: (Generic a, HasDatatypeInfo a) => Proxy a -> StructuralInfo
sopStructuralInfo1 :: (Generic (f a), HasDatatypeInfo (f a), HasStructuralInfo a) => Proxy (f a) -> StructuralInfo
sopStructuralInfoS :: (All2 HasStructuralInfo xss, SListI2 xss) => DatatypeInfo xss -> StructuralInfo
sopNominalTypeS :: DatatypeInfo xss -> StructuralInfo
sopStructuralInfo1S :: StructuralInfo -> DatatypeInfo xss -> StructuralInfo
structuralInfoSha1Digest :: StructuralInfo -> Digest SHA1State
structuralInfoSha1ByteStringDigest :: StructuralInfo -> ByteString
instance GHC.Generics.Constructor Data.Binary.Tagged.C1_2StructuralInfo
instance GHC.Generics.Constructor Data.Binary.Tagged.C1_1StructuralInfo
instance GHC.Generics.Constructor Data.Binary.Tagged.C1_0StructuralInfo
instance GHC.Generics.Datatype Data.Binary.Tagged.D1StructuralInfo
instance GHC.Generics.Selector Data.Binary.Tagged.S1_0_0BinaryTagged
instance GHC.Generics.Constructor Data.Binary.Tagged.C1_0BinaryTagged
instance GHC.Generics.Datatype Data.Binary.Tagged.D1BinaryTagged
instance GHC.Generics.Generic Data.Binary.Tagged.StructuralInfo
instance GHC.Show.Show Data.Binary.Tagged.StructuralInfo
instance GHC.Classes.Ord Data.Binary.Tagged.StructuralInfo
instance GHC.Classes.Eq Data.Binary.Tagged.StructuralInfo
instance forall (k :: BOX) (v :: k). GHC.Generics.Generic1 (Data.Binary.Tagged.BinaryTagged v)
instance forall (k :: BOX) (v :: k) a. GHC.Generics.Generic (Data.Binary.Tagged.BinaryTagged v a)
instance forall (k :: BOX) (v :: k). Data.Traversable.Traversable (Data.Binary.Tagged.BinaryTagged v)
instance forall (k :: BOX) (v :: k). Data.Foldable.Foldable (Data.Binary.Tagged.BinaryTagged v)
instance forall (k :: BOX) (v :: k). GHC.Base.Functor (Data.Binary.Tagged.BinaryTagged v)
instance forall (k :: BOX) (v :: k) a. GHC.Read.Read a => GHC.Read.Read (Data.Binary.Tagged.BinaryTagged v a)
instance forall (k :: BOX) (v :: k) a. GHC.Show.Show a => GHC.Show.Show (Data.Binary.Tagged.BinaryTagged v a)
instance forall (k :: BOX) (v :: k) a. GHC.Classes.Ord a => GHC.Classes.Ord (Data.Binary.Tagged.BinaryTagged v a)
instance forall (k :: BOX) (v :: k) a. GHC.Classes.Eq a => GHC.Classes.Eq (Data.Binary.Tagged.BinaryTagged v a)
instance forall (k :: BOX) (v :: k). GHC.Base.Applicative (Data.Binary.Tagged.BinaryTagged v)
instance forall (k :: BOX) (v :: k). GHC.Base.Monad (Data.Binary.Tagged.BinaryTagged v)
instance forall (k :: BOX) (v :: k) a. GHC.Base.Monoid a => GHC.Base.Monoid (Data.Binary.Tagged.BinaryTagged v a)
instance (Data.Binary.Class.Binary a, Data.Binary.Tagged.HasStructuralInfo a, GHC.TypeLits.KnownNat v) => Data.Binary.Class.Binary (Data.Binary.Tagged.BinaryTagged v a)
instance Data.Binary.Class.Binary Data.Binary.Tagged.StructuralInfo
instance Data.Binary.Tagged.HasStructuralInfo Data.Binary.Tagged.StructuralInfo
instance Data.Binary.Tagged.HasSemanticVersion Data.Binary.Tagged.StructuralInfo
instance Data.Binary.Tagged.HasStructuralInfo GHC.Types.Bool
instance Data.Binary.Tagged.HasStructuralInfo GHC.Types.Char
instance Data.Binary.Tagged.HasStructuralInfo GHC.Types.Int
instance Data.Binary.Tagged.HasStructuralInfo GHC.Types.Word
instance Data.Binary.Tagged.HasStructuralInfo GHC.Integer.Type.Integer
instance Data.Binary.Tagged.HasStructuralInfo GHC.Int.Int8
instance Data.Binary.Tagged.HasStructuralInfo GHC.Int.Int16
instance Data.Binary.Tagged.HasStructuralInfo GHC.Int.Int32
instance Data.Binary.Tagged.HasStructuralInfo GHC.Int.Int64
instance Data.Binary.Tagged.HasStructuralInfo GHC.Word.Word8
instance Data.Binary.Tagged.HasStructuralInfo GHC.Word.Word16
instance Data.Binary.Tagged.HasStructuralInfo GHC.Word.Word32
instance Data.Binary.Tagged.HasStructuralInfo GHC.Word.Word64
instance Data.Binary.Tagged.HasSemanticVersion GHC.Types.Bool
instance Data.Binary.Tagged.HasSemanticVersion GHC.Types.Char
instance Data.Binary.Tagged.HasSemanticVersion GHC.Types.Int
instance Data.Binary.Tagged.HasSemanticVersion GHC.Types.Word
instance Data.Binary.Tagged.HasSemanticVersion GHC.Integer.Type.Integer
instance Data.Binary.Tagged.HasSemanticVersion GHC.Int.Int8
instance Data.Binary.Tagged.HasSemanticVersion GHC.Int.Int16
instance Data.Binary.Tagged.HasSemanticVersion GHC.Int.Int32
instance Data.Binary.Tagged.HasSemanticVersion GHC.Int.Int64
instance Data.Binary.Tagged.HasSemanticVersion GHC.Word.Word8
instance Data.Binary.Tagged.HasSemanticVersion GHC.Word.Word16
instance Data.Binary.Tagged.HasSemanticVersion GHC.Word.Word32
instance Data.Binary.Tagged.HasSemanticVersion GHC.Word.Word64
instance Data.Binary.Tagged.HasStructuralInfo GHC.Types.Ordering
instance Data.Binary.Tagged.HasSemanticVersion GHC.Types.Ordering
instance Data.Binary.Tagged.HasStructuralInfo GHC.Types.Float
instance Data.Binary.Tagged.HasStructuralInfo GHC.Types.Double
instance Data.Binary.Tagged.HasSemanticVersion GHC.Types.Float
instance Data.Binary.Tagged.HasSemanticVersion GHC.Types.Double
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo [a]
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion [a]
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (GHC.Base.Maybe a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (GHC.Base.Maybe a)
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (GHC.Real.Ratio a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (GHC.Real.Ratio a)
instance (Data.Binary.Tagged.HasStructuralInfo a, Data.Binary.Tagged.HasStructuralInfo b) => Data.Binary.Tagged.HasStructuralInfo (Data.Either.Either a b)
instance (Data.Binary.Tagged.HasSemanticVersion a, Data.Binary.Tagged.HasSemanticVersion b, GHC.TypeLits.KnownNat (Data.Binary.Tagged.SemanticVersion (Data.Either.Either a b))) => Data.Binary.Tagged.HasSemanticVersion (Data.Either.Either a b)
instance (Data.Binary.Tagged.HasStructuralInfo a, Data.Binary.Tagged.HasStructuralInfo b) => Data.Binary.Tagged.HasStructuralInfo (a, b)
instance (Data.Binary.Tagged.HasStructuralInfo a, Data.Binary.Tagged.HasStructuralInfo b, Data.Binary.Tagged.HasStructuralInfo c) => Data.Binary.Tagged.HasStructuralInfo (a, b, c)
instance (Data.Binary.Tagged.HasStructuralInfo a, Data.Binary.Tagged.HasStructuralInfo b, Data.Binary.Tagged.HasStructuralInfo c, Data.Binary.Tagged.HasStructuralInfo d) => Data.Binary.Tagged.HasStructuralInfo (a, b, c, d)
instance (Data.Binary.Tagged.HasSemanticVersion a, Data.Binary.Tagged.HasSemanticVersion b, GHC.TypeLits.KnownNat (Data.Binary.Tagged.SemanticVersion (a, b))) => Data.Binary.Tagged.HasSemanticVersion (a, b)
instance (Data.Binary.Tagged.HasSemanticVersion a, Data.Binary.Tagged.HasSemanticVersion b, Data.Binary.Tagged.HasSemanticVersion c, GHC.TypeLits.KnownNat (Data.Binary.Tagged.SemanticVersion (a, b, c))) => Data.Binary.Tagged.HasSemanticVersion (a, b, c)
instance (Data.Binary.Tagged.HasSemanticVersion a, Data.Binary.Tagged.HasSemanticVersion b, Data.Binary.Tagged.HasSemanticVersion c, Data.Binary.Tagged.HasSemanticVersion d, GHC.TypeLits.KnownNat (Data.Binary.Tagged.SemanticVersion (a, b, c, d))) => Data.Binary.Tagged.HasSemanticVersion (a, b, c, d)
instance Data.Binary.Tagged.HasStructuralInfo ()
instance Data.Binary.Tagged.HasSemanticVersion ()
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.Fixed.Fixed a)
instance Data.Binary.Tagged.HasStructuralInfo Data.Fixed.E0
instance Data.Binary.Tagged.HasStructuralInfo Data.Fixed.E1
instance Data.Binary.Tagged.HasStructuralInfo Data.Fixed.E2
instance Data.Binary.Tagged.HasStructuralInfo Data.Fixed.E3
instance Data.Binary.Tagged.HasStructuralInfo Data.Fixed.E6
instance Data.Binary.Tagged.HasStructuralInfo Data.Fixed.E9
instance Data.Binary.Tagged.HasStructuralInfo Data.Fixed.E12
instance Data.Binary.Tagged.HasSemanticVersion (Data.Fixed.Fixed a)
instance Data.Binary.Tagged.HasStructuralInfo Data.Version.Version
instance Data.Binary.Tagged.HasSemanticVersion Data.Version.Version
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.Monoid.Sum a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.Monoid.Sum a)
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.Monoid.Product a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.Monoid.Product a)
instance Data.Binary.Tagged.HasStructuralInfo Data.ByteString.Internal.ByteString
instance Data.Binary.Tagged.HasStructuralInfo Data.ByteString.Lazy.Internal.ByteString
instance Data.Binary.Tagged.HasSemanticVersion Data.ByteString.Internal.ByteString
instance Data.Binary.Tagged.HasSemanticVersion Data.ByteString.Lazy.Internal.ByteString
instance Data.Binary.Tagged.HasStructuralInfo Data.Text.Internal.Text
instance Data.Binary.Tagged.HasStructuralInfo Data.Text.Internal.Lazy.Text
instance Data.Binary.Tagged.HasSemanticVersion Data.Text.Internal.Text
instance Data.Binary.Tagged.HasSemanticVersion Data.Text.Internal.Lazy.Text
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.IntMap.Base.IntMap a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.IntMap.Base.IntMap a)
instance Data.Binary.Tagged.HasStructuralInfo Data.IntSet.Base.IntSet
instance Data.Binary.Tagged.HasSemanticVersion Data.IntSet.Base.IntSet
instance (Data.Binary.Tagged.HasStructuralInfo k, Data.Binary.Tagged.HasStructuralInfo v) => Data.Binary.Tagged.HasStructuralInfo (Data.Map.Base.Map k v)
instance (Data.Binary.Tagged.HasSemanticVersion k, Data.Binary.Tagged.HasSemanticVersion v, GHC.TypeLits.KnownNat (Data.Binary.Tagged.SemanticVersion (Data.Map.Base.Map k v))) => Data.Binary.Tagged.HasSemanticVersion (Data.Map.Base.Map k v)
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.Sequence.Seq a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.Sequence.Seq a)
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.Set.Base.Set a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.Set.Base.Set a)
instance (Data.Binary.Tagged.HasStructuralInfo k, Data.Binary.Tagged.HasStructuralInfo v) => Data.Binary.Tagged.HasStructuralInfo (Data.HashMap.Base.HashMap k v)
instance (Data.Binary.Tagged.HasSemanticVersion k, Data.Binary.Tagged.HasSemanticVersion v, GHC.TypeLits.KnownNat (Data.Binary.Tagged.SemanticVersion (Data.HashMap.Base.HashMap k v))) => Data.Binary.Tagged.HasSemanticVersion (Data.HashMap.Base.HashMap k v)
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.HashSet.HashSet a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.HashSet.HashSet a)
instance (Data.Binary.Tagged.HasStructuralInfo i, Data.Binary.Tagged.HasStructuralInfo e) => Data.Binary.Tagged.HasStructuralInfo (GHC.Arr.Array i e)
instance (Data.Binary.Tagged.HasSemanticVersion i, Data.Binary.Tagged.HasSemanticVersion e, GHC.TypeLits.KnownNat (Data.Binary.Tagged.SemanticVersion (GHC.Arr.Array i e))) => Data.Binary.Tagged.HasSemanticVersion (GHC.Arr.Array i e)
instance (Data.Binary.Tagged.HasStructuralInfo i, Data.Binary.Tagged.HasStructuralInfo e) => Data.Binary.Tagged.HasStructuralInfo (Data.Array.Base.UArray i e)
instance (Data.Binary.Tagged.HasSemanticVersion i, Data.Binary.Tagged.HasSemanticVersion e, GHC.TypeLits.KnownNat (Data.Binary.Tagged.SemanticVersion (Data.Array.Base.UArray i e))) => Data.Binary.Tagged.HasSemanticVersion (Data.Array.Base.UArray i e)
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.Vector.Vector a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.Vector.Vector a)
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.Vector.Unboxed.Base.Vector a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.Vector.Unboxed.Base.Vector a)
instance Data.Binary.Tagged.HasStructuralInfo a => Data.Binary.Tagged.HasStructuralInfo (Data.Vector.Storable.Vector a)
instance Data.Binary.Tagged.HasSemanticVersion a => Data.Binary.Tagged.HasSemanticVersion (Data.Vector.Storable.Vector a)
instance Data.Binary.Tagged.HasStructuralInfo Data.Time.Clock.UTC.UTCTime
instance Data.Binary.Tagged.HasStructuralInfo Data.Time.Clock.Scale.DiffTime
instance Data.Binary.Tagged.HasStructuralInfo Data.Time.Clock.Scale.UniversalTime
instance Data.Binary.Tagged.HasStructuralInfo Data.Time.Clock.UTC.NominalDiffTime
instance Data.Binary.Tagged.HasStructuralInfo Data.Time.Calendar.Days.Day
instance Data.Binary.Tagged.HasStructuralInfo Data.Time.LocalTime.TimeZone.TimeZone
instance Data.Binary.Tagged.HasStructuralInfo Data.Time.LocalTime.TimeOfDay.TimeOfDay
instance Data.Binary.Tagged.HasStructuralInfo Data.Time.LocalTime.LocalTime.LocalTime
instance Data.Binary.Tagged.HasSemanticVersion Data.Time.Clock.UTC.UTCTime
instance Data.Binary.Tagged.HasSemanticVersion Data.Time.Clock.Scale.DiffTime
instance Data.Binary.Tagged.HasSemanticVersion Data.Time.Clock.Scale.UniversalTime
instance Data.Binary.Tagged.HasSemanticVersion Data.Time.Clock.UTC.NominalDiffTime
instance Data.Binary.Tagged.HasSemanticVersion Data.Time.Calendar.Days.Day
instance Data.Binary.Tagged.HasSemanticVersion Data.Time.LocalTime.TimeZone.TimeZone
instance Data.Binary.Tagged.HasSemanticVersion Data.Time.LocalTime.TimeOfDay.TimeOfDay
instance Data.Binary.Tagged.HasSemanticVersion Data.Time.LocalTime.LocalTime.LocalTime
instance Data.Binary.Tagged.HasStructuralInfo Data.Aeson.Types.Internal.Value
instance Data.Binary.Tagged.HasSemanticVersion Data.Aeson.Types.Internal.Value
