@hackage codec0.1
First-class record construction and bidirectional serialization
Categories
License
BSD-3-Clause
Maintainer
chpatrick@gmail.com
Links
Versions
Installation
Dependencies (11)
- base >=4.6 && <4.9
- binary >=0.7
- bytestring >=0.10
- mtl >=2.2.1
- template-haskell >=2.8
- text >=1.2.0.4 Show all…
Dependents (1)
@hackage/acme-everything
Tired of writing complementary parseJSON
/toJSON
, peek
/poke
or
Binary get
/put
functions?
codec
provides easy bidirectional serialization of plain Haskell
records in any Applicative context. All you need to do is provide a
de/serializer for every record field in any order you like, and you get
a de/serializer for the whole structure. The type system ensures that
you provide every record exactly once. It also includes a library for
general record construction in an Applicative context, of which creating
codecs is just one application.
JSON!
userCodec :: JSONCodec User userCodec = obj "user object" $ User $>> f_username >-< "user" >>> f_userEmail >-< "email" >>> f_userLanguages >-< "languages" >>> f_userReferrer >-< opt "referrer" instance FromJSON User where parseJSON = parseVal userCodec instance ToJSON User where toJSON = produceVal userCodec
Bit fields!
ipv4Codec :: BinaryCodec IPv4 ipv4Codec = toBytes $ IPv4 $>> f_version >-< word8 4 >>> f_ihl >-< word8 4 >>> f_dscp >-< word8 6 >>> f_ecn >-< word8 2 >>> f_totalLength >-< word16be 16 >>> f_identification >-< word16be 16 >>> f_flags >-< word8 3 >>> f_fragmentOffset >-< word16be 13 >>> f_timeToLive >-< word8 8 >>> f_protocol >-< word8 8 >>> f_headerChecksum >-< word16be 16 >>> f_sourceIP >-< word32be 32 >>> f_destIP >-< word32be 32 instance Binary IPv4 where get = parse ipv4Codec put = produce ipv4Codec
Storable!
timeSpecCodec :: ForeignCodec TimeSpec timeSpecCodec = TimeSpec $>> f_seconds >-< field (#offset struct timespec, tv_sec) cInt >>> f_nanoseconds >-< field (#offset struct timespec, tv_nsec) cInt instance Storable TimeSpec where peek = peekWith timeSpecCodec poke = pokeWith timeSpecCodec ...
All of these examples use the same types and logic for constructing Codecs, and it's very easy to create Codecs for any parsing/serialization library.
See Data.Codec
for an introduction.