module Graphics.Rendering.OGL.Monad (liftIO, liftGL, runGL, runGLA, GL(..), runPrimitive, PrimitiveGL(..), MonadGL) where
import Control.Monad
import Control.Applicative
import Control.Monad.Trans
import Control.Arrow
class MonadIO m => MonadGL m
instance MonadGL GL
instance MonadGL PrimitiveGL
newtype GL a = GL (IO a) deriving (Functor, Monad, MonadIO)
newtype PrimitiveGL a = PrimitiveGL (IO a) deriving (Functor, Monad, MonadIO)
runGL :: GL a -> IO a
runGL (GL x) = x
runGLA :: Kleisli GL a a -> Kleisli IO a a
runGLA a = Kleisli $ runGL . runKleisli a
liftGL :: MonadIO m => GL a -> m a
liftGL = liftIO . runGL
runPrimitive :: PrimitiveGL a -> IO a
runPrimitive (PrimitiveGL x) = x