@@ -12,6 +12,7 @@ import Language.Haskell.TH
1212import qualified GHCJS.Marshal as JS
1313import qualified GHCJS.Foreign as JS
1414import qualified GHCJS.Types as JS
15+import GHCJS.DOM
1516import GHCJS.DOM.Types
1617import Data.Word
1718import Foreign.Ptr
@@ -34,6 +35,8 @@ import Control.Monad.Fix
3435import Control.Monad.IO.Class
3536import Control.Monad.Exception
3637import Control.Monad.Reader
38+import Control.Monad.State
39+import qualified Control.Monad.State.Strict as Strict
3740import Foreign.Marshal
3841import Data.ByteString (ByteString)
3942import qualified Data.ByteString as BS
@@ -42,7 +45,36 @@ import Data.Coerce
4245import Text.Encoding.Z
4346import Data.Monoid
4447
45−import Reflex.Dom (WithWebView, askWebView, runWithWebView, unWebViewSingleton)
48+class Monad m => HasWebView m where
49+ type WebViewPhantom m :: *
50+ askWebView :: m (WebViewSingleton (WebViewPhantom m))
51+
52+instance HasWebView m => HasWebView (ReaderT r m) where
53+ type WebViewPhantom (ReaderT r m) = WebViewPhantom m
54+ askWebView = lift askWebView
55+
56+instance HasWebView m => HasWebView (StateT r m) where
57+ type WebViewPhantom (StateT r m) = WebViewPhantom m
58+ askWebView = lift askWebView
59+
60+instance HasWebView m => HasWebView (Strict.StateT r m) where
61+ type WebViewPhantom (Strict.StateT r m) = WebViewPhantom m
62+ askWebView = lift askWebView
63+
64+newtype WithWebView x m a = WithWebView { unWithWebView :: ReaderT (WebViewSingleton x) m a } deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadException, MonadAsyncException)
65+
66+runWithWebView :: WithWebView x m a -> WebViewSingleton x -> m a
67+runWithWebView = runReaderT . unWithWebView
68+
69+instance (Monad m) => HasWebView (WithWebView x m) where
70+ type WebViewPhantom (WithWebView x m) = x
71+ askWebView = WithWebView ask
72+
73+withWebViewSingleton :: WebView -> (forall x. WebViewSingleton x -> r) -> r
74+withWebViewSingleton wv f = f $ WebViewSingleton wv
75+
76+-- | A singleton type for a given WebView; we use this to statically guarantee that different WebViews (and thus different javscript contexts) don't get mixed up
77+newtype WebViewSingleton x = WebViewSingleton { unWebViewSingleton :: WebView }
4678
4779#ifdef __GHCJS__
4880type JSFFI_Internal = JS.JSArray (JSRef JSCtx_IO) -> IO (JS.JSRef (JSRef JSCtx_IO))