{- |
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 i1 o1 :~> Along c i2 o2) -> (Along (f b) i1 o1 :~> Along (f c) i2 o2)