miso-0.21.1.0: A tasty Haskell front-end framework

Copyright (C) 2016-2018 David M. Johnson BSD3-style (see the file LICENSE) David M. Johnson experimental non-portable None Haskell2010

Miso.Types

Contents

Description

Synopsis

# Documentation

data App model action Source #

Application entry point

Constructors

 App Fieldsmodel :: modelinitial modelupdate :: action -> model -> Effect action modelFunction to update model, optionally provide effects. See the Transition monad for succinctly expressing model transitions.view :: model -> View actionFunction to draw Viewsubs :: [Sub action]List of subscriptions to run during application lifetimeevents :: Map MisoString BoolList of delegated events that the body element will listen forinitialAction :: actionInitial action that is run after the application has loadedmountPoint :: Maybe MisoStringroot element for DOM diff

data Effect action model Source #

An effect represents the results of an update action.

It consists of the updated model and a list of subscriptions. Each Sub is run in a new thread so there is no risk of accidentally blocking the application.

Instances

 Source # Methodsbimap :: (a -> b) -> (c -> d) -> Effect a c -> Effect b d #first :: (a -> b) -> Effect a c -> Effect b c #second :: (b -> c) -> Effect a b -> Effect a c # Monad (Effect action) Source # Methods(>>=) :: Effect action a -> (a -> Effect action b) -> Effect action b #(>>) :: Effect action a -> Effect action b -> Effect action b #return :: a -> Effect action a #fail :: String -> Effect action a # Functor (Effect action) Source # Methodsfmap :: (a -> b) -> Effect action a -> Effect action b #(<$) :: a -> Effect action b -> Effect action a # Applicative (Effect action) Source # Methodspure :: a -> Effect action a #(<*>) :: Effect action (a -> b) -> Effect action a -> Effect action b #(*>) :: Effect action a -> Effect action b -> Effect action b #(<*) :: Effect action a -> Effect action b -> Effect action a # type Sub action = Sink action -> JSM () Source # Type synonym for constructing event subscriptions. The Sink callback is used to dispatch actions which are then fed back to the update function. # The Transition Monad type Transition action model = StateT model (Writer [Sub action]) Source # A monad for succinctly expressing model transitions in the update function. Transition is a state monad so it abstracts over manually passing the model around. It's also a writer monad where the accumulator is a list of scheduled IO actions. Multiple actions can be scheduled using Control.Monad.Writer.Class.tell from the mtl library and a single action can be scheduled using scheduleIO. Tip: use the Transition monad in combination with the stateful lens operators (all operators ending in "="). The following example assumes the lenses field1, counter and field2 are in scope and that the LambdaCase language extension is enabled: myApp = App { update = fromTransition . \case MyAction1 -> do field1 .= value1 counter += 1 MyAction2 -> do field2 %= f scheduleIO$ do
putStrLn "Hello"
putStrLn "World!"
, ...
}


mapAction :: (actionA -> actionB) -> Transition actionA model r -> Transition actionB model r Source #

Turn a transition that schedules subscriptions that consume actions of type a into a transition that schedules subscriptions that consume actions of type b using the supplied function of type a -> b.

Arguments

 :: Transition action model () -> model -> Effect action model model update function.

Convert a Transition computation to a function that can be given to update.

Arguments

 :: (model -> Effect action model) model update function -> Transition action model ()

Convert an update function to a Transition computation.

scheduleIO :: JSM action -> Transition action model () Source #

Schedule a single IO action for later execution.

Note that multiple IO action can be scheduled using Control.Monad.Writer.Class.tell from the mtl library.

scheduleIO_ :: JSM () -> Transition action model () Source #

Like scheduleIO but doesn't cause an action to be dispatched to the update function.

This is handy for scheduling IO computations where you don't care about their results or when they complete.

scheduleIOFor_ :: Foldable f => JSM (f action) -> Transition action model () Source #

Like scheduleIO_ but generalized to any instance of Foldable

This is handy for scheduling IO computations that return a Maybe value

scheduleSub :: Sub action -> Transition action model () Source #

Like scheduleIO but schedules a subscription which is an IO computation that has access to a Sink which can be used to asynchronously dispatch actions to the update function.

A use-case is scheduling an IO computation which creates a 3rd-party JS widget which has an associated callback. The callback can then call the sink to turn events into actions. To do this without accessing a sink requires going via a Subscription which introduces a leaky-abstraction.