@@ -1,4 +1,5 @@
11{-# LANGUAGE ConstraintKinds #-}
2+{-# LANGUAGE EmptyDataDecls #-}
23{-# LANGUAGE FlexibleContexts #-}
34{-# LANGUAGE FlexibleInstances #-}
45{-# LANGUAGE FunctionalDependencies #-}
@@ -38,16 +39,16 @@ import qualified GHCJS.DOM.Document as Document
3839import qualified GHCJS.DOM.Node as Node
3940import qualified GHCJS.DOM.Types as DOM
4041
41−type PrerenderClientConstraint t m =
42+type PrerenderClientConstraint js t m =
4243 ( DomBuilder t m
4344 , DomBuilderSpace m ~ GhcjsDomSpace
4445 , HasDocument m
4546 , TriggerEvent t m
46− , Prerender t m
47− , PrerenderBaseConstraints t m
47+ , Prerender js t m
48+ , PrerenderBaseConstraints js t m
4849 )
4950
50−type PrerenderBaseConstraints t m =
51+type PrerenderBaseConstraints js t m =
5152 ( HasJSContext (Performable m)
5253 , HasJSContext m
5354 , MonadFix m
@@ -63,28 +64,30 @@ type PrerenderBaseConstraints t m =
6364 , PrimMonad m
6465 , Ref (Performable m) ~ IORef
6566 , Ref m ~ IORef
67+ , HasJS js m
68+ , HasJS js (Performable m)
6669 )
6770
6871-- | Render the first widget on the server, and the second on the client. The
6972-- hydration builder will run *both* widgets.
7073prerender_
71− :: (Functor m, Reflex t, Prerender t m)
72− => m () -> ((PrerenderClientConstraint t (Client m)) => Client m ()) -> m ()
74+ :: (Functor m, Reflex t, Prerender js t m)
75+ => m () -> ((PrerenderClientConstraint js t (Client m)) => Client m ()) -> m ()
7376prerender_ server client = void $ prerender server client
7477
75−class Prerender t m | m -> t where
78+class Prerender js t m | m -> t js where
7679 -- | Monad in which the client widget is built
7780 type Client m :: * -> *
7881 -- | Render the first widget on the server, and the second on the client. The
7982 -- hydration builder will run *both* widgets, updating the result dynamic at
8083 -- switchover time.
81− prerender :: m a -> ((PrerenderClientConstraint t (Client m)) => Client m a) -> m (Dynamic t a)
84+ prerender :: m a -> ((PrerenderClientConstraint js t (Client m)) => Client m a) -> m (Dynamic t a)
8285
83−instance (Adjustable t m, PrerenderBaseConstraints t m) => Prerender t (HydrationDomBuilderT GhcjsDomSpace t m) where
86+instance (ReflexHost t, Adjustable t m, PrerenderBaseConstraints js t m) => Prerender js t (HydrationDomBuilderT GhcjsDomSpace t m) where
8487 type Client (HydrationDomBuilderT GhcjsDomSpace t m) = HydrationDomBuilderT GhcjsDomSpace t m
8588 prerender _ client = pure <$> client
8689
87−instance (Adjustable t m, PrerenderBaseConstraints t m, ReflexHost t) => Prerender t (HydrationDomBuilderT HydrationDomSpace t m) where
90+instance (Adjustable t m, PrerenderBaseConstraints js t m, ReflexHost t) => Prerender js t (HydrationDomBuilderT HydrationDomSpace t m) where
8891 -- | PostBuildT is needed here because we delay running the client builder
8992 -- until after switchover, at which point the postBuild of @m@ has already fired
9093 type Client (HydrationDomBuilderT HydrationDomSpace t m) = PostBuildT t (HydrationDomBuilderT GhcjsDomSpace t m)
@@ -118,7 +121,9 @@ instance (Adjustable t m, PrerenderBaseConstraints t m, ReflexHost t) => Prerend
118121 insertBefore df =<< deleteToPrerenderEnd doc
119122 holdDyn a0 a'
120123
121−instance SupportsStaticDomBuilder t m => Prerender t (StaticDomBuilderT t m) where
124+data NoJavaScript -- This type should never have a HasJS instance
125+
126+instance (js ~ NoJavaScript, SupportsStaticDomBuilder t m) => Prerender js t (StaticDomBuilderT t m) where
122127 type Client (StaticDomBuilderT t m) = HydrationDomBuilderT GhcjsDomSpace t m
123128 prerender server _ = do
124129 _ <- commentNode $ CommentNodeConfig startMarker Nothing
@@ -126,13 +131,13 @@ instance SupportsStaticDomBuilder t m => Prerender t (StaticDomBuilderT t m) whe
126131 _ <- commentNode $ CommentNodeConfig endMarker Nothing
127132 pure $ pure a
128133
129−instance (Prerender t m, Monad m) => Prerender t (ReaderT r m) where
134+instance (Prerender js t m, Monad m) => Prerender js t (ReaderT r m) where
130135 type Client (ReaderT r m) = ReaderT r (Client m)
131136 prerender server client = do
132137 r <- ask
133138 lift $ prerender (runReaderT server r) (runReaderT client r)
134139
135−instance (Prerender t m, Monad m, Reflex t, MonadFix m, Monoid w) => Prerender t (DynamicWriterT t w m) where
140+instance (Prerender js t m, Monad m, Reflex t, MonadFix m, Monoid w) => Prerender js t (DynamicWriterT t w m) where
136141 type Client (DynamicWriterT t w m) = DynamicWriterT t w (Client m)
137142 prerender server client = do
138143 x <- lift $ prerender (runDynamicWriterT server) (runDynamicWriterT client)
@@ -141,7 +146,7 @@ instance (Prerender t m, Monad m, Reflex t, MonadFix m, Monoid w) => Prerender t
141146 tellDyn w
142147 pure a
143148
144−instance (Prerender t m, Monad m, Reflex t, Semigroup w) => Prerender t (EventWriterT t w m) where
149+instance (Prerender js t m, Monad m, Reflex t, Semigroup w) => Prerender js t (EventWriterT t w m) where
145150 type Client (EventWriterT t w m) = EventWriterT t w (Client m)
146151 prerender server client = do
147152 x <- lift $ prerender (runEventWriterT server) (runEventWriterT client)
@@ -151,7 +156,7 @@ instance (Prerender t m, Monad m, Reflex t, Semigroup w) => Prerender t (EventWr
151156 pure a
152157
153158-- TODO
154−--instance (Prerender t m, Monad m) => Prerender t (RequesterT t request response m) where
159+--instance (Prerender js t m, Monad m) => Prerender js t (RequesterT t request response m) where
155160-- type Client (RequesterT t request response m) = RequesterT t request response (Client m)
156161-- prerender server client = mdo
157162-- response :: Event t (RequesterData response) <- requesting request
@@ -160,7 +165,7 @@ instance (Prerender t m, Monad m, Reflex t, Semigroup w) => Prerender t (EventWr
160165-- request = switch $ current request' :: Event t (RequesterData request)
161166-- pure a
162167
163−instance (Prerender t m, Monad m, Reflex t, MonadFix m, Group q, Additive q, Query q) => Prerender t (QueryT t q m) where
168+instance (Prerender js t m, Monad m, Reflex t, MonadFix m, Group q, Additive q, Query q) => Prerender js t (QueryT t q m) where
164169 type Client (QueryT t q m) = QueryT t q (Client m)
165170 prerender server client = mdo
166171 result <- queryDyn query
@@ -169,11 +174,11 @@ instance (Prerender t m, Monad m, Reflex t, MonadFix m, Group q, Additive q, Que
169174 query = incrementalToDynamic =<< inc -- Can we avoid the incrementalToDynamic?
170175 pure a
171176
172−instance (Prerender t m, Monad m) => Prerender t (InputDisabledT m) where
177+instance (Prerender js t m, Monad m) => Prerender js t (InputDisabledT m) where
173178 type Client (InputDisabledT m) = Client m
174179 prerender (InputDisabledT server) client = InputDisabledT $ prerender server client
175180
176−instance (Prerender t m, Monad m, ReflexHost t) => Prerender t (PostBuildT t m) where
181+instance (Prerender js t m, Monad m, ReflexHost t) => Prerender js t (PostBuildT t m) where
177182 type Client (PostBuildT t m) = PostBuildT t (Client m)
178183 prerender server client = PostBuildT $ do
179184 pb <- ask