@@ -17,12 +17,16 @@ module Control.SemiIso
1717 assoc,
1818 ($$$),
1919 (*>>),
20+ (&>>),
2021 (**>),
2122 (>>*),
23+ (>>&),
2224 (>**),
2325 (<<*),
26+ (<<&),
2427 (<**),
2528 (*<<),
29+ (&<<),
2630 (**<),
2731 )
2832where
@@ -31,6 +35,7 @@ import Control.Applicative as X
3135import Control.Arrow.Extra
3236import Control.Monad as X
3337import Data.Bitraversable
38+import Data.Tuple
3439import Prelude hiding ((.), id)
3540
3641type AlternativeMonad m = (Alternative m, Monad m)
@@ -116,24 +121,36 @@ a $$$ c = a *** c >>^ check (uncurry (==)) >>^ siPure fst (\x -> (x, x))
116121(*>>) :: (PolyArrow m SemiIso) => m a () -> m a b -> m a b
117122a *>> b = a &&& b >>^ siPure snd ((),)
118123
124+(&>>) :: (PolyArrow m SemiIso) => m a () -> m b c -> m (a, b) c
125+a &>> b = a *** b >>^ siPure snd ((),)
126+
119127(**>) :: (PolyArrow m SemiIso) => m () () -> m a b -> m a b
120128a **> b = siPure ((),) snd ^>> a *** b >>^ siPure snd ((),)
121129
122130(>>*) :: (PolyArrow m SemiIso, Eq b) => m a b -> m () b -> m a b
123131a >>* b = siPure (,()) fst ^>> a $$$ b
124132
133+(>>&) :: (PolyArrow m SemiIso) => m a b -> m () c -> m a (b, c)
134+a >>& b = siPure (,()) fst ^>> a *** b >>> undefined
135+
125136(>**) :: (PolyArrow m SemiIso) => m a b -> m () () -> m a b
126137a >** b = siPure (,()) fst ^>> a *** b >>^ siPure fst (,())
127138
128139(<<*) :: (PolyArrow m SemiIso, Eq b) => m a b -> m () b -> m a b
129140a <<* b = siPure ((),) snd ^>> b $$$ a
130141
142+(<<&) :: (PolyArrow m SemiIso) => m a b -> m () c -> m a (b, c)
143+a <<& b = siPure ((),) snd ^>> b *** a >>^ siPure swap swap
144+
131145(<**) :: (PolyArrow m SemiIso) => m a b -> m () () -> m a b
132146a <** b = siPure ((),) snd ^>> b *** a >>^ siPure snd ((),)
133147
134148(*<<) :: (PolyArrow m SemiIso) => m a () -> m a b -> m a b
135149a *<< b = b &&& a >>^ siPure fst (,())
136150
151+(&<<) :: (PolyArrow m SemiIso) => m a () -> m b c -> m (a, b) c
152+a &<< b = siPure swap swap ^>> b *** a >>^ siPure fst (,())
153+
137154(**<) :: (PolyArrow m SemiIso) => m () () -> m a b -> m a b
138155a **< b = siPure (,()) fst ^>> b *** a >>^ siPure fst (,())
139156