module Data.Either.HT (
   mapLeft,
   mapRight,
   mapBoth,
   ) where


mapLeft :: (a -> b) -> Either a c -> Either b c
mapLeft :: (a -> b) -> Either a c -> Either b c
mapLeft f :: a -> b
f = (a -> Either b c) -> (c -> Either b c) -> Either a c -> Either b c
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (b -> Either b c
forall a b. a -> Either a b
Left (b -> Either b c) -> (a -> b) -> a -> Either b c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f) c -> Either b c
forall a b. b -> Either a b
Right

mapRight :: (b -> c) -> Either a b -> Either a c
mapRight :: (b -> c) -> Either a b -> Either a c
mapRight f :: b -> c
f = (a -> Either a c) -> (b -> Either a c) -> Either a b -> Either a c
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either a -> Either a c
forall a b. a -> Either a b
Left (c -> Either a c
forall a b. b -> Either a b
Right (c -> Either a c) -> (b -> c) -> b -> Either a c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> c
f)

mapBoth :: (a -> c) -> (b -> d) -> Either a b -> Either c d
mapBoth :: (a -> c) -> (b -> d) -> Either a b -> Either c d
mapBoth f :: a -> c
f g :: b -> d
g = (a -> Either c d) -> (b -> Either c d) -> Either a b -> Either c d
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (c -> Either c d
forall a b. a -> Either a b
Left (c -> Either c d) -> (a -> c) -> a -> Either c d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> c
f) (d -> Either c d
forall a b. b -> Either a b
Right (d -> Either c d) -> (b -> d) -> b -> Either c d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> d
g)