ema-0.1.0.0: src/Ema/Class.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Ema.Class where
import Control.Monad.Logger (MonadLoggerIO)
import Ema.Route.Slug (Slug)
import UnliftIO (MonadUnliftIO)
type MonadEma m =
( MonadIO m,
MonadUnliftIO m,
MonadLoggerIO m
)
-- | Enrich a model to work with Ema
class Ema model route | route -> model where
-- How to convert URLs to/from routes
encodeRoute :: route -> [Slug]
decodeRoute :: [Slug] -> Maybe route
-- | Routes to use when generating the static site
--
-- This is never used by the dev server.
staticRoutes :: model -> [route]
-- | List of (top-level) filepaths to serve as static assets
--
-- These will be copied over as-is during static site generation
staticAssets :: Proxy route -> [FilePath]
staticAssets Proxy = mempty
-- | The unit model is useful when using Ema in pure fashion (see @Ema.runEmaPure@) with a single route (index.html) only.
instance Ema () () where
encodeRoute () = []
decodeRoute = \case
[] -> Just ()
_ -> Nothing
staticRoutes () = one ()