@@ -2,6 +2,7 @@
22{-# LANGUAGE CPP #-}
33{-# LANGUAGE ConstraintKinds #-}
44{-# LANGUAGE DataKinds #-}
5+{-# LANGUAGE DefaultSignatures #-}
56{-# LANGUAGE EmptyDataDecls #-}
67{-# LANGUAGE FlexibleContexts #-}
78{-# LANGUAGE FlexibleInstances #-}
@@ -26,7 +27,6 @@ module Reflex.Dom.Builder.Immediate
2627 , ImmediateDomBuilderEnv (..)
2728 , ImmediateDomBuilderT (..)
2829 , runImmediateDomBuilderT
29− , askDocument
3030 , askParent
3131 , askEvents
3232 , append
@@ -49,6 +49,7 @@ module Reflex.Dom.Builder.Immediate
4949 , Pair1 (..)
5050 , Maybe1 (..)
5151 , GhcjsEventSpec (..)
52+ , HasDocument (..)
5253 , ghcjsEventSpec_filters
5354 , ghcjsEventSpec_handler
5455 , GhcjsEventHandler (..)
@@ -81,10 +82,13 @@ import Foreign.JavaScript.TH
8182import Reflex.Class as Reflex
8283import Reflex.Dom.Builder.Class
8384import Reflex.Dynamic
85+import Reflex.DynamicWriter (DynamicWriterT)
86+import Reflex.EventWriter (EventWriterT)
8487import Reflex.Host.Class
8588import qualified Reflex.Patch.DMap as PatchDMap
8689import qualified Reflex.Patch.DMapWithMove as PatchDMapWithMove
8790import Reflex.PerformEvent.Class
91+import Reflex.PostBuild.Base
8892import Reflex.PostBuild.Class
8993import Reflex.TriggerEvent.Base hiding (askEvents)
9094import qualified Reflex.TriggerEvent.Base as TriggerEventT (askEvents)
@@ -96,6 +100,8 @@ import Control.Monad.Exception
96100import Control.Monad.Primitive
97101import Control.Monad.Reader
98102import Control.Monad.Ref
103+import Control.Monad.State.Strict (StateT)
104+import qualified Control.Monad.State as Lazy (StateT)
99105#ifndef USE_TEMPLATE_HASKELL
100106import Data.Functor.Contravariant (phantom)
101107#endif
@@ -215,9 +221,21 @@ runImmediateDomBuilderT (ImmediateDomBuilderT a) env eventChan = flip runTrigger
215221 _ <- Window.requestAnimationFrame win cb
216222 return ()
217223
218−{-# INLINABLE askDocument #-}
219−askDocument :: Monad m => ImmediateDomBuilderT t m Document
220−askDocument = ImmediateDomBuilderT $ asks _immediateDomBuilderEnv_document
224+class Monad m => HasDocument m where
225+ askDocument :: m Document
226+ default askDocument :: (m ~ f m', MonadTrans f, Monad m', HasDocument m') => f m' Document
227+ askDocument = lift askDocument
228+
229+instance HasDocument m => HasDocument (ReaderT r m)
230+instance HasDocument m => HasDocument (StateT s m)
231+instance HasDocument m => HasDocument (Lazy.StateT s m)
232+instance HasDocument m => HasDocument (EventWriterT t w m)
233+instance HasDocument m => HasDocument (DynamicWriterT t w m)
234+instance HasDocument m => HasDocument (PostBuildT t m)
235+
236+instance Monad m => HasDocument (ImmediateDomBuilderT t m) where
237+ {-# INLINABLE askDocument #-}
238+ askDocument = ImmediateDomBuilderT $ asks _immediateDomBuilderEnv_document
221239
222240{-# INLINABLE askParent #-}
223241askParent :: Monad m => ImmediateDomBuilderT t m Node