packages feed

hyperbole-0.5.0: src/Web/Hyperbole/Page.hs

module Web.Hyperbole.Page where

import Data.Kind (Type)
import Effectful
import Effectful.Reader.Dynamic
import Web.Hyperbole.Effect.Hyperbole
import Web.Hyperbole.HyperView (Root (..))
import Web.Hyperbole.Server.Handler (RunHandlers, runLoad)
import Web.Hyperbole.Types.Response (Response)
import Web.Hyperbole.View (View)


{- | An application is divided into multiple [Pages](#g:pages). Each page module should have a 'Page' function, which returns a root 'View'

@
#EMBED Example/Docs/MultiView.hs page
@
-}
type Page es (views :: [Type]) = Eff (Reader (Root views) : es) (View (Root views) ())


{- | Run a 'Page' and return a 'Response'

@
#EMBED Example/Docs/BasicPage.hs main

#EMBED Example/Docs/BasicPage.hs page
@
-}
runPage
  :: (Hyperbole :> es, RunHandlers views es)
  => Page es views
  -> Eff es Response
runPage eff = runLoad $ runReader Root eff


subPage
  :: (Hyperbole :> es)
  => Eff (Reader (Root inner) : es) a
  -> Eff es a
subPage pg = do
  runReader Root pg