rope-0.1: Data/Rope/Util/Bifunctor.hs
module Data.Rope.Util.Bifunctor (Bifunctor(..)) where
class Bifunctor f where
bimap :: (a -> b) -> (c -> d) -> f a c -> f b d
first :: (a -> b) -> f a c -> f b c
second :: (b -> c) -> f a b -> f a c
first f = bimap f id
second = bimap id
bimap f g = second g . first f
instance Bifunctor (,) where
bimap f g ~(a,b) = (f a, g b)
first f ~(a,b) = (f a, b)
second g ~(a,b) = (a, g b)
instance Bifunctor Either where
bimap f _ (Left a) = Left (f a)
bimap _ g (Right b) = Right (g b)
first f (Left a) = Left (f a)
first _ (Right b) = Right b
second _ (Left a) = Left a
second g (Right b) = Right (g b)