module Data.Functor.Arrow.Straight (Straight (..)) where import "morphisms" Control.Morphism ((.), ($)) import Control.Functor.Covariant (Covariant ((<$>))) import Control.Functor.Covariant.Applicative (Applicative ((<*>))) import Control.Functor.Polyvariant.Provariant (Provariant (promap)) newtype Straight a b = Straight { straight :: a -> b } instance Covariant (Straight a) where f <$> g = Straight (f . straight g) instance Applicative (Straight a) where Straight f <*> Straight g = Straight $ \x -> f x (g x) instance Provariant Straight where promap f g (Straight h) = Straight $ g . h . f