{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Control.Monad.Takahashi.Monad where
import Control.Monad.Operational
import Control.Monad.State.Class(MonadState(..))

import Control.Monad.Takahashi.HtmlBuilder

data TakahashiBase o a where
  GetSlideOption :: TakahashiBase o o
  PutSlideOption :: o -> TakahashiBase o ()
  Slide :: HtmlBuilder Style () -> TakahashiBase o ()

type Takahashi o = Program (TakahashiBase o)

instance MonadState x (Takahashi x) where
  put = putSlideOption
  get = getSlideOption

----

getSlideOption :: Takahashi o o
getSlideOption = singleton GetSlideOption

putSlideOption :: o -> Takahashi o ()
putSlideOption v = singleton $ PutSlideOption v

slide :: HtmlBuilder Style () -> Takahashi o ()
slide f = singleton $ Slide f