module Control.Monad.HigherOrder
( HFunctor(..)
, HPointed(..)
, HMonad(..)
, hjoin
, (>>**=), (=**<<)
) where
import Control.Functor.Extras
import Control.Functor.HigherOrder
infixl 1 >>**=
infixr 1 =**<<
class HPointed m => HMonad m where
hbind :: (Functor f, Functor g) => (f :~> m g) -> m f :~> m g
hjoin :: (HMonad m, Functor (m g), Functor g) => m (m g) :~> m g
hjoin = hbind id
(>>**=) :: (HMonad m, Functor f, Functor g) => m f a -> (f :~> m g) -> m g a
m >>**= k = hbind k m
(=**<<) :: (HMonad m, Functor f, Functor g) => (f :~> m g) -> m f :~> m g
(=**<<) = hbind