{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeOperators #-}

module Control.Dsl.Do where

import Control.Dsl.Dsl
import Control.Dsl.Cont
import Prelude hiding ((>>), (>>=), return)

class Do k r a where
  (>>=) :: k r a -> r !! a
  (>>) :: k r a -> r -> r
  k >> a = k >>= const a

instance {-# OVERLAPPABLE #-} Dsl k r a => Do k r a where
  (>>=) = cpsApply

instance Do Cont r a where
  (>>=) (Cont k) = k