codec-0.1.1: First-class record construction and bidirectional serialization

Safe HaskellNone
LanguageHaskell2010

Data.Codec.Codec

Contents

Synopsis

Codecs

data Codec' fr fw w r Source

De/serializer for the given types. Usually w ~ r, but they are separate to allow for an Applicative instance.

Constructors

Codec 

Fields

parse :: fr r
 
produce :: w -> fw ()
 

Instances

(ToJSON a, FromJSON a) => IsString (ObjectCodec a) 
(ToJSON a, FromJSON a) => Default (JSONCodec a) 
Functor fr => Functor (Codec' fr fw w) 
(Applicative fw, Applicative fr) => Applicative (Codec' fr fw w) 

type Codec fr fw a = Codec' fr fw a a Source

De/serializer for a.

(>-<) :: Functor fr => Field r a x y -> Codec fr fw a -> Build r (Codec' fr fw r) x y Source

Associate a Field with a Codec to create a Codec Build.

Concrete codecs

type ConcreteCodec b f a = Codec (ReaderT b f) (Const b) a Source

A codec where a can be produced from a concrete value of b in context f, and a concrete type of value b can always be produced.

concrete :: (b -> f a) -> (a -> b) -> ConcreteCodec b f a Source

Create a concrete codec from a reader and a writer.

parseVal :: ConcreteCodec b f a -> b -> f a Source

Parse a concrete value with a given ConcreteCodec.

produceVal :: ConcreteCodec b f a -> a -> b Source

Produce a concrete value with a given ConcreteCodec.

Partial codecs

Partial codecs are useful for creating codecs for types with multiple constructors. See examples/Multi.hs.

type PartialCodec fr fw a = Codec fr (Compose Maybe fw) a Source

A codec that can only serialize a subset of values.

cbuild :: (Functor fr, Buildable r y) => Con r x -> Build r (Codec' fr fw r) x y -> PartialCodec fr fw r Source

Finish a codec construction with a Con r to produce a PartialCodec. This will check that the given record has the appropriate constructor before serializing.

assume :: (a -> Bool) -> Codec fr fw a -> PartialCodec fr fw a Source

Guard a Codec with a predicate to create a PartialCodec.

covered :: PartialCodec fr fw a -> Codec fr fw a Source

Convert a PartialCodec into a Codec, throwing an error on values it cannot serialize.

(<->) :: Alternative fr => PartialCodec fr fw a -> PartialCodec fr fw a -> PartialCodec fr fw a Source

Combine alternative PartialCodecs.

produceMaybe :: PartialCodec fr fw a -> a -> Maybe (fw ()) Source

Attempt to get a serialization for a given value.

Codec combinators

opt :: (Alternative fr, Applicative fw) => Codec fr fw a -> Codec fr fw (Maybe a) Source

Given a Codec for a, make one for Maybe a that applies its deserializer optionally and does nothing when serializing Nothing.

mapCodec :: Functor fr => (a -> b) -> (b -> a) -> Codec fr fw a -> Codec fr fw b Source

Turn a Codec a into a Codec b by providing an isomorphism.

mapCodecF :: (fr a -> gr a) -> (fw () -> gw ()) -> Codec fr fw a -> Codec gr gw a Source

Map the contexts of a given Codec.

mapCodecM :: (Monad fr, Monad fw) => (a -> fr b) -> (b -> fw a) -> Codec fr fw a -> Codec fr fw b Source

Map a field codec monadically. Useful for error handling but care must be taken to make sure that the results are still complementary.