37 lines
748 B
Markdown
37 lines
748 B
Markdown
|
---
|
||
|
title: bidirectional
|
||
|
github: https://github.com/MasseR/bidirectional
|
||
|
issues: https://github.com/MasseR/bidirectional/issues
|
||
|
---
|
||
|
|
||
|
Bidirectional serialization based on Lysxia's post on [Monadic profunctors for bidirectional programming](https://blog.poisson.chat/posts/2017-01-01-monadic-profunctors.html).
|
||
|
|
||
|
|
||
|
Let's assume we have a parser like the following
|
||
|
|
||
|
``` haskell
|
||
|
int :: Parser (ReaderT String Maybe) (Writer [Int]) Int Int
|
||
|
int = parser (ReaderT readMaybe) (\x -> x <$ tell [show x])
|
||
|
```
|
||
|
|
||
|
Then you can use the parser for parsing:
|
||
|
|
||
|
```
|
||
|
> runReaderT (decode int) "3"
|
||
|
Just 3
|
||
|
```
|
||
|
|
||
|
Or for encoding:
|
||
|
|
||
|
```
|
||
|
> execWriter (encode int 3)
|
||
|
["3"]
|
||
|
```
|
||
|
|
||
|
Or combine both of them
|
||
|
|
||
|
```
|
||
|
> runReaderT (decode int) $ head $ execWriter $ encode int 3
|
||
|
Just 3
|
||
|
```
|