@@ -3,6 +3,8 @@
33{-# LANGUAGE FlexibleContexts #-}
44{-# LANGUAGE FlexibleInstances #-}
55{-# LANGUAGE MultiParamTypeClasses #-}
6+{-# LANGUAGE Rank2Types #-}
7+{-# LANGUAGE ScopedTypeVariables #-}
68{-# LANGUAGE TemplateHaskell #-}
79{-# LANGUAGE TypeFamilies #-}
810{-# LANGUAGE UndecidableInstances #-}
@@ -26,6 +28,7 @@ module Reflex.Dom.Old
2628 , onEventName
2729 , schedulePostBuild
2830 , text'
31+ , wrapElement
2932 ) where
3033
3134import Control.Arrow (first)
@@ -34,6 +37,7 @@ import Control.Monad
3437import Control.Monad.Exception
3538import Control.Monad.Fix
3639import Control.Monad.IO.Class
40+import Control.Monad.Reader
3741import Control.Monad.Ref
3842import Data.Default
3943import Data.Functor.Misc
@@ -193,3 +197,13 @@ _el_keypress = domEvent Keypress
193197{-# DEPRECATED _el_scrolled "Use 'domEvent Scroll' instead" #-}
194198_el_scrolled :: Reflex t => El t -> Event t Int
195199_el_scrolled = domEvent Scroll
200+
201+wrapElement :: forall t m. MonadWidget t m => (forall en. DOM.HTMLElement -> EventName en -> EventM DOM.Element (EventType en) (Maybe (EventResult en))) -> DOM.HTMLElement -> m (El t)
202+wrapElement eh e = do
203+ let h :: (EventName en, GhcjsDomEvent en) -> IO (Maybe (EventResult en))
204+ h (en, GhcjsDomEvent evt) = runReaderT (eh e en) evt
205+ wrapRawElement e $ (def :: RawElementConfig EventResult t m)
206+ { _rawElementConfig_eventSpec = def
207+ { _ghcjsEventSpec_handler = h
208+ }
209+ }