module Toml.Codec.Di
( dimap
, dioptional
, diwrap
, dimatch
, (.=)
) where
import Control.Applicative (Alternative (..))
import Data.Coerce (Coercible, coerce)
import Toml.Codec.Types (Codec (..), TomlCodec, (<!>))
dimap
:: (b -> a)
-> (a -> b)
-> TomlCodec a
-> TomlCodec b
dimap :: forall b a. (b -> a) -> (a -> b) -> TomlCodec a -> TomlCodec b
dimap b -> a
f a -> b
g TomlCodec a
codec = Codec
{ codecRead :: TomlEnv b
codecRead = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i o. Codec i o -> TomlEnv o
codecRead TomlCodec a
codec
, codecWrite :: b -> TomlState b
codecWrite = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i o. Codec i o -> i -> TomlState o
codecWrite TomlCodec a
codec forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> a
f
}
{-# INLINE dimap #-}
dioptional
:: TomlCodec a
-> TomlCodec (Maybe a)
dioptional :: forall a. TomlCodec a -> TomlCodec (Maybe a)
dioptional Codec{a -> TomlState a
TomlEnv a
codecWrite :: a -> TomlState a
codecRead :: TomlEnv a
codecWrite :: forall i o. Codec i o -> i -> TomlState o
codecRead :: forall i o. Codec i o -> TomlEnv o
..} = Codec
{ codecRead :: TomlEnv (Maybe a)
codecRead = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. TomlEnv a
codecRead forall (f :: * -> *) a x.
Alternative f =>
(a -> f x) -> (a -> f x) -> a -> f x
<!> \TOML
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing
, codecWrite :: Maybe a -> TomlState (Maybe a)
codecWrite = forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> TomlState a
codecWrite
}
{-# INLINE dioptional #-}
diwrap
:: forall b a .
(Coercible a b)
=> TomlCodec a
-> TomlCodec b
diwrap :: forall b a. Coercible a b => TomlCodec a -> TomlCodec b
diwrap = coerce :: forall a b. Coercible a b => a -> b
coerce
{-# INLINE diwrap #-}
dimatch
:: (b -> Maybe a)
-> (a -> b)
-> TomlCodec a
-> TomlCodec b
dimatch :: forall b a.
(b -> Maybe a) -> (a -> b) -> TomlCodec a -> TomlCodec b
dimatch b -> Maybe a
match a -> b
ctor TomlCodec a
codec = Codec
{ codecRead :: TomlEnv b
codecRead = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
ctor forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i o. Codec i o -> TomlEnv o
codecRead TomlCodec a
codec
, codecWrite :: b -> TomlState b
codecWrite = \b
c -> case b -> Maybe a
match b
c of
Maybe a
Nothing -> forall (f :: * -> *) a. Alternative f => f a
empty
Just a
d -> a -> b
ctor forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall i o. Codec i o -> i -> TomlState o
codecWrite TomlCodec a
codec a
d
}
{-# INLINE dimatch #-}
infixl 5 .=
(.=) :: Codec field a -> (object -> field) -> Codec object a
Codec field a
codec .= :: forall field a object.
Codec field a -> (object -> field) -> Codec object a
.= object -> field
getter = Codec field a
codec { codecWrite :: object -> TomlState a
codecWrite = forall i o. Codec i o -> i -> TomlState o
codecWrite Codec field a
codec forall b c a. (b -> c) -> (a -> b) -> a -> c
. object -> field
getter }
{-# INLINE (.=) #-}