@@ -0,0 +1,39 @@
1+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, MonoLocalBinds #-}
2+
3+module Control.Arrow.Extra.PolyArrow
4+ ( PolyArrow(..)
5+ , (^>>)
6+ , (>>^)
7+ , (<<^)
8+ , (^<<)
9+ , (^>^)
10+ , (^<^)
11+ ) where
12+
13+import qualified Control.Arrow as A
14+import Control.Arrow.Extra.BaseArrow
15+import Control.Category
16+
17+class BaseArrow a => PolyArrow a p where
18+ arr :: p b c -> a b c
19+
20+instance A.Arrow a => PolyArrow a (->) where
21+ arr = A.arr
22+
23+(^>>) :: PolyArrow a p => p b c -> a c d -> a b d
24+f ^>> a = arr f >>> a
25+
26+(>>^) :: PolyArrow a p => a b c -> p c d -> a b d
27+a >>^ f = a >>> arr f
28+
29+(<<^) :: PolyArrow a p => a c d -> p b c -> a b d
30+a <<^ f = a <<< arr f
31+
32+(^<<) :: PolyArrow a p => p c d -> a b c -> a b d
33+f ^<< a = arr f <<< a
34+
35+(^>^) :: PolyArrow a p => p b c -> p c d -> a b d
36+a ^>^ b = arr a >>> arr b
37+
38+(^<^) :: PolyArrow a p => p c d -> p b c -> a b d
39+a ^<^ b = arr a <<< arr b