@@ -0,0 +1,27 @@
1+{-# LANGUAGE NoImplicitPrelude, FlexibleInstances, UndecidableInstances #-}
2+
3+module Control.Arrow.Extra.BaseArrow
4+ ( BaseArrow(..)
5+ ) where
6+
7+import qualified Control.Arrow as A
8+import Control.Category
9+
10+class Category a => BaseArrow a where
11+ {-# MINIMAL (***), (&&&) #-}
12+
13+ first :: a b c -> a (b,d) (c,d)
14+ first = (*** id)
15+
16+ second :: a b c -> a (d,b) (d,c)
17+ second = (id ***)
18+
19+ (***) :: a b c -> a b' c' -> a (b,b') (c,c')
20+
21+ (&&&) :: a b c -> a b c' -> a b (c,c')
22+
23+instance (Category a, A.Arrow a) => BaseArrow a where
24+ first = A.first
25+ second = A.second
26+ (***) = (A.***)
27+ (&&&) = (A.&&&)