Simplify YesodSubDispatch

This commit is contained in:
Michael Snoyman 2018-01-11 23:13:32 +02:00
parent fbccfe2306
commit 3e06942449
No known key found for this signature in database
GPG Key ID: A048E8C057E86876
6 changed files with 16 additions and 18 deletions

View File

@ -582,8 +582,7 @@ data AuthException = InvalidFacebookResponse
deriving (Show, Typeable) deriving (Show, Typeable)
instance Exception AuthException instance Exception AuthException
-- FIXME HandlerSite m ~ SubHandlerSite m should be unnecessary instance YesodAuth master => YesodSubDispatch Auth master where
instance (YesodAuth (HandlerSite m), HandlerSite m ~ SubHandlerSite m, MonadSubHandler m, MonadUnliftIO m) => YesodSubDispatch Auth m where
yesodSubDispatch = $(mkYesodSubDispatch resourcesAuth) yesodSubDispatch = $(mkYesodSubDispatch resourcesAuth)
asHtml :: Html -> Html asHtml :: Html -> Html

View File

@ -19,16 +19,15 @@ import Control.Monad.Trans.Reader (ReaderT (..), ask)
class Yesod site => YesodDispatch site where class Yesod site => YesodDispatch site where
yesodDispatch :: YesodRunnerEnv site -> W.Application yesodDispatch :: YesodRunnerEnv site -> W.Application
class YesodSubDispatch sub m where class YesodSubDispatch sub master where
yesodSubDispatch :: YesodSubRunnerEnv sub (HandlerSite m) m yesodSubDispatch :: YesodSubRunnerEnv sub master -> W.Application
-> W.Application
instance YesodSubDispatch WaiSubsite master where instance YesodSubDispatch WaiSubsite master where
yesodSubDispatch YesodSubRunnerEnv {..} = app yesodSubDispatch YesodSubRunnerEnv {..} = app
where where
WaiSubsite app = ysreGetSub $ yreSite ysreParentEnv WaiSubsite app = ysreGetSub $ yreSite ysreParentEnv
instance MonadHandler m => YesodSubDispatch WaiSubsiteWithAuth m where instance YesodSubDispatch WaiSubsiteWithAuth master where
yesodSubDispatch YesodSubRunnerEnv {..} req = yesodSubDispatch YesodSubRunnerEnv {..} req =
ysreParentRunner handlert ysreParentEnv (fmap ysreToParentRoute route) req ysreParentRunner handlert ysreParentEnv (fmap ysreToParentRoute route) req
where where
@ -90,9 +89,9 @@ instance (MonadSubHandler m, parent ~ SubHandlerSite m) => MonadSubHandler (Read
} }
subHelper subHelper
:: (ToTypedContent content, MonadSubHandler m, master ~ HandlerSite m, parent ~ SubHandlerSite m) :: ToTypedContent content
=> ReaderT (SubsiteData child master) m content => ReaderT (SubsiteData child master) (HandlerFor master) content
-> YesodSubRunnerEnv child parent m -> YesodSubRunnerEnv child master
-> Maybe (Route child) -> Maybe (Route child)
-> W.Application -> W.Application
subHelper (ReaderT f) YesodSubRunnerEnv {..} mroute = subHelper (ReaderT f) YesodSubRunnerEnv {..} mroute =
@ -100,7 +99,7 @@ subHelper (ReaderT f) YesodSubRunnerEnv {..} mroute =
where where
handler = fmap toTypedContent $ do handler = fmap toTypedContent $ do
tm <- getRouteToParent tm <- getRouteToParent
f SubsiteData liftHandler $ f SubsiteData
{ sdRouteToParent = tm . ysreToParentRoute { sdRouteToParent = tm . ysreToParentRoute
, sdCurrentRoute = mroute , sdCurrentRoute = mroute
, sdSubsiteData = ysreGetSub $ yreSite ysreParentEnv , sdSubsiteData = ysreGetSub $ yreSite ysreParentEnv

View File

@ -203,15 +203,15 @@ data YesodRunnerEnv site = YesodRunnerEnv
, yreGetMaxExpires :: IO Text , yreGetMaxExpires :: IO Text
} }
data YesodSubRunnerEnv sub parent parentMonad = YesodSubRunnerEnv data YesodSubRunnerEnv sub parent = YesodSubRunnerEnv
{ ysreParentRunner :: !(ParentRunner parent parentMonad) { ysreParentRunner :: !(ParentRunner parent)
, ysreGetSub :: !(parent -> sub) , ysreGetSub :: !(parent -> sub)
, ysreToParentRoute :: !(Route sub -> Route parent) , ysreToParentRoute :: !(Route sub -> Route parent)
, ysreParentEnv :: !(YesodRunnerEnv parent) -- FIXME maybe get rid of this and remove YesodRunnerEnv in ParentRunner? , ysreParentEnv :: !(YesodRunnerEnv parent) -- FIXME maybe get rid of this and remove YesodRunnerEnv in ParentRunner?
} }
type ParentRunner parent m type ParentRunner parent
= m TypedContent = HandlerFor parent TypedContent
-> YesodRunnerEnv parent -> YesodRunnerEnv parent
-> Maybe (Route parent) -> Maybe (Route parent)
-> W.Application -> W.Application

View File

@ -10,7 +10,7 @@ module YesodCoreTest.NoOverloadedStringsSub where
import Yesod.Core import Yesod.Core
import Yesod.Core.Types import Yesod.Core.Types
data Subsite = Subsite (forall master. Yesod master => YesodSubRunnerEnv Subsite master (HandlerFor master) -> Application) data Subsite = Subsite (forall master. Yesod master => YesodSubRunnerEnv Subsite master -> Application)
mkYesodSubData "Subsite" [parseRoutes| mkYesodSubData "Subsite" [parseRoutes|
/bar BarR GET /bar BarR GET
@ -21,7 +21,7 @@ mkYesodSubData "Subsite" [parseRoutes|
/has-three-pieces/#Int/#Int/#Int ThreePiecesR GET /has-three-pieces/#Int/#Int/#Int ThreePiecesR GET
|] |]
instance Yesod master => YesodSubDispatch Subsite (HandlerFor master) where instance Yesod master => YesodSubDispatch Subsite master where
yesodSubDispatch ysre = yesodSubDispatch ysre =
f ysre f ysre
where where

View File

@ -81,7 +81,7 @@ import Yesod.EmbeddedStatic.Generators
embeddedResourceR :: [T.Text] -> [(T.Text, T.Text)] -> Route EmbeddedStatic embeddedResourceR :: [T.Text] -> [(T.Text, T.Text)] -> Route EmbeddedStatic
embeddedResourceR = EmbeddedResourceR embeddedResourceR = EmbeddedResourceR
instance YesodSubDispatch EmbeddedStatic (HandlerT master IO) where instance YesodSubDispatch EmbeddedStatic master where
yesodSubDispatch YesodSubRunnerEnv {..} req = resp yesodSubDispatch YesodSubRunnerEnv {..} req = resp
where where
master = yreSite ysreParentEnv master = yreSite ysreParentEnv

View File

@ -171,7 +171,7 @@ instance RenderRoute Static where
instance ParseRoute Static where instance ParseRoute Static where
parseRoute (x, y) = Just $ StaticRoute x y parseRoute (x, y) = Just $ StaticRoute x y
instance MonadHandler m => YesodSubDispatch Static m where instance YesodSubDispatch Static master where
yesodSubDispatch YesodSubRunnerEnv {..} req = yesodSubDispatch YesodSubRunnerEnv {..} req =
ysreParentRunner handlert ysreParentEnv (fmap ysreToParentRoute route) req ysreParentRunner handlert ysreParentEnv (fmap ysreToParentRoute route) req
where where