| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Toml.Bi.Monad
Description
Contains general underlying monad for bidirectional TOML converion.
Documentation
data Bijection r w c a Source #
Monad for bidirectional Toml conversion. Contains pair of functions:
- How to read value of type
afrom immutable environment contextr? - How to store value of type
ain stateful contextw?
In practice instead of r we will use some Reader Toml and instead of w we will
use State Toml. This approach with the bunch of utility functions allows to
have single description for from/to Toml conversion.
In practice this type will always be used in the following way:
typeBir w a =Bijectionr w a a
Type parameter c if fictional. Here some trick is used. This trick is
implemented in codec and
described in more details in related blog post.
Constructors
| Bijection | |
Instances
| (Monad r, Monad w) => Monad (Bijection r w c) Source # | |
| (Functor r, Functor w) => Functor (Bijection r w c) Source # | |
| (Applicative r, Applicative w) => Applicative (Bijection r w c) Source # | |
Defined in Toml.Bi.Monad Methods pure :: a -> Bijection r w c a # (<*>) :: Bijection r w c (a -> b) -> Bijection r w c a -> Bijection r w c b # liftA2 :: (a -> b -> c0) -> Bijection r w c a -> Bijection r w c b -> Bijection r w c c0 # (*>) :: Bijection r w c a -> Bijection r w c b -> Bijection r w c b # (<*) :: Bijection r w c a -> Bijection r w c b -> Bijection r w c a # | |
| (Alternative r, Alternative w) => Alternative (Bijection r w c) Source # | |
| (MonadPlus r, MonadPlus w) => MonadPlus (Bijection r w c) Source # | |
type Bi r w a = Bijection r w a a Source #
Specialized version of Bijection data type. This type alias is used in practice.
Arguments
| :: (Functor r, Functor w) | |
| => (c -> d) | Mapper for consumer |
| -> (a -> b) | Mapper for producer |
| -> Bijection r w d a | Source |
| -> Bijection r w c b |
This is an instance of Profunctor for Bijection. But since there's no
Profunctor type class in base or package with no dependencies (and we don't
want to bring extra dependencies) this instance is implemented as a single
top-level function.
Useful when you want to parse newtypes. For example, if you had data type like this:
data Example = Example
{ foo :: Bool
, bar :: Text
}
toml bidirectional converter for this type will look like this:
exampleT :: BiToml Example
exampleT = Example
$ bool "foo" .= foo
* str "bar" .= bar
Now if you change your time in the following way:
newtype Email = Email { unEmail :: Text }
data Example = Example
{ foo :: Bool
, bar :: Email
}
you need to patch your toml parser like this:
exampleT :: BiToml Example
exampleT = Example
$ bool "foo" .= foo
* dimap unEmail Email (str "bar") .= bar