structured-0.1: src/Data/Structured.hs
-- |
--
-- Copyright: (c) 2019-2020 Oleg Grenrus
--
-- Structurally tag data.
--
-- See @binary-tagged@ package taking use of this.
-- Useful when most 'Binary' instances are 'Generic' derived.
--
-- Say you have a data type
--
-- @
-- data Record = Record
-- { _recordFields :: HM.HashMap Text (Integer, ByteString)
-- , _recordEnabled :: Bool
-- }
-- deriving (Eq, Show, Generic)
--
-- instance Binary Record
-- instance 'Structured' Record
-- @
--
-- then you can serialise and deserialise @Record@ values with a structure tag by simply
--
-- @
-- 'structuredEncode' record :: LBS.ByteString
-- 'structuredDecode' lbs :: Either String Record
-- @
--
-- If structure of @Record@ changes in between, deserialisation will fail early.
--
-- Technically, 'Structured' is not related to 'Binary', and may
-- be useful in other ways.
--
module Data.Structured (
-- * Structured class
Structured (structure),
structureHash,
structureBuilder,
genericStructure,
GStructured,
nominalStructure,
containerStructure,
-- * Structure type
Structure (..),
TypeName,
ConstructorName,
TypeVersion,
SopStructure,
hashStructure,
typeVersion,
typeName,
-- * MD5
MD5,
showMD5,
md5,
md5FromInteger,
) where
import Data.Structured.Internal
import Data.Structured.MD5