@@ -28,7 +28,7 @@ keycodeEscape :: Int
2828keycodeEscape = 27
2929
3030class ( Reflex t, MonadHold t m, MonadIO m, Functor m, MonadReflexCreateTrigger t m
31− , HasDocument m, HasWebView m, HasWebView (WidgetHost m)
31+ , HasDocument m, HasWebView m, HasWebView (WidgetHost m), MonadIORestore (WidgetHost m)
3232 , MonadIO (WidgetHost m), MonadIO (GuiAction m), Functor (WidgetHost m), MonadSample t (WidgetHost m)
3333 , HasPostGui t (GuiAction m) (WidgetHost m), HasPostGui t (GuiAction m) m, MonadRef m, MonadRef (WidgetHost m)
3434 , Ref m ~ Ref IO, Ref (WidgetHost m) ~ Ref IO --TODO: Eliminate this reliance on IO
@@ -62,6 +62,17 @@ instance HasWebView m => HasWebView (ReaderT r m) where
6262instance HasWebView m => HasWebView (StateT r m) where
6363 askWebView = lift askWebView
6464
65+newtype Restore m = Restore { restore :: forall a. m a -> IO a }
66+
67+class Monad m => MonadIORestore m where
68+ askRestore :: m (Restore m)
69+
70+instance MonadIORestore m => MonadIORestore (ReaderT r m) where
71+ askRestore = do
72+ r <- ask
73+ parentRestore <- lift askRestore
74+ return $ Restore $ \a -> restore parentRestore $ runReaderT a r
75+
6576class (MonadRef h, Ref h ~ Ref m, MonadRef m) => HasPostGui t h m | m -> t h where
6677 askPostGui :: m (h () -> IO ())
6778 askRunWithActions :: m ([DSum (EventTrigger t)] -> h ())