name: codec version: 0.1 license: BSD3 license-file: LICENSE synopsis: First-class record construction and bidirectional serialization description: 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. author: Patrick Chilton maintainer: chpatrick@gmail.com -- copyright: category: Data build-type: Simple -- extra-source-files: cabal-version: >=1.10 homepage: https://github.com/chpatrick/codec source-repository head type: git location: https://github.com/chpatrick/codec.git library exposed-modules: Data.Codec, Data.Codec.Testing, Control.Lens.Codec, Data.Aeson.Codec, Data.Binary.Codec, Data.Binary.Bits.Codec, Foreign.Codec -- other-modules: default-extensions: TemplateHaskell, MultiParamTypeClasses, FlexibleContexts, FlexibleInstances, LambdaCase, FunctionalDependencies, DeriveFunctor, ScopedTypeVariables build-depends: base >=4.6 && < 4.9, bytestring >=0.10, binary >=0.7, binary-bits >=0.5, template-haskell >=2.8, mtl >= 2.2.1, aeson >= 0.8.0.2, text >= 1.2.0.4, unordered-containers >= 0.2.5.1, data-default-class >= 0.0.1, transformers >= 0.4.2.0 -- hs-source-dirs: default-language: Haskell2010 ghc-options: -Wall -fno-warn-orphans test-suite Examples default-language: Haskell2010 type: exitcode-stdio-1.0 main-is: TestExamples.hs other-modules: Examples.Foreign, Examples.IP, Examples.JSON, Examples.Multi, Examples.Tar build-depends: base >=4.6, bytestring >=0.10, binary >=0.7, binary-bits >=0.5, template-haskell >=2.8, mtl >= 2.2.1, aeson >= 0.8.0.2, text >= 1.2.0.4, unordered-containers >= 0.2.5.1, data-default-class >= 0.0.1, transformers >= 0.4.2.0 default-extensions: TemplateHaskell, MultiParamTypeClasses, FlexibleInstances, DeriveFunctor, FunctionalDependencies, LambdaCase, ScopedTypeVariables