codec-0.1.1: codec.cabal
name: codec
version: 0.1.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.Field,
Data.Codec.Codec,
Data.Codec.TH,
Data.Codec.Tuple,
Data.Codec.Testing,
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