-- 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.2.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]
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.Eq (Data.Binary.Combinators.MatchBytes s ns)
instance GHC.Classes.Ord (Data.Binary.Combinators.MatchBytes s ns)
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" 0xdb, 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)