{-# LANGUAGE QuantifiedConstraints #-}
module Development.GitRev.Internal.Utils.Common
(
projectConst,
projectFalse,
projectError,
projectErrorMap,
projectLeft,
joinFirst,
)
where
import Control.Exception (Exception (displayException))
import Control.Monad (join)
import Data.Bifunctor (Bifunctor (bimap, first))
projectConst ::
forall f e a.
(Functor f) =>
a ->
f (Either e a) ->
f a
projectConst :: forall (f :: * -> *) e a. Functor f => a -> f (Either e a) -> f a
projectConst = (e -> a) -> f (Either e a) -> f a
forall (f :: * -> *) e a.
Functor f =>
(e -> a) -> f (Either e a) -> f a
projectLeft ((e -> a) -> f (Either e a) -> f a)
-> (a -> e -> a) -> a -> f (Either e a) -> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> e -> a
forall a b. a -> b -> a
const
projectFalse :: forall f e. (Functor f) => f (Either e Bool) -> f Bool
projectFalse :: forall (f :: * -> *) e. Functor f => f (Either e Bool) -> f Bool
projectFalse = (e -> Bool) -> f (Either e Bool) -> f Bool
forall (f :: * -> *) e a.
Functor f =>
(e -> a) -> f (Either e a) -> f a
projectLeft (Bool -> e -> Bool
forall a b. a -> b -> a
const Bool
False)
projectError :: forall f e a. (Exception e, Functor f) => f (Either e a) -> f a
projectError :: forall (f :: * -> *) e a.
(Exception e, Functor f) =>
f (Either e a) -> f a
projectError = (e -> String) -> f (Either e a) -> f a
forall (f :: * -> *) e a.
Functor f =>
(e -> String) -> f (Either e a) -> f a
projectErrorMap e -> String
forall e. Exception e => e -> String
displayException
projectErrorMap ::
forall f e a.
(Functor f) =>
(e -> String) ->
f (Either e a) ->
f a
projectErrorMap :: forall (f :: * -> *) e a.
Functor f =>
(e -> String) -> f (Either e a) -> f a
projectErrorMap e -> String
onErr = (e -> a) -> f (Either e a) -> f a
forall (f :: * -> *) e a.
Functor f =>
(e -> a) -> f (Either e a) -> f a
projectLeft (String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> (e -> String) -> e -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> String
onErr)
projectLeft :: forall f e a. (Functor f) => (e -> a) -> f (Either e a) -> f a
projectLeft :: forall (f :: * -> *) e a.
Functor f =>
(e -> a) -> f (Either e a) -> f a
projectLeft e -> a
f = (Either e a -> a) -> f (Either e a) -> f a
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((e -> a) -> (a -> a) -> Either e a -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either e -> a
f a -> a
forall a. a -> a
id)
joinFirst ::
forall p a1 a2 b c.
( Bifunctor p,
forall a. Monad (p a)
) =>
(a1 -> b) ->
(a2 -> b) ->
p a1 (p a2 c) ->
p b c
joinFirst :: forall (p :: * -> * -> *) a1 a2 b c.
(Bifunctor p, forall a. Monad (p a)) =>
(a1 -> b) -> (a2 -> b) -> p a1 (p a2 c) -> p b c
joinFirst a1 -> b
embedE1 a2 -> b
embedE2 = p b (p b c) -> p b c
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (p b (p b c) -> p b c)
-> (p a1 (p a2 c) -> p b (p b c)) -> p a1 (p a2 c) -> p b c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a1 -> b) -> (p a2 c -> p b c) -> p a1 (p a2 c) -> p b (p b c)
forall a b c d. (a -> b) -> (c -> d) -> p a c -> p b d
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap a1 -> b
embedE1 ((a2 -> b) -> p a2 c -> p b c
forall a b c. (a -> b) -> p a c -> p b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a2 -> b
embedE2)