{- | Category of arrows and arrow-like structures. -} module Control.Arrow.Mix.Along where import Control.Arrow -- | Arrow morphism type f :~> g = forall i o. f i o -> g i o -- | Sometimes we need to refine our morphism a bit; therefore, we use @Along f i o@ instead of just @f@. type Along f i o input output = f (input, i) (output, o) -- | Something like a functor class AlongMap f where alongMap :: (Arrow b, Arrow c) => (Along b i o :~> Along c i o) -> (Along (f b) i o :~> Along (f c) i o)