{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TemplateHaskell #-} module Control.Monad.Takahashi.Monad where import Control.Lens import Control.Monad.Skeleton import Control.Monad.State.Class(MonadState(..)) import Control.Monad.Takahashi.HtmlBuilder data TakahashiBase a where GetSlideOption :: TakahashiBase SlideOption PutSlideOption :: SlideOption -> TakahashiBase () Slide :: HtmlBuilder Style () -> TakahashiBase () type Taka = Skeleton TakahashiBase instance MonadState SlideOption Taka where put = putSlideOption get = getSlideOption ---- getSlideOption :: Taka SlideOption getSlideOption = bone GetSlideOption putSlideOption :: SlideOption -> Taka () putSlideOption v = bone $ PutSlideOption v slide :: HtmlBuilder Style () -> Taka () slide f = bone $ Slide f ------ -- slide options data BlockOption = BlockOption { _fontColor :: Maybe Color , _bgColor :: Maybe Color , _frameColor :: Maybe Color , _frameStyle :: Maybe BorderStyle , _blockFontSize :: Maybe Int } deriving (Show, Read, Eq, Ord) data SlideOption = SlideOption { _slideTitle :: String , _slideFontSize :: Maybe Int , _titleOption :: BlockOption , _contentsOption :: BlockOption , _contentsOption2 :: BlockOption , _annotationOption :: BlockOption , _codeOption :: BlockOption } deriving (Show, Read, Eq, Ord) makeLenses ''BlockOption makeLenses ''SlideOption defaultSlideOption :: SlideOption defaultSlideOption = SlideOption { _slideTitle = "" , _slideFontSize = Nothing , _titleOption = BlockOption { _fontColor = Just $ Color 0 0 80 , _bgColor = Just $ Color 100 100 255 , _frameColor = Just $ Color 0 0 80 , _frameStyle = Just BorderSolid , _blockFontSize = Nothing } , _contentsOption = BlockOption { _fontColor = Just $ Color 0 0 80 , _bgColor = Just $ Color 200 200 255 , _frameColor = Just $ Color 255 255 255 , _frameStyle = Just BorderSolid , _blockFontSize = Nothing } , _contentsOption2 = BlockOption { _fontColor = Just $ Color 80 0 0 , _bgColor = Just $ Color 255 200 200 , _frameColor = Just $ Color 255 255 255 , _frameStyle = Just BorderSolid , _blockFontSize = Nothing } , _annotationOption = BlockOption { _fontColor = Just $ Color 255 0 0 , _bgColor = Nothing , _frameColor = Just $ Color 255 255 255 , _frameStyle = Nothing , _blockFontSize = Nothing } , _codeOption = BlockOption { _fontColor = Just $ Color 0 0 80 , _bgColor = Nothing , _frameColor = Just $ Color 0 0 80 , _frameStyle = Just BorderDouble , _blockFontSize = Nothing } }