Safe Haskell | None |
---|
The Codec monad provides functions for encoding and decoding
complex data structures with unique integer numbers. In the
simplest case the entire sturecture can be transformed to unique
atom (see example1
below). When it is not sufficient to encode
the input object with one codec, more complex codec structure can
be used (see example2
below). In order to simplify codec
manipulations the library relies on a lens
package which provides
lenses for typical data types.
Example:
example1 = evalCodec empty $ do let xs = "abcabd" ys <- mapM (encode id) xs zs <- mapM (decode id) ys return $ zip zs ys
>>>
example1
>>>
[('a',0),('b',1),('c',2),('a',0),('b',1),('d',3)]
example2 = evalCodec (empty, empty) $ do let xs = zip "abcabd" [1, 34342, 5435, 34342, 124, 1] ys <- forM xs $ \(x, y) -> (,) <$> encode _1 x <*> encode _2 y zs <- forM ys $ \(i, j) -> (,) <$> decode _1 i <*> decode _2 j return (zs, ys)
>>>
fst example2
>>>
[('a',1),('b',34342),('c',5435),('a',34342),('b',124),('d',1)]
>>>
snd example2
>>>
[(0,0),(1,1),(2,2),(0,1),(1,3),(3,0)]
- data Codec c a
- data AtomCodec a = AtomCodec {}
- empty :: AtomCodec a
- type AtomLens c a = Simple Lens c (AtomCodec a)
- maybeEncode :: Ord a => AtomLens c a -> a -> Codec c (Maybe Int)
- encode :: Ord a => AtomLens c a -> a -> Codec c Int
- encode' :: Ord a => AtomLens c a -> a -> Codec c Int
- maybeDecode :: Ord a => AtomLens c a -> Int -> Codec c (Maybe a)
- decode :: Ord a => AtomLens c a -> Int -> Codec c a
- runCodec :: c -> Codec c a -> (a, c)
- evalCodec :: c -> Codec c a -> a
- execCodec :: c -> Codec c a -> c
Documentation
A Codec monad preserves mappings between objects and respective codec components.
Atomic Codec component, which represents to and fro mapping
between a
objects and unique intergers.
type AtomLens c a = Simple Lens c (AtomCodec a)Source
Just a type synonym for a lens between codec and codec component.
maybeEncode :: Ord a => AtomLens c a -> a -> Codec c (Maybe Int)Source
Encode the object with codec component identified by the lens. Return Nothing if the object is not present in the atomic codec component.
encode :: Ord a => AtomLens c a -> a -> Codec c IntSource
Encode the object with codec component identified by the lens.
encode' :: Ord a => AtomLens c a -> a -> Codec c IntSource
Version of encode which doesn't update the return componenent of the atom codec. It is useful when we know that particular value (e.g. value of a condition observation) won't be decoded afterwards so there is no need to store it and waste memory.
maybeDecode :: Ord a => AtomLens c a -> Int -> Codec c (Maybe a)Source
Decode the number with codec component identified by the lens. Return Nothing if the object is not present in the atomic codec component.
decode :: Ord a => AtomLens c a -> Int -> Codec c aSource
Decode the number with codec component identified by the lens. Report error when the number is not present in the codec component.
runCodec :: c -> Codec c a -> (a, c)Source
Run the Codec monad with the initial codec value. Return both the result and the final codec state. The obtained codec can be used next to perform subsequent decoding or encoding.