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)
type Page es (views :: [Type]) = Eff (Reader (Root views) : es) (View (Root views) ())
runPage
:: (Hyperbole :> es, RunHandlers views es)
=> Page es views
-> Eff es Response
runPage :: forall (es :: [Effect]) (views :: [*]).
(Hyperbole :> es, RunHandlers views es) =>
Page es views -> Eff es Response
runPage Page es views
eff = Eff es (View (Root views) ()) -> Eff es Response
forall (views :: [*]) (es :: [Effect]).
(Hyperbole :> es, RunHandlers views es) =>
Eff es (View (Root views) ()) -> Eff es Response
runLoad (Eff es (View (Root views) ()) -> Eff es Response)
-> Eff es (View (Root views) ()) -> Eff es Response
forall a b. (a -> b) -> a -> b
$ Root views -> Page es views -> Eff es (View (Root views) ())
forall r (es :: [Effect]) a.
HasCallStack =>
r -> Eff (Reader r : es) a -> Eff es a
runReader Root views
forall (views :: [*]). Root views
Root Page es views
eff
subPage
:: (Hyperbole :> es)
=> Eff (Reader (Root inner) : es) a
-> Eff es a
subPage :: forall (es :: [Effect]) (inner :: [*]) a.
(Hyperbole :> es) =>
Eff (Reader (Root inner) : es) a -> Eff es a
subPage Eff (Reader (Root inner) : es) a
pg = do
Root inner -> Eff (Reader (Root inner) : es) a -> Eff es a
forall r (es :: [Effect]) a.
HasCallStack =>
r -> Eff (Reader r : es) a -> Eff es a
runReader Root inner
forall (views :: [*]). Root views
Root Eff (Reader (Root inner) : es) a
pg