@@ -31,6 +31,7 @@ import Reflex.TriggerEvent.Base hiding (askEvents)
31import Reflex.TriggerEvent.Class
31import Reflex.TriggerEvent.Class
33import Control.Concurrent.Chan
33import Control.Concurrent.Chan
34+import Control.Exception (evaluate)
34import Control.Lens hiding (element, ix)
35import Control.Lens hiding (element, ix)
35import Control.Monad.Exception
36import Control.Monad.Exception
36import Control.Monad.Primitive
37import Control.Monad.Primitive
@@ -224,6 +225,9 @@ wrap e cfg = do
224 liftIO $ forM_ mv $ \v -> writeChan events [TriggerRef triggerRef :=> TriggerInvocation v (return ())]
225 liftIO $ forM_ mv $ \v -> writeChan events [TriggerRef triggerRef :=> TriggerInvocation v (return ())]
225 return $ en :=> EventFilterTriggerRef triggerRef
226 return $ en :=> EventFilterTriggerRef triggerRef
228+ let h :: forall en. (EventName en, GhcjsDomEvent en) -> JSM (Maybe (er en))
229+ h = _ghcjsEventSpec_handler $ _rawElementConfig_eventSpec cfg -- Note: this needs to be done strictly and outside of the newFanEventWithTrigger, so that the newFanEventWithTrigger doesn't retain the entire cfg, which can cause a cyclic dependency that the GC won't be able to clean up
230+ _ <- liftIO $ evaluate h
227 ctx <- askJSM
231 ctx <- askJSM
228 newFanEventWithTrigger $ \(WrapArg en) t ->
232 newFanEventWithTrigger $ \(WrapArg en) t ->
229 case DMap.lookup en eventTriggerRefs of
233 case DMap.lookup en eventTriggerRefs of
@@ -233,7 +237,6 @@ wrap e cfg = do
233 writeIORef r Nothing
237 writeIORef r Nothing
234 Nothing -> (`runJSM` ctx) <$> (`runJSM` ctx) (elementOnEventName en e $ do
238 Nothing -> (`runJSM` ctx) <$> (`runJSM` ctx) (elementOnEventName en e $ do
235 evt <- DOM.event
239 evt <- DOM.event
236− let h = _ghcjsEventSpec_handler $ _rawElementConfig_eventSpec cfg
237 mv <- lift $ h (en, GhcjsDomEvent evt)
240 mv <- lift $ h (en, GhcjsDomEvent evt)
238 case mv of
241 case mv of
239 Nothing -> return ()
242 Nothing -> return ()