{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE UndecidableInstances #-} -- | Demonstration of `MultiRoute`. module Ema.Example.Ex05_MultiRoute where import Ema import Ema.Example.Common (tailwindLayout) import Ema.Example.Ex00_Hello qualified as Ex00 import Ema.Example.Ex01_Basic qualified as Ex01 import Ema.Example.Ex02_Clock qualified as Ex02 import Ema.Example.Ex03_Store qualified as Ex03 import Ema.Route.Generic import Ema.Route.Lib.Multi (MultiRoute) import Generics.SOP (I (I), NP (Nil, (:*))) import Text.Blaze.Html5 ((!)) import Text.Blaze.Html5 qualified as H import Text.Blaze.Html5.Attributes qualified as A type R = MultiRoute '[ TopRoute , FolderRoute "hello" Ex00.Route , FolderRoute "basic" Ex01.Route , FolderRoute "clock" Ex02.Route , FolderRoute "clockfast" Ex02.Route , FolderRoute "store" Ex03.Route ] newtype TopRoute = TopRoute () deriving newtype (Show, Eq, Ord, Generic, IsRoute) instance EmaSite TopRoute where siteInput _ _ = pure $ pure () siteOutput _enc _ _ = pure $ Ema.AssetGenerated Ema.Html renderIndex main :: IO () main = do void $ Ema.runSite @R $ I () :* I () :* I () :* I Ex02.delayNormal :* I Ex02.delayFast :* I () :* Nil renderIndex :: LByteString renderIndex = tailwindLayout (H.title "Ex05_MultiRoute" >> H.base ! A.href "/") $ H.div ! A.class_ "container mx-auto text-center mt-8 p-2" $ do H.p "You can compose Ema sites. Here are three sites composed to produce one, using Ema.Route.Lib.Multi:" H.ul ! A.class_ "flex flex-col justify-center .items-center mt-4 space-y-4" $ do -- NOTE: Since we don't have the MultiModel, we must hardcode the routes here. H.li $ routeElem "hello" "Ex00_Hello" H.li $ routeElem "basic" "Ex01_Basic" H.li $ routeElem "clock" "Ex02_Clock" H.li $ routeElem "clockfast" "Ex02_Clock (Fast)" H.li $ routeElem "store" "Ex03_Store" where routeElem r w = do H.a ! A.class_ "text-xl text-purple-500 hover:underline" ! A.href r $ w