11 | module Control.Arrow
13 | import public Control.Category.Core as Control.Category
14 | import Control.Category
15 | import Control.Category.Promonad
16 | import Control.Category.Traced
18 | import Data.Morphisms
33 | 0 Arrow : (arr : Hom Type0) -> Type
34 | Arrow arr = (Promonad0 arr, EndoBinoidal arr (liftW2 Pair))
37 | 0 ArrowChoice : (arr : Hom Type0) -> Type
38 | ArrowChoice arr = (Arrow arr, EndoBinoidal arr (liftW2 Either))
41 | 0 ArrowLoop : (arr : Hom Type0) -> Type
42 | ArrowLoop arr = (Promonad0 arr, Traced arr (liftW2 Pair) (W0 ()))
49 | public export %inline
50 | arrow : Arrow arr => (a -> b) -> arr (W0 a) (W0 b)
53 | public export %inline
54 | first : Arrow arr => arr (W0 a) (W0 b) -> arr (W0 (a, c)) (W0 (b, c))
55 | first = mapl' {f=liftW2 Pair,a=W0 _,b=W0 _,c=W0 _}
57 | public export %inline
58 | second : Arrow arr => arr (W0 a) (W0 b) -> arr (W0 (c, a)) (W0 (c, b))
59 | second = mapr' {f=liftW2 Pair,a=W0 _,b=W0 _,c=W0 _}
62 | (***) : Arrow arr => arr (W0 a) (W0 b) -> arr (W0 a') (W0 b') -> arr (W0 (a, a')) (W0 (b, b'))
63 | f *** g = first f >>> second g
66 | (&&&) : Arrow arr => arr (W0 a) (W0 b) -> arr (W0 a) (W0 b') -> arr (W0 a) (W0 (b, b'))
67 | f &&& g = arrow dup >>> f *** g
70 | liftA2 : Arrow arr => (a -> b -> c) -> arr (W0 d) (W0 a) -> arr (W0 d) (W0 b) -> arr (W0 d) (W0 c)
71 | liftA2 op f g = (f &&& g) >>> arrow (uncurry op)
74 | public export %inline
75 | left : ArrowChoice arr => arr (W0 a) (W0 b) -> arr (W0 $
Either a c) (W0 $
Either b c)
76 | left = mapl' {f=liftW2 Either,a=W0 _,b=W0 _,c=W0 _}
78 | public export %inline
79 | right : ArrowChoice arr => arr (W0 a) (W0 b) -> arr (W0 $
Either c a) (W0 $
Either c b)
80 | right = mapr' {f=liftW2 Either,a=W0 _,b=W0 _,c=W0 _}
83 | (+++) : ArrowChoice arr => arr (W0 a) (W0 b) -> arr (W0 a') (W0 b') -> arr (W0 $
Either a a') (W0 $
Either b b')
84 | f +++ g = left f >>> right g
87 | (\|/) : ArrowChoice arr => arr (W0 a) (W0 b) -> arr (W0 a') (W0 b) -> arr (W0 $
Either a a') (W0 b)
88 | f \|/ g = f +++ g >>> arrow fromEither
91 | public export %inline
92 | loop : ArrowLoop arr => arr (W0 (a, c)) (W0 (b, c)) -> arr (W0 a) (W0 b)
93 | loop = tracer {ten=liftW2 Pair,a=W0 _,b=W0 _,c=W0 _}