ema-0.2.0.0: src/Ema/Example/Ex02_Basic.hs
{-# LANGUAGE TypeApplications #-}
-- | A very simple site with two routes, and HTML rendered using Blaze DSL
module Ema.Example.Ex02_Basic where
import Control.Concurrent (threadDelay)
import qualified Data.LVar as LVar
import Ema (Ema (..))
import qualified Ema
import qualified Ema.CLI
import qualified Ema.CLI as CLI
import qualified Ema.Helper.Tailwind as Tailwind
import Text.Blaze.Html5 ((!))
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
data Route
= Index
| About
deriving (Show, Enum, Bounded)
newtype Model = Model {unModel :: Text}
instance Ema Model Route where
encodeRoute _model =
\case
Index -> "index.html"
About -> "about.html"
decodeRoute _model = \case
"index.html" -> Just Index
"about.html" -> Just About
_ -> Nothing
main :: IO ()
main = do
Ema.runEma (\act m -> Ema.AssetGenerated Ema.Html . render act m) $ \act model -> do
LVar.set model $ Model "Hello World. "
when (act == CLI.Run) $
liftIO $ threadDelay maxBound
render :: Ema.CLI.Action -> Model -> Route -> LByteString
render emaAction model r =
Tailwind.layout emaAction (H.title "Basic site" >> H.base ! A.href "/") $
H.div ! A.class_ "container mx-auto" $ do
H.div ! A.class_ "mt-8 p-2 text-center" $ do
case r of
Index -> do
H.toHtml (unModel model)
"You are on the index page. "
routeElem About "Go to About"
About -> do
"You are on the about page. "
routeElem Index "Go to Index"
where
routeElem r' w =
H.a ! A.class_ "text-red-500 hover:underline" ! routeHref r' $ w
routeHref r' =
A.href (fromString . toString $ Ema.routeUrl model r')