-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Combinators and utilities to make Generic-based deriving of Binary easier and more expressive -- -- Please see the README on GitHub at -- https://github.com/0xd34df00d/binary-generic-combinators#readme @package binary-generic-combinators @version 0.4.3.0 -- | This module defines a bunch of types to be used as fields of records -- with Generic-based deriving of Binary instances. For -- example: -- --
-- data MyFileFormat = MyFileFormat
-- { header :: MatchBytes "my format header" '[ 0xd3, 0x4d, 0xf0, 0x0d ]
-- , slack :: SkipByte 0xff
-- , reserved :: SkipCount Word8 4
-- , subElements :: Some MyElement
-- } deriving (Generic, Binary)
--
module Data.Binary.Combinators
-- | Zero or more elements of a, parsing as long as the parser for
-- a succeeds.
--
-- Many Word8 will consume all your input!
newtype Many a
Many :: [a] -> Many a
[getMany] :: Many a -> [a]
-- | One or more elements of a, parsing as long as the parser for
-- a succeeds.
--
-- Some Word8 will consume all your non-empty input!
newtype Some a
Some :: [a] -> Some a
[getSome] :: Some a -> [a]
-- | First, parse the elements count as type ty. Then, parse
-- exactly as many elements of type a.
newtype CountedBy ty a
CountedBy :: [a] -> CountedBy ty a
[getCounted] :: CountedBy ty a -> [a]
-- | Parse out and skip n elements of type ty.
--
-- Serializing this type produces no bytes.
data SkipCount ty (n :: Nat)
SkipCount :: SkipCount ty (n :: Nat)
-- | Skip any number of bytes with value n.
--
-- Serializing this type produces no bytes.
data SkipByte (n :: Nat)
SkipByte :: SkipByte (n :: Nat)
-- | MatchBytes str bytes ensures that the subsequent bytes in the
-- input stream are the same as bytes.
--
-- str can be used to denote the context in which
-- MatchBytes is used for better parse failure messages. For
-- example, MatchBytes "my format header" '[ 0xd3, 0x4d, 0xf0, 0x0d
-- ] consumes four bytes from the input stream if they are equal to
-- [ 0xd3, 0x4d, 0xf0, 0x0d ] respectively, or fails otherwise.
--
-- Serializing this type produces the bytes.
data MatchBytes (ctx :: Symbol) (bytes :: [Nat]) :: Type
-- | Produce the (singleton) value of type MatchBytes ctx
-- ns.
matchBytes :: MatchBytesSing ctx ns => MatchBytes ctx ns
-- | An alias for MatchBytes when you only need to match a single
-- byte.
type MatchByte ctx byte = MatchBytes ctx '[byte]
-- | An a serialized in little endian byte order.
--
-- By default, Binary serializes things in big endian byte
-- order. Use this wrapper to get little endian-based serialization.
newtype LE a
LE :: a -> LE a
[getLE] :: LE a -> a
instance Data.Traversable.Traversable Data.Binary.Combinators.Many
instance Data.Foldable.Foldable Data.Binary.Combinators.Many
instance GHC.Base.Functor Data.Binary.Combinators.Many
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Binary.Combinators.Many a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Binary.Combinators.Many a)
instance Data.Traversable.Traversable Data.Binary.Combinators.Some
instance Data.Foldable.Foldable Data.Binary.Combinators.Some
instance GHC.Base.Functor Data.Binary.Combinators.Some
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Binary.Combinators.Some a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Binary.Combinators.Some a)
instance forall k (ty :: k). Data.Traversable.Traversable (Data.Binary.Combinators.CountedBy ty)
instance forall k (ty :: k). Data.Foldable.Foldable (Data.Binary.Combinators.CountedBy ty)
instance forall k (ty :: k). GHC.Base.Functor (Data.Binary.Combinators.CountedBy ty)
instance forall k (ty :: k) a. GHC.Classes.Ord a => GHC.Classes.Ord (Data.Binary.Combinators.CountedBy ty a)
instance forall k (ty :: k) a. GHC.Classes.Eq a => GHC.Classes.Eq (Data.Binary.Combinators.CountedBy ty a)
instance forall k (ty :: k) (n :: GHC.Types.Nat). GHC.Show.Show (Data.Binary.Combinators.SkipCount ty n)
instance forall k (ty :: k) (n :: GHC.Types.Nat). GHC.Classes.Ord (Data.Binary.Combinators.SkipCount ty n)
instance forall k (ty :: k) (n :: GHC.Types.Nat). GHC.Classes.Eq (Data.Binary.Combinators.SkipCount ty n)
instance GHC.Show.Show (Data.Binary.Combinators.SkipByte n)
instance GHC.Classes.Ord (Data.Binary.Combinators.SkipByte n)
instance GHC.Classes.Eq (Data.Binary.Combinators.SkipByte n)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Binary.Combinators.LE a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Binary.Combinators.LE a)
instance GHC.Classes.Eq (Data.Binary.Combinators.MatchBytes s ns)
instance GHC.Classes.Ord (Data.Binary.Combinators.MatchBytes s ns)
instance GHC.Show.Show a => GHC.Show.Show (Data.Binary.Combinators.LE a)
instance Test.QuickCheck.Arbitrary.Arbitrary a => Test.QuickCheck.Arbitrary.Arbitrary (Data.Binary.Combinators.LE a)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.LE GHC.Word.Word16)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.LE GHC.Word.Word32)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.LE GHC.Word.Word64)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.LE GHC.Int.Int16)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.LE GHC.Int.Int32)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.LE GHC.Int.Int64)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.LE GHC.Types.Float)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.LE GHC.Types.Double)
instance Data.Binary.Combinators.MatchBytesSing ctx '[]
instance (GHC.TypeNats.KnownNat n, Data.Binary.Combinators.MatchBytesSing ctx ns) => Data.Binary.Combinators.MatchBytesSing ctx (n : ns)
instance Data.Binary.Combinators.MatchBytesSing ctx ns => Test.QuickCheck.Arbitrary.Arbitrary (Data.Binary.Combinators.MatchBytes ctx ns)
instance Data.Binary.Class.Binary (Data.Binary.Combinators.MatchBytes ctx '[])
instance (GHC.TypeLits.KnownSymbol ctx, GHC.TypeNats.KnownNat n, Data.Binary.Class.Binary (Data.Binary.Combinators.MatchBytes ctx ns)) => Data.Binary.Class.Binary (Data.Binary.Combinators.MatchBytes ctx (n : ns))
instance GHC.Show.Show (Data.Binary.Combinators.MatchBytes ctx ns)
instance GHC.TypeNats.KnownNat n => Data.Binary.Class.Binary (Data.Binary.Combinators.SkipByte n)
instance Test.QuickCheck.Arbitrary.Arbitrary (Data.Binary.Combinators.SkipByte n)
instance (GHC.Num.Num ty, Data.Binary.Class.Binary ty, GHC.TypeNats.KnownNat n) => Data.Binary.Class.Binary (Data.Binary.Combinators.SkipCount ty n)
instance forall k (ty :: k) (n :: GHC.Types.Nat). Test.QuickCheck.Arbitrary.Arbitrary (Data.Binary.Combinators.SkipCount ty n)
instance forall k a (ty :: k). GHC.Show.Show a => GHC.Show.Show (Data.Binary.Combinators.CountedBy ty a)
instance (GHC.Real.Integral ty, Data.Binary.Class.Binary ty, Data.Binary.Class.Binary a) => Data.Binary.Class.Binary (Data.Binary.Combinators.CountedBy ty a)
instance forall k a (ty :: k). Test.QuickCheck.Arbitrary.Arbitrary a => Test.QuickCheck.Arbitrary.Arbitrary (Data.Binary.Combinators.CountedBy ty a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Binary.Combinators.Some a)
instance Data.Binary.Class.Binary a => Data.Binary.Class.Binary (Data.Binary.Combinators.Some a)
instance Test.QuickCheck.Arbitrary.Arbitrary a => Test.QuickCheck.Arbitrary.Arbitrary (Data.Binary.Combinators.Some a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Binary.Combinators.Many a)
instance Data.Binary.Class.Binary a => Data.Binary.Class.Binary (Data.Binary.Combinators.Many a)
instance Test.QuickCheck.Arbitrary.Arbitrary a => Test.QuickCheck.Arbitrary.Arbitrary (Data.Binary.Combinators.Many a)
-- | This module defines some types to be used with DerivingVia
-- when deriving Binary instances.
module Data.Binary.DerivingVia
-- | Try to deserialize each constructor of a in order.
--
-- For sum types, stock Binary writes (and expects to read) an
-- integer denoting the index of the constructor. This isn't always
-- what's needed. In the following example, the constructor is uniquely
-- identified by the marker byte, and its index in the Haskell ADT is
-- irrelevant:
--
-- -- data JfifSegment -- = App0Segment (MatchByte "app0 segment" 0xe0, JfifApp0) -- | DqtSegment (MatchByte "dqt segment" 0xdb, QuantTable) -- | SofSegment (MatchByte "sof segment" 0xc0, SofInfo) -- | DhtSegment (MatchByte "dht segment" 0xc4, HuffmanTable) -- | DriSegment (MatchByte "dri segment" 0xdd, RestartInterval) -- | SosSegment (MatchByte "sos segment" 0xda, SosImage) -- | UnknownSegment RawSegment -- deriving Generic -- deriving Binary via Alternatively JfifSegment --newtype Alternatively a Alternatively :: a -> Alternatively a [getAlt] :: Alternatively a -> a instance Data.Binary.Class.Binary grecord => Data.Binary.DerivingVia.GAltBinary (GHC.Generics.K1 i grecord) instance Data.Binary.DerivingVia.GAltBinary grecord => Data.Binary.DerivingVia.GAltBinary (GHC.Generics.M1 i t grecord) instance (Data.Binary.DerivingVia.GAltBinary l, Data.Binary.DerivingVia.GAltBinary r) => Data.Binary.DerivingVia.GAltBinary (l GHC.Generics.:*: r) instance (Data.Binary.DerivingVia.GAltBinary l, Data.Binary.DerivingVia.GAltBinary r) => Data.Binary.DerivingVia.GAltBinary (l GHC.Generics.:+: r) instance (GHC.Generics.Generic a, Data.Binary.DerivingVia.GAltBinary (GHC.Generics.Rep a)) => Data.Binary.Class.Binary (Data.Binary.DerivingVia.Alternatively a)