diff --git a/rauhala.info/projects/2021-01-21-bidirectional.md b/rauhala.info/projects/2021-01-21-bidirectional.md new file mode 100644 index 0000000..63ab210 --- /dev/null +++ b/rauhala.info/projects/2021-01-21-bidirectional.md @@ -0,0 +1,37 @@ +--- +title: bidirectional +github: https://github.com/MasseR/bidirectional +issues: https://github.com/MasseR/bidirectional/issues +badge: https://github.com/MasseR/bidirectional/workflows/Test/badge.svg +--- + +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 +```