poly-control-1.0.0: src/Control/Monad/Poly.hs
{-# LANGUAGE UndecidableInstances #-}
module Control.Monad.Poly (module Control.Monad.Poly, module X) where
import Prelude
import Control.Applicative.Poly
import Control.Applicative.Poly as X (PolyBind, MonoBind)
-- === Types ===
class PolyApplicative m n => PolyMonad m n where (>>>=) :: m a -> (a -> n b) -> PolyBind m n b
instance {-# OVERLAPPABLE #-} (Monad m, MonoBind m, PolyApplicative m m) => PolyMonad m m where (>>>=) = (>>=)
-- === Utils ===
polyBind :: PolyMonad m n => m a -> (a -> n b) -> PolyBind m n b
polyBind = (>>>=)
polyJoin :: PolyMonad m n => m (n a) -> PolyBind m n a
polyJoin = (>>>= id)