@@ -1,4 +1,4 @@
1−{-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, RankNTypes, GADTs, ScopedTypeVariables, FunctionalDependencies, RecursiveDo, UndecidableInstances, GeneralizedNewtypeDeriving, StandaloneDeriving, EmptyDataDecls, NoMonomorphismRestriction, TemplateHaskell, PolyKinds, TypeOperators, DeriveFunctor, LambdaCase, CPP, ForeignFunctionInterface, DeriveDataTypeable, ConstraintKinds #-}
1+{-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, RankNTypes, GADTs, ScopedTypeVariables, FunctionalDependencies, RecursiveDo, UndecidableInstances, GeneralizedNewtypeDeriving, StandaloneDeriving, EmptyDataDecls, NoMonomorphismRestriction, TemplateHaskell, PolyKinds, TypeOperators, DeriveFunctor, LambdaCase, CPP, ForeignFunctionInterface, DeriveDataTypeable, ConstraintKinds, DefaultSignatures #-}
2module Reflex.Dom.Class where
2module Reflex.Dom.Class where
4import Prelude hiding (mapM, mapM_, sequence, concat)
4import Prelude hiding (mapM, mapM_, sequence, concat)
@@ -13,6 +13,7 @@ import Data.Foldable
13import Control.Monad.Ref
13import Control.Monad.Ref
14import Control.Monad.Reader hiding (mapM, mapM_, forM, forM_, sequence)
14import Control.Monad.Reader hiding (mapM, mapM_, forM, forM_, sequence)
15import Control.Monad.State hiding (mapM, mapM_, forM, forM_, sequence)
15import Control.Monad.State hiding (mapM, mapM_, forM, forM_, sequence)
16+import qualified Control.Monad.State.Strict as Strict hiding (mapM, mapM_, forM, forM_, sequence)
16import Data.Dependent.Sum (DSum (..))
17import Data.Dependent.Sum (DSum (..))
17import GHCJS.DOM.Types hiding (Event)
18import GHCJS.DOM.Types hiding (Event)
18import GHCJS.DOM (WebView)
19import GHCJS.DOM (WebView)
@@ -38,13 +39,18 @@ class ( Reflex t, MonadHold t m, MonadIO m, MonadAsyncException m, Functor m, Mo
38 ) => MonadWidget t m | m -> t where
39 ) => MonadWidget t m | m -> t where
39 type WidgetHost m :: * -> *
40 type WidgetHost m :: * -> *
40 type GuiAction m :: * -> *
41 type GuiAction m :: * -> *
42+ type WidgetOutput t m :: *
43+ type WidgetOutput t m = Event t (WidgetHost m ())
41 askParent :: m Node
44 askParent :: m Node
42 subWidget :: Node -> m a -> m a
45 subWidget :: Node -> m a -> m a
43− subWidgetWithVoidActions :: Node -> m a -> m (a, Event t (WidgetHost m ()))
46+ subWidgetWithVoidActions :: Node -> m a -> m (a, WidgetOutput t m)
44 liftWidgetHost :: WidgetHost m a -> m a --TODO: Is this a good idea?
47 liftWidgetHost :: WidgetHost m a -> m a --TODO: Is this a good idea?
45 schedulePostBuild :: WidgetHost m () -> m ()
48 schedulePostBuild :: WidgetHost m () -> m ()
46 addVoidAction :: Event t (WidgetHost m ()) -> m ()
49 addVoidAction :: Event t (WidgetHost m ()) -> m ()
47− getRunWidget :: IsNode n => m (n -> m a -> WidgetHost m (a, WidgetHost m (), Event t (WidgetHost m ())))
50+ getRunWidget :: IsNode n => m (n -> m a -> WidgetHost m (a, WidgetHost m (), WidgetOutput t m))
51+ tellWidgetOutput :: Ord k => Dynamic t (Map k (WidgetOutput t m)) -> m ()
52+ default tellWidgetOutput :: (WidgetOutput t m ~ Event t (WidgetHost m ()), Ord k) => Dynamic t (Map k (WidgetOutput t m)) -> m ()
53+ tellWidgetOutput = addVoidAction . switch . fmap (mergeWith (>>) . toList) . current
49class Monad m => HasDocument m where
55class Monad m => HasDocument m where
50 askDocument :: m HTMLDocument
56 askDocument :: m HTMLDocument
@@ -55,6 +61,9 @@ instance HasDocument m => HasDocument (ReaderT r m) where
55instance HasDocument m => HasDocument (StateT r m) where
61instance HasDocument m => HasDocument (StateT r m) where
56 askDocument = lift askDocument
62 askDocument = lift askDocument
64+instance HasDocument m => HasDocument (Strict.StateT r m) where
65+ askDocument = lift askDocument
58class Monad m => HasWebView m where
67class Monad m => HasWebView m where
59 askWebView :: m WebView
68 askWebView :: m WebView
@@ -64,6 +73,9 @@ instance HasWebView m => HasWebView (ReaderT r m) where
64instance HasWebView m => HasWebView (StateT r m) where
73instance HasWebView m => HasWebView (StateT r m) where
65 askWebView = lift askWebView
74 askWebView = lift askWebView
76+instance HasWebView m => HasWebView (Strict.StateT r m) where
77+ askWebView = lift askWebView
67newtype Restore m = Restore { restore :: forall a. m a -> IO a }
79newtype Restore m = Restore { restore :: forall a. m a -> IO a }
69class Monad m => MonadIORestore m where
81class Monad m => MonadIORestore m where
@@ -89,9 +101,18 @@ instance HasPostGui t h m => HasPostGui t h (ReaderT r m) where
89 askPostGui = lift askPostGui
101 askPostGui = lift askPostGui
90 askRunWithActions = lift askRunWithActions
102 askRunWithActions = lift askRunWithActions
104+instance HasPostGui t h m => HasPostGui t h (StateT r m) where
105+ askPostGui = lift askPostGui
106+ askRunWithActions = lift askRunWithActions
108+instance HasPostGui t h m => HasPostGui t h (Strict.StateT r m) where
109+ askPostGui = lift askPostGui
110+ askRunWithActions = lift askRunWithActions
92instance MonadWidget t m => MonadWidget t (ReaderT r m) where
112instance MonadWidget t m => MonadWidget t (ReaderT r m) where
93 type WidgetHost (ReaderT r m) = WidgetHost m
113 type WidgetHost (ReaderT r m) = WidgetHost m
94 type GuiAction (ReaderT r m) = GuiAction m
114 type GuiAction (ReaderT r m) = GuiAction m
115+ type WidgetOutput t (ReaderT r m) = WidgetOutput t m
95 askParent = lift askParent
116 askParent = lift askParent
96 subWidget n w = do
117 subWidget n w = do
@@ -108,6 +129,7 @@ instance MonadWidget t m => MonadWidget t (ReaderT r m) where
108 return $ \rootElement w -> do
129 return $ \rootElement w -> do
109 (a, postBuild, voidActions) <- runWidget rootElement $ runReaderT w r
130 (a, postBuild, voidActions) <- runWidget rootElement $ runReaderT w r
110 return (a, postBuild, voidActions)
131 return (a, postBuild, voidActions)
132+ tellWidgetOutput = lift . tellWidgetOutput
112performEvent_ :: MonadWidget t m => Event t (WidgetHost m ()) -> m ()
134performEvent_ :: MonadWidget t m => Event t (WidgetHost m ()) -> m ()
113performEvent_ = addVoidAction
135performEvent_ = addVoidAction