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