on develop help sign in
Add MonadJS to HasJS & MonadJS orphan instances
5793a2fHamish Mackenzie
reflex-dom-core/reflex-dom-core.cabal+1
@@ -76,6 +76,7 @@ library
76
76
77 exposed-modules:
77 exposed-modules:
78 Foreign.JavaScript.TH
78 Foreign.JavaScript.TH
79+ Foreign.JavaScript.Orphans
79 Reflex.Dom.Builder.Class
80 Reflex.Dom.Builder.Class
80 Reflex.Dom.Builder.Class.Events
81 Reflex.Dom.Builder.Class.Events
81 Reflex.Dom.Builder.Immediate
82 Reflex.Dom.Builder.Immediate
reflex-dom-core/src/Foreign/JavaScript/Orphans.hsnew file+28
@@ -0,0 +1,28 @@
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE FlexibleContexts #-}
3+{-# OPTIONS_GHC -fno-warn-orphan-instances #-}
4+module Foreign.JavaScript.Orphans where
5+
6+#ifndef __GHCJS__
7+
8+import Reflex.Host.Class (ReflexHost, HostFrame)
9+import Control.Monad.Trans.Class (lift)
10+import Reflex.PostBuild.Base (PostBuildT)
11+import Reflex.PerformEvent.Base (PerformEventT(..))
12+import Reflex.DynamicWriter (DynamicWriterT)
13+import Reflex.Requester.Base (RequesterT)
14+import GHCJS.DOM.Types (MonadJSM(..))
15+
16+instance (MonadJSM m, ReflexHost t) => MonadJSM (PostBuildT t m) where
17+ liftJSM' = lift . liftJSM'
18+
19+instance (MonadJSM (HostFrame t), ReflexHost t) => MonadJSM (PerformEventT t m) where
20+ liftJSM' = PerformEventT . lift . liftJSM'
21+
22+instance MonadJSM m => MonadJSM (DynamicWriterT t w m) where
23+ liftJSM' = lift . liftJSM'
24+
25+instance MonadJSM m => MonadJSM (RequesterT t request response m) where
26+ liftJSM' = lift . liftJSM'
27+
28+#endif
reflex-dom-core/src/Foreign/JavaScript/TH.hs+3−1
@@ -20,6 +20,7 @@
20{-# LANGUAGE JavaScriptFFI #-}
20{-# LANGUAGE JavaScriptFFI #-}
21#endif
21#endif
22module Foreign.JavaScript.TH ( module Foreign.JavaScript.TH
22module Foreign.JavaScript.TH ( module Foreign.JavaScript.TH
23+ , module Foreign.JavaScript.Orphans
23#ifdef USE_TEMPLATE_HASKELL
24#ifdef USE_TEMPLATE_HASKELL
24 , Safety (..)
25 , Safety (..)
25#endif
26#endif
@@ -34,6 +35,7 @@ import Reflex.PerformEvent.Base
34import Reflex.PerformEvent.Class
35import Reflex.PerformEvent.Class
35import Reflex.PostBuild.Base
36import Reflex.PostBuild.Base
36import Reflex.Requester.Base
37import Reflex.Requester.Base
38+import Foreign.JavaScript.Orphans
37
39
38#ifdef USE_TEMPLATE_HASKELL
40#ifdef USE_TEMPLATE_HASKELL
39import Language.Haskell.TH
41import Language.Haskell.TH
@@ -227,7 +229,7 @@ instance ToJS x (JSFun x) where
227class IsJSContext x where
229class IsJSContext x where
228 data JSRef x
230 data JSRef x
229
231
230−class (Monad m, MonadIO (JSX m), MonadFix (JSX m), MonadJS x (JSX m)) => HasJS x m | m -> x where
232+class (Monad m, MonadJSM (JSX m), MonadFix (JSX m), MonadJS x (JSX m)) => HasJS x m | m -> x where
231 type JSX m :: * -> *
233 type JSX m :: * -> *
232 liftJS :: JSX m a -> m a
234 liftJS :: JSX m a -> m a
233
235
reflex-dom-core/src/Reflex/Dom/Main.hs−5
@@ -82,11 +82,6 @@ mainWidgetWithCss css w = withJSContextSingleton $ \jsSing -> do
82
82
83type Widget x = PostBuildT Spider (ImmediateDomBuilderT Spider (WithJSContextSingleton x (PerformEventT Spider (SpiderHost Global)))) --TODO: Make this more abstract --TODO: Put the WithJSContext underneath PerformEventT - I think this would perform better
83type Widget x = PostBuildT Spider (ImmediateDomBuilderT Spider (WithJSContextSingleton x (PerformEventT Spider (SpiderHost Global)))) --TODO: Make this more abstract --TODO: Put the WithJSContext underneath PerformEventT - I think this would perform better
84
84
85−#ifndef __GHCJS__
86−instance MonadJSM m => MonadJSM (PostBuildT t m) where
87− liftJSM' = PostBuildT . liftJSM'
88−#endif
89−
90{-# INLINABLE attachWidget #-}
85{-# INLINABLE attachWidget #-}
91attachWidget :: DOM.IsElement e => e -> JSContextSingleton x -> Widget x a -> JSM a
86attachWidget :: DOM.IsElement e => e -> JSContextSingleton x -> Widget x a -> JSM a
92attachWidget rootElement wv w = fst <$> attachWidget' rootElement wv w
87attachWidget rootElement wv w = fst <$> attachWidget' rootElement wv w
reflex-dom/reflex-dom.cabal+1
@@ -45,6 +45,7 @@ library
45 Reflex.Dom.Internal
45 Reflex.Dom.Internal
46 reexported-modules:
46 reexported-modules:
47 Foreign.JavaScript.TH
47 Foreign.JavaScript.TH
48+ , Foreign.JavaScript.Orphans
48 , Reflex.Dom.Builder.Class
49 , Reflex.Dom.Builder.Class
49 , Reflex.Dom.Builder.Class.Events
50 , Reflex.Dom.Builder.Class.Events
50 , Reflex.Dom.Builder.Immediate
51 , Reflex.Dom.Builder.Immediate