-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Routing and retractable back button for reflex-dom -- -- Library that automates widget switches and back button retract stack. -- See README.md @package reflex-dom-retractable @version 0.1.7.0 -- | Tagless final interface to the retractable stack of widgets. To use -- the API drop retractStack into your code where you want to -- display widgets with history. For instance, turn all your frontend -- into retractable widget: -- --
-- import Control.Monad
-- import Reflex.Dom
-- import Reflex.Dom.Retractable.Class
--
-- frontend :: (MonadWidget t m, MonadRetract t m) => m ()
-- frontend = void $ retractStack $ pageA 42
--
-- pageA :: (MonadWidget t m, MonadRetract t m) => Int -> m ()
-- pageA n = do
-- e <- button "Go page B"
-- void $ nextWidget $ ffor e $ const Retractable {
-- retractableNext = pageB $ n + 1
-- , retractablePrev = Just $ pure $ pageA n
-- }
--
-- pageB :: (MonadWidget t m, MonadRetract t m) => Int -> m ()
-- pageB n = do
-- e <- button "Go page A"
-- void $ nextWidget $ ffor e $ const Retractable {
-- retractableNext = pageA $ n + 1
-- , retractablePrev = Just $ pure $ pageB n
-- }
--
module Reflex.Dom.Retractable.Class
-- | Information about widget that attaches information how to return to
-- the widget.
data Retractable t m
Retractable :: m () -> Maybe (Dynamic t (m ())) -> Retractable t m
-- | Which widget we are switching in
[retractableNext] :: Retractable t m -> m ()
-- | Possible return to the current widget. Nothing means that the
-- current widget is not rembered in retract stack and is forgoten.
-- Dynamic allows to save internal state of widget on return.
[retractablePrev] :: Retractable t m -> Maybe (Dynamic t (m ()))
-- | Helper to transform underlying monad in Retractable
morphRetractable :: Reflex t => (forall a. n a -> m a) -> Retractable t n -> Retractable t m
-- | Defines context of widget that can switch control to next widget and
-- can be returned back with preserving of state.
class (MonadHold t m, MonadFix m, Reflex t, Adjustable t m) => MonadRetract t m
-- | Switch current widget to the next widget. Returns event that fires
-- when the switching is about to happen.
nextWidget :: MonadRetract t m => Event t (Retractable t m) -> m (Event t ())
-- | Switch to previous widget in stack. Returns event that fires when the
-- switchin is about to happen.
retract :: MonadRetract t m => Event t () -> m (Event t ())
-- | Wipe retract history to the given amount of items (or all if
-- Nothing is passed). Returns event that fires when the history
-- was changed.
wipeRetract :: MonadRetract t m => Event t (Maybe Int) -> m (Event t ())
-- | Get event that fires when any of input events in nextWidget is
-- triggered. It's used for implementation of retractable stack.
nextWidgetEvent :: MonadRetract t m => m (Event t (Retractable t m))
-- | Get event that fires when any of input events in retract is
-- triggered. It's used for implementation of retractable stack.
retractEvent :: MonadRetract t m => m (Event t ())
-- | Get event that fires when any of input events in wipeRetract is
-- triggered. It's used for implementation of retractable stack.
wipeRetractEvent :: MonadRetract t m => m (Event t (Maybe Int))
-- | Get current stack of widget history
getRetractStack :: MonadRetract t m => m (Dynamic t [Retractable t m])
-- | Execute subcomputation with given widget history. Affects results of
-- getRetractStack.
withRetractStack :: MonadRetract t m => Dynamic t [Retractable t m] -> m a -> m a
-- | All body of the widget will be rerendered when some subcomputation
-- emits switching event. Plug the function somewhere close to the root
-- of your reflex frontend and use functions from MonadRetract
-- class to control switching content of the widget.
retractStack :: forall t m. MonadRetract t m => m () -> m (Event t ())
instance GHC.Generics.Generic (Reflex.Dom.Retractable.Class.Retractable t m)
instance Reflex.Dom.Retractable.Class.MonadRetract t m => Reflex.Dom.Retractable.Class.MonadRetract t (Control.Monad.Trans.Reader.ReaderT r m)
-- | Plug-in implementation for MonadRetract using wrapper around
-- ReaderT. Internal module, implementation details can be changed
-- at any moment.
module Reflex.Dom.Retractable.Trans.Internal
-- | Helper to simplify types in RetractEnv
type RetractableT t m = Retractable t (RetractT t m)
-- | Internal state of retractable widget
data RetractEnv t m
RetractEnv :: !RetractableT t m -> IO () -> !Event t (RetractableT t m) -> !IO () -> !Event t () -> !Maybe Int -> IO () -> !Event t (Maybe Int) -> !Dynamic t [RetractableT t m] -> RetractEnv t m
[renvNextFire] :: RetractEnv t m -> !RetractableT t m -> IO ()
[renvNextEvent] :: RetractEnv t m -> !Event t (RetractableT t m)
[renvRetractFire] :: RetractEnv t m -> !IO ()
[renvRetractEvent] :: RetractEnv t m -> !Event t ()
[renvWipeFire] :: RetractEnv t m -> !Maybe Int -> IO ()
[renvWipeEvent] :: RetractEnv t m -> !Event t (Maybe Int)
[renvStack] :: RetractEnv t m -> !Dynamic t [RetractableT t m]
-- | Allocate new environment for RetractT.
newRetractEnv :: (Reflex t, TriggerEvent t m) => m (RetractEnv t m)
-- | Plug-in implementation of MonadRetract.
newtype RetractT t m a
RetractT :: ReaderT (RetractEnv t m) m a -> RetractT t m a
[unRetractT] :: RetractT t m a -> ReaderT (RetractEnv t m) m a
-- | Execute retractable widget with given environment.
runRetractT :: RetractT t m a -> RetractEnv t m -> m a
-- | Simplified version of runRetractT
runRetract :: (Reflex t, TriggerEvent t m) => RetractT t m a -> m a
instance GHC.Generics.Generic (Reflex.Dom.Retractable.Trans.Internal.RetractEnv t m)
instance Reflex.Dom.Builder.Class.HasDocument m => Reflex.Dom.Builder.Class.HasDocument (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Foreign.JavaScript.TH.HasJSContext m => Foreign.JavaScript.TH.HasJSContext (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Control.Monad.Ref.MonadRef m => Control.Monad.Ref.MonadRef (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance GHC.Generics.Generic (Reflex.Dom.Retractable.Trans.Internal.RetractT t m a)
instance GHC.Base.Monad m => GHC.Base.Monad (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance GHC.Base.Applicative m => GHC.Base.Applicative (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance GHC.Base.Functor m => GHC.Base.Functor (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.PostBuild.Class.PostBuild t m => Reflex.PostBuild.Class.PostBuild t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.NotReady.Class.NotReady t m => Reflex.NotReady.Class.NotReady t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.PerformEvent.Class.PerformEvent t m => Reflex.PerformEvent.Class.PerformEvent t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.TriggerEvent.Class.TriggerEvent t m => Reflex.TriggerEvent.Class.TriggerEvent t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.Class.MonadHold t m => Reflex.Class.MonadHold t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.Class.MonadSample t m => Reflex.Class.MonadSample t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.Dom.Builder.Class.DomBuilder t m => Reflex.Dom.Builder.Class.DomBuilder t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Language.Javascript.JSaddle.Types.MonadJSM m => Language.Javascript.JSaddle.Types.MonadJSM (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance (Data.Patch.Group q, Data.Patch.Additive q, Reflex.Query.Class.Query q, GHC.Classes.Eq q, Reflex.Query.Class.MonadQuery t q m, GHC.Base.Monad m) => Reflex.Query.Class.MonadQuery t q (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance (GHC.Base.Monoid w, Reflex.DynamicWriter.Class.DynamicWriter t w m) => Reflex.DynamicWriter.Class.DynamicWriter t w (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance (GHC.Base.Monoid w, Reflex.BehaviorWriter.Class.MonadBehaviorWriter t w m) => Reflex.BehaviorWriter.Class.MonadBehaviorWriter t w (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance (GHC.Base.Semigroup w, Reflex.EventWriter.Class.EventWriter t w m) => Reflex.EventWriter.Class.EventWriter t w (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.Requester.Class.Requester t m => Reflex.Requester.Class.Requester t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.Host.Class.MonadReflexCreateTrigger t m => Reflex.Host.Class.MonadReflexCreateTrigger t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Control.Monad.Trans.Class.MonadTrans (Reflex.Dom.Retractable.Trans.Internal.RetractT t)
instance Control.Monad.Reader.Class.MonadReader e m => Control.Monad.Reader.Class.MonadReader e (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance Reflex.Adjustable.Class.Adjustable t m => Reflex.Adjustable.Class.Adjustable t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
instance (Reflex.PerformEvent.Class.PerformEvent t m, Reflex.Class.MonadHold t m, Reflex.Adjustable.Class.Adjustable t m, Control.Monad.Fix.MonadFix m, Control.Monad.IO.Class.MonadIO (Reflex.PerformEvent.Class.Performable m)) => Reflex.Dom.Retractable.Class.MonadRetract t (Reflex.Dom.Retractable.Trans.Internal.RetractT t m)
-- | Plug-in implementation for MonadRetract using wrapper around
-- ReaderT.
--
-- Example of use:
--
--
-- import Control.Monad
-- import Reflex.Dom
-- import Reflex.Dom.Retractable
--
-- main :: IO ()
-- main = mainWidget $ runRetract frontend
--
-- frontend :: (MonadWidget t m, MonadRetract t m) => m ()
-- frontend = void $ retractStack $ pageA 42
--
-- pageA :: (MonadWidget t m, MonadRetract t m) => Int -> m ()
-- pageA n = do
-- e <- button "Go page B"
-- void $ nextWidget $ ffor e $ const Retractable {
-- retractableNext = pageB $ n + 1
-- , retractablePrev = Just $ pure $ pageA n
-- }
--
-- pageB :: (MonadWidget t m, MonadRetract t m) => Int -> m ()
-- pageB n = do
-- e <- button "Go page A"
-- void $ nextWidget $ ffor e $ const Retractable {
-- retractableNext = pageA $ n + 1
-- , retractablePrev = Just $ pure $ pageB n
-- }
--
module Reflex.Dom.Retractable.Trans
-- | Plug-in implementation of MonadRetract.
data RetractT t m a
-- | Internal state of retractable widget
data RetractEnv t m
-- | Allocate new environment for RetractT.
newRetractEnv :: (Reflex t, TriggerEvent t m) => m (RetractEnv t m)
-- | Execute retractable widget with given environment.
runRetractT :: RetractT t m a -> RetractEnv t m -> m a
-- | Simplified version of runRetractT
runRetract :: (Reflex t, TriggerEvent t m) => RetractT t m a -> m a
-- | Small library that implements back button feature for reflex-dom
-- widgets. See Reflex.Dom.Retractable.Trans for usage examples.
module Reflex.Dom.Retractable