{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UnicodeSyntax #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
module Configuration.Utils.Internal
(
lens
, over
, set
, view
, Lens'
, Lens
, Iso'
, Iso
, iso
, (&)
, (<&>)
, sshow
, exceptT
, errorT
) where
import Control.Applicative (Const(..))
import Control.Monad
import Control.Monad.Reader.Class
import Control.Monad.Except
import Data.Function ((&))
import Data.Functor ((<&>))
import Data.Functor.Identity
import Data.Monoid.Unicode
import Data.Profunctor
import Data.Profunctor.Unsafe
import Data.String
import qualified Data.Text as T
import Prelude.Unicode
type Lens s t a b = ∀ f . Functor f ⇒ (a → f b) → s → f t
type Lens' s a = Lens s s a a
lens ∷ (s → a) → (s → b → t) → Lens s t a b
lens :: forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens s -> a
getter s -> b -> t
setter a -> f b
lGetter s
s = s -> b -> t
setter s
s forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` a -> f b
lGetter (s -> a
getter s
s)
{-# INLINE lens #-}
over ∷ ((a → Identity b) → s → Identity t) → (a → b) → s → t
over :: forall a b s t.
((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
over (a -> Identity b) -> s -> Identity t
s a -> b
f = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Identity b) -> s -> Identity t
s (forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f)
{-# INLINE over #-}
set ∷ ((a → Identity b) → s → Identity t) → b → s → t
set :: forall a b s t.
((a -> Identity b) -> s -> Identity t) -> b -> s -> t
set (a -> Identity b) -> s -> Identity t
s b
a = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Identity b) -> s -> Identity t
s (forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall a. a -> Identity a
Identity b
a)
{-# INLINE set #-}
view ∷ MonadReader r m ⇒ ((a → Const a a) → r → Const a r) → m a
view :: forall r (m :: * -> *) a.
MonadReader r m =>
((a -> Const a a) -> r -> Const a r) -> m a
view (a -> Const a a) -> r -> Const a r
l = forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks (forall {k} a (b :: k). Const a b -> a
getConst forall (p :: * -> * -> *) a b c (q :: * -> * -> *).
(Profunctor p, Coercible c b) =>
q b c -> p a b -> p a c
#. (a -> Const a a) -> r -> Const a r
l forall {k} a (b :: k). a -> Const a b
Const)
{-# INLINE view #-}
type Iso s t a b = ∀ p f . (Profunctor p, Functor f) ⇒ p a (f b) → p s (f t)
type Iso' s a = Iso s s a a
iso ∷ (s → a) → (b → t) → Iso s t a b
iso :: forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso s -> a
f b -> t
g = forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap s -> a
f (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> t
g)
{-# INLINE iso #-}
sshow
∷ (Show a, IsString s)
⇒ a
→ s
sshow :: forall a s. (Show a, IsString s) => a -> s
sshow = forall a. IsString a => String -> a
fromString forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ forall a. Show a => a -> String
show
{-# INLINE sshow #-}
exceptT
∷ Monad m
⇒ (e → m b)
→ (a → m b)
→ ExceptT e m a
→ m b
exceptT :: forall (m :: * -> *) e b a.
Monad m =>
(e -> m b) -> (a -> m b) -> ExceptT e m a -> m b
exceptT e -> m b
a a -> m b
b = forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either e -> m b
a a -> m b
b
{-# INLINE exceptT #-}
errorT
∷ Monad m
⇒ ExceptT T.Text m a
→ m a
errorT :: forall (m :: * -> *) a. Monad m => ExceptT Text m a -> m a
errorT = forall (m :: * -> *) e b a.
Monad m =>
(e -> m b) -> (a -> m b) -> ExceptT e m a -> m b
exceptT (\Text
e → forall a. HasCallStack => String -> a
error forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ Text -> String
T.unpack forall a b. (a -> b) -> a -> b
$ Text
"Error: " forall α. Monoid α => α -> α -> α
⊕ Text
e) forall (m :: * -> *) a. Monad m => a -> m a
return
{-# INLINE errorT #-}