{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
module Control.Arrow.Transformer.Error(
ErrorArrow(ErrorArrow),
runError,
ArrowAddError(..),
) where
import Control.Arrow.Internals
import Control.Arrow.Operations
import Control.Arrow.Transformer
import Control.Applicative
import Control.Arrow
import Control.Category
import Data.Monoid
#if (MIN_VERSION_base(4,9,0)) && !(MIN_VERSION_base(4,11,0))
import Data.Semigroup
#endif
import Prelude hiding (id,(.))
newtype ErrorArrow ex a b c = ErrorArrow (a b (Either ex c))
rstrength :: (Either ex a, b) -> Either ex (a, b)
rstrength :: forall ex a b. (Either ex a, b) -> Either ex (a, b)
rstrength (Left ex
ex, b
_) = forall a b. a -> Either a b
Left ex
ex
rstrength (Right a
a, b
b) = forall a b. b -> Either a b
Right (a
a, b
b)
runError :: ArrowChoice a =>
ErrorArrow ex a e b
-> a (e,ex) b
-> a e b
runError :: forall (a :: * -> * -> *) ex e b.
ArrowChoice a =>
ErrorArrow ex a e b -> a (e, ex) b -> a e b
runError (ErrorArrow a e (Either ex b)
f) a (e, ex) b
h =
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& a e (Either ex b)
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall {a} {b} {b}. (a, Either b b) -> Either (a, b) b
strength forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a (e, ex) b
h forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
where
strength :: (a, Either b b) -> Either (a, b) b
strength (a
x, Left b
y) = forall a b. a -> Either a b
Left (a
x, b
y)
strength (a
_, Right b
z) = forall a b. b -> Either a b
Right b
z
instance ArrowChoice a => ArrowTransformer (ErrorArrow ex) a where
lift :: forall b c. a b c -> ErrorArrow ex a b c
lift a b c
f = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (a b c
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall a b. b -> Either a b
Right)
instance ArrowChoice a => Category (ErrorArrow ex a) where
id :: forall a. ErrorArrow ex a a a
id = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall a b. b -> Either a b
Right)
ErrorArrow a b (Either ex c)
f . :: forall b c a.
ErrorArrow ex a b c -> ErrorArrow ex a a b -> ErrorArrow ex a a c
. ErrorArrow a a (Either ex b)
g =
forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a b. a -> Either a b
Left forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id) forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall (a :: * -> * -> *) b c d.
ArrowChoice a =>
a b c -> a (Either d b) (Either d c)
right a b (Either ex c)
f forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a a (Either ex b)
g)
instance ArrowChoice a => Arrow (ErrorArrow ex a) where
arr :: forall b c. (b -> c) -> ErrorArrow ex a b c
arr b -> c
f = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (forall a b. b -> Either a b
Right forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> c
f))
first :: forall b c d. ErrorArrow ex a b c -> ErrorArrow ex a (b, d) (c, d)
first (ErrorArrow a b (Either ex c)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first a b (Either ex c)
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall ex a b. (Either ex a, b) -> Either ex (a, b)
rstrength)
instance ArrowChoice a => ArrowChoice (ErrorArrow ex a) where
left :: forall b c d.
ErrorArrow ex a b c -> ErrorArrow ex a (Either b d) (Either c d)
left (ErrorArrow a b (Either ex c)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c d.
ArrowChoice a =>
a b c -> a (Either b d) (Either c d)
left a b (Either ex c)
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall a b c. Either (Either a b) c -> Either a (Either b c)
assocsum)
assocsum :: Either (Either a b) c -> Either a (Either b c)
assocsum :: forall a b c. Either (Either a b) c -> Either a (Either b c)
assocsum (Left (Left a
a)) = forall a b. a -> Either a b
Left a
a
assocsum (Left (Right b
b)) = forall a b. b -> Either a b
Right (forall a b. a -> Either a b
Left b
b)
assocsum (Right c
c) = forall a b. b -> Either a b
Right (forall a b. b -> Either a b
Right c
c)
instance (ArrowChoice a, ArrowApply a) => ArrowApply (ErrorArrow ex a) where
app :: forall b c. ErrorArrow ex a (ErrorArrow ex a b c, b) c
app = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (\(ErrorArrow a b (Either ex c)
f, b
x) -> (a b (Either ex c)
f, b
x)) forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. ArrowApply a => a (a b c, b) c
app)
instance (ArrowChoice a, ArrowLoop a) => ArrowLoop (ErrorArrow ex a) where
loop :: forall b d c. ErrorArrow ex a (b, d) (c, d) -> ErrorArrow ex a b c
loop (ErrorArrow a (b, d) (Either ex (c, d))
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b d c.
ArrowLoop a =>
a (b, d) (c, d) -> a b c
loop (a (b, d) (Either ex (c, d))
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall {a} {a} {b}. Either a (a, b) -> (Either a a, b)
dist))
where
dist :: Either a (a, b) -> (Either a a, b)
dist Either a (a, b)
x = (forall {a} {b} {b}. Either a (b, b) -> Either a b
fstRight Either a (a, b)
x, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall {a} {a}. Either a a -> a
fromRight Either a (a, b)
x)
fstRight :: Either a (b, b) -> Either a b
fstRight (Left a
x) = forall a b. a -> Either a b
Left a
x
fstRight (Right (b
x,b
_)) = forall a b. b -> Either a b
Right b
x
fromRight :: Either a a -> a
fromRight (Left a
_) = forall a. HasCallStack => [Char] -> a
error [Char]
"fromRight"
fromRight (Right a
y) = a
y
instance ArrowChoice a => Functor (ErrorArrow ex a b) where
fmap :: forall a b. (a -> b) -> ErrorArrow ex a b a -> ErrorArrow ex a b b
fmap a -> b
f ErrorArrow ex a b a
g = ErrorArrow ex a b a
g forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr a -> b
f
instance ArrowChoice a => Applicative (ErrorArrow ex a b) where
pure :: forall a. a -> ErrorArrow ex a b a
pure a
x = forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (forall a b. a -> b -> a
const a
x)
ErrorArrow ex a b (a -> b)
f <*> :: forall a b.
ErrorArrow ex a b (a -> b)
-> ErrorArrow ex a b a -> ErrorArrow ex a b b
<*> ErrorArrow ex a b a
g = ErrorArrow ex a b (a -> b)
f forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& ErrorArrow ex a b a
g forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id)
instance (Monoid ex, ArrowChoice a) => Alternative (ErrorArrow ex a b) where
empty :: forall a. ErrorArrow ex a b a
empty = forall (a :: * -> * -> *) b c. ArrowZero a => a b c
zeroArrow
ErrorArrow ex a b a
f <|> :: forall a.
ErrorArrow ex a b a -> ErrorArrow ex a b a -> ErrorArrow ex a b a
<|> ErrorArrow ex a b a
g = ErrorArrow ex a b a
f forall (a :: * -> * -> *) b c.
ArrowPlus a =>
a b c -> a b c -> a b c
<+> ErrorArrow ex a b a
g
#if MIN_VERSION_base(4,9,0)
instance (Monoid ex, ArrowChoice a) => Semigroup (ErrorArrow ex a b c) where
<> :: ErrorArrow ex a b c -> ErrorArrow ex a b c -> ErrorArrow ex a b c
(<>) = forall (a :: * -> * -> *) b c.
ArrowPlus a =>
a b c -> a b c -> a b c
(<+>)
#endif
instance (Monoid ex, ArrowChoice a) => Monoid (ErrorArrow ex a b c) where
mempty :: ErrorArrow ex a b c
mempty = forall (a :: * -> * -> *) b c. ArrowZero a => a b c
zeroArrow
#if !(MIN_VERSION_base(4,11,0))
mappend = (<+>)
#endif
instance ArrowChoice a => ArrowError ex (ErrorArrow ex a) where
raise :: forall b. ErrorArrow ex a ex b
raise = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall a b. a -> Either a b
Left)
handle :: forall e b.
ErrorArrow ex a e b
-> ErrorArrow ex a (e, ex) b -> ErrorArrow ex a e b
handle (ErrorArrow a e (Either ex b)
f) (ErrorArrow a (e, ex) (Either ex b)
h) =
forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& a e (Either ex b)
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall {a} {b} {b}. (a, Either b b) -> Either (a, b) b
strength forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a (e, ex) (Either ex b)
h forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall a b. b -> Either a b
Right)
where
strength :: (a, Either b b) -> Either (a, b) b
strength (a
x, Left b
y) = forall a b. a -> Either a b
Left (a
x, b
y)
strength (a
_, Right b
z) = forall a b. b -> Either a b
Right b
z
tryInUnless :: forall e b c.
ErrorArrow ex a e b
-> ErrorArrow ex a (e, b) c
-> ErrorArrow ex a (e, ex) c
-> ErrorArrow ex a e c
tryInUnless (ErrorArrow a e (Either ex b)
f) (ErrorArrow a (e, b) (Either ex c)
s) (ErrorArrow a (e, ex) (Either ex c)
h) =
forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& a e (Either ex b)
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall {a} {b} {b}. (a, Either b b) -> Either (a, b) (a, b)
distr forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a (e, ex) (Either ex c)
h forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| a (e, b) (Either ex c)
s)
where
distr :: (a, Either b b) -> Either (a, b) (a, b)
distr (a
b, Left b
ex) = forall a b. a -> Either a b
Left (a
b, b
ex)
distr (a
b, Right b
c) = forall a b. b -> Either a b
Right (a
b, b
c)
instance ArrowChoice a => ArrowAddError ex (ErrorArrow ex a) a where
liftError :: forall e b. a e b -> ErrorArrow ex a e b
liftError = forall (f :: (* -> * -> *) -> * -> * -> *) (a :: * -> * -> *) b c.
ArrowTransformer f a =>
a b c -> f a b c
lift
elimError :: forall e b. ErrorArrow ex a e b -> a (e, ex) b -> a e b
elimError = forall (a :: * -> * -> *) ex e b.
ArrowChoice a =>
ErrorArrow ex a e b -> a (e, ex) b -> a e b
runError
instance (Monoid ex, ArrowChoice a) => ArrowZero (ErrorArrow ex a) where
zeroArrow :: forall b c. ErrorArrow ex a b c
zeroArrow = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (forall a b. a -> b -> a
const (forall a b. a -> Either a b
Left forall a. Monoid a => a
mempty)))
instance (Monoid ex, ArrowChoice a) => ArrowPlus (ErrorArrow ex a) where
ErrorArrow ex a b c
f <+> :: forall b c.
ErrorArrow ex a b c -> ErrorArrow ex a b c -> ErrorArrow ex a b c
<+> ErrorArrow ex a b c
g = forall ex (a :: * -> * -> *) e b.
ArrowError ex a =>
a e b -> a (e, ex) b -> a e b
handle ErrorArrow ex a b c
f forall a b. (a -> b) -> a -> b
$ forall ex (a :: * -> * -> *) e b.
ArrowError ex a =>
a e b -> a (e, ex) b -> a e b
handle (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall a b. (a, b) -> a
fst forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> ErrorArrow ex a b c
g) forall a b. (a -> b) -> a -> b
$
forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (\((b
_,ex
ex1), ex
ex2) -> forall a b. a -> Either a b
Left (ex
ex1 forall a. Monoid a => a -> a -> a
`mappend` ex
ex2)))
instance (ArrowReader r a, ArrowChoice a) =>
ArrowReader r (ErrorArrow ex a) where
readState :: forall b. ErrorArrow ex a b r
readState = forall (f :: (* -> * -> *) -> * -> * -> *) (a :: * -> * -> *) b c.
ArrowTransformer f a =>
a b c -> f a b c
lift forall r (a :: * -> * -> *) b. ArrowReader r a => a b r
readState
newReader :: forall e b. ErrorArrow ex a e b -> ErrorArrow ex a (e, r) b
newReader (ErrorArrow a e (Either ex b)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall r (a :: * -> * -> *) e b.
ArrowReader r a =>
a e b -> a (e, r) b
newReader a e (Either ex b)
f)
instance (ArrowState s a, ArrowChoice a) =>
ArrowState s (ErrorArrow ex a) where
fetch :: forall e. ErrorArrow ex a e s
fetch = forall (f :: (* -> * -> *) -> * -> * -> *) (a :: * -> * -> *) b c.
ArrowTransformer f a =>
a b c -> f a b c
lift forall s (a :: * -> * -> *) e. ArrowState s a => a e s
fetch
store :: ErrorArrow ex a s ()
store = forall (f :: (* -> * -> *) -> * -> * -> *) (a :: * -> * -> *) b c.
ArrowTransformer f a =>
a b c -> f a b c
lift forall s (a :: * -> * -> *). ArrowState s a => a s ()
store
instance (ArrowWriter w a, ArrowChoice a) =>
ArrowWriter w (ErrorArrow ex a) where
write :: ErrorArrow ex a w ()
write = forall (f :: (* -> * -> *) -> * -> * -> *) (a :: * -> * -> *) b c.
ArrowTransformer f a =>
a b c -> f a b c
lift forall w (a :: * -> * -> *). ArrowWriter w a => a w ()
write
newWriter :: forall e b. ErrorArrow ex a e b -> ErrorArrow ex a e (b, w)
newWriter (ErrorArrow a e (Either ex b)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall w (a :: * -> * -> *) e b.
ArrowWriter w a =>
a e b -> a e (b, w)
newWriter a e (Either ex b)
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall ex a b. (Either ex a, b) -> Either ex (a, b)
rstrength)
instance (ArrowAddReader r a a', ArrowChoice a, ArrowChoice a') =>
ArrowAddReader r (ErrorArrow ex a) (ErrorArrow ex a') where
liftReader :: forall e b. ErrorArrow ex a' e b -> ErrorArrow ex a e b
liftReader (ErrorArrow a' e (Either ex b)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall r (a :: * -> * -> *) (a' :: * -> * -> *) e b.
ArrowAddReader r a a' =>
a' e b -> a e b
liftReader a' e (Either ex b)
f)
elimReader :: forall e b. ErrorArrow ex a e b -> ErrorArrow ex a' (e, r) b
elimReader (ErrorArrow a e (Either ex b)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall r (a :: * -> * -> *) (a' :: * -> * -> *) e b.
ArrowAddReader r a a' =>
a e b -> a' (e, r) b
elimReader a e (Either ex b)
f)
instance (ArrowAddState s a a', ArrowChoice a, ArrowChoice a') =>
ArrowAddState s (ErrorArrow ex a) (ErrorArrow ex a') where
liftState :: forall e b. ErrorArrow ex a' e b -> ErrorArrow ex a e b
liftState (ErrorArrow a' e (Either ex b)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall s (a :: * -> * -> *) (a' :: * -> * -> *) e b.
ArrowAddState s a a' =>
a' e b -> a e b
liftState a' e (Either ex b)
f)
elimState :: forall e b. ErrorArrow ex a e b -> ErrorArrow ex a' (e, s) (b, s)
elimState (ErrorArrow a e (Either ex b)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall s (a :: * -> * -> *) (a' :: * -> * -> *) e b.
ArrowAddState s a a' =>
a e b -> a' (e, s) (b, s)
elimState a e (Either ex b)
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall ex a b. (Either ex a, b) -> Either ex (a, b)
rstrength)
instance (ArrowAddWriter w a a', ArrowChoice a, ArrowChoice a') =>
ArrowAddWriter w (ErrorArrow ex a) (ErrorArrow ex a') where
liftWriter :: forall e b. ErrorArrow ex a' e b -> ErrorArrow ex a e b
liftWriter (ErrorArrow a' e (Either ex b)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall w (a :: * -> * -> *) (a' :: * -> * -> *) e b.
ArrowAddWriter w a a' =>
a' e b -> a e b
liftWriter a' e (Either ex b)
f)
elimWriter :: forall e b. ErrorArrow ex a e b -> ErrorArrow ex a' e (b, w)
elimWriter (ErrorArrow a e (Either ex b)
f) = forall ex (a :: * -> * -> *) b c.
a b (Either ex c) -> ErrorArrow ex a b c
ErrorArrow (forall w (a :: * -> * -> *) (a' :: * -> * -> *) e b.
ArrowAddWriter w a a' =>
a e b -> a' e (b, w)
elimWriter a e (Either ex b)
f forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr forall ex a b. (Either ex a, b) -> Either ex (a, b)
rstrength)