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