codec: First-class record construction and bidirectional serialization

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

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.


userCodec :: JSONCodec User
userCodec = obj "user object" $
  $>> 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 $
    $>> 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


timeSpecCodec :: ForeignCodec TimeSpec
timeSpecCodec =
    $>> 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.


Versions 0.1, 0.1, 0.1.1, 0.2, 0.2.1
Change log None available
Dependencies aeson (>=, base (>=4.6 && <4.9), binary (>=0.7), binary-bits (>=0.5), bytestring (>=0.10), data-default-class (>=0.0.1), mtl (>=2.2.1), template-haskell (>=2.8), text (>=, transformers (>=, unordered-containers (>= [details]
License BSD-3-Clause
Author Patrick Chilton
Category Data
Home page
Source repo head: git clone
Uploaded by PatrickChilton at 2015-06-02T13:49:33Z



Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees