module Control.Monad.Trans.Compose.Infix where

import Control.Monad.Trans.Compose
import Control.Monad.Trans.Control

-- | A flipped type-level infix operator for 'ComposeT'.
type (.|>) t2 t1 = ComposeT t1 t2

infixl 1 .|>

-- | A 'flip'ped infix operator for 'runComposeT'.
(./>) :: (forall a. t2 m a -> m (StT t2 a)) -- ^ run @t2@
      -> (forall a. t1 (t2 m) a -> t2 m (StT t1 a)) -- ^ run @t1@
      -> (forall a. (t2 .|> t1) m a -> m (StT t2 (StT t1 a)))
./> :: (forall a. t2 m a -> m (StT t2 a))
-> (forall a. t1 (t2 m) a -> t2 m (StT t1 a))
-> forall a. (.|>) t2 t1 m a -> m (StT t2 (StT t1 a))
(./>) forall a. t2 m a -> m (StT t2 a)
runT2 forall a. t1 (t2 m) a -> t2 m (StT t1 a)
runT1 = (forall a. t1 (t2 m) a -> t2 m (StT t1 a))
-> (forall a. t2 m a -> m (StT t2 a))
-> forall a. (.|>) t2 t1 m a -> m (StT t2 (StT t1 a))
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *).
(forall a. t1 (t2 m) a -> t2 m (StT t1 a))
-> (forall a. t2 m a -> m (StT t2 a))
-> forall a. ComposeT t1 t2 m a -> m (StT t2 (StT t1 a))
runComposeT forall a. t1 (t2 m) a -> t2 m (StT t1 a)
runT1 forall a. t2 m a -> m (StT t2 a)
runT2

infixl 1 ./>

-- | A 'flip'ped infix operator for 'runComposeT''.
(..>) :: (t2 m a -> m a) -- ^ run @t2@
      -> (t1 (t2 m) a -> t2 m a) -- ^ run @t1@
      -> ((t2 .|> t1) m a -> m a)
..> :: (t2 m a -> m a)
-> (t1 (t2 m) a -> t2 m a) -> (.|>) t2 t1 m a -> m a
(..>) t2 m a -> m a
runT2 t1 (t2 m) a -> t2 m a
runT1 = (t1 (t2 m) a -> t2 m a)
-> (t2 m a -> m a) -> (.|>) t2 t1 m a -> m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(t1 (t2 m) a -> t2 m a)
-> (t2 m a -> m a) -> ComposeT t1 t2 m a -> m a
runComposeT' t1 (t2 m) a -> t2 m a
runT1 t2 m a -> m a
runT2

infixl 1 ..>