{-# 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)