miso-0.7.5.0: ghcjs-src/Miso/Effect.hs
-----------------------------------------------------------------------------
-- |
-- Module : Miso.Effect
-- Copyright : (C) 2016-2017 David M. Johnson
-- License : BSD3-style (see the file LICENSE)
-- Maintainer : David M. Johnson <djohnson.m@gmail.com>
-- Stability : experimental
-- Portability : non-portable
----------------------------------------------------------------------------
module Miso.Effect (
module Miso.Effect.Storage
, module Miso.Effect.XHR
, module Miso.Effect.DOM
, Effect (..)
, noEff
, (<#)
, (#>)
) where
import Data.Bifunctor
import Miso.Effect.Storage
import Miso.Effect.XHR
import Miso.Effect.DOM
-- | An effect represents the results of an update action.
--
-- It consists of the updated model and a list of actions. Each action
-- is run in a new thread so there is no risk of accidentally
-- blocking the application.
data Effect action model
= Effect model [IO action]
instance Functor (Effect action) where
fmap f (Effect m acts) = Effect (f m) acts
instance Applicative (Effect action) where
pure m = Effect m []
Effect fModel fActs <*> Effect xModel xActs = Effect (fModel xModel) (fActs ++ xActs)
instance Monad (Effect action) where
return = pure
Effect m acts >>= f =
case f m of
Effect m' acts' -> Effect m' (acts ++ acts')
instance Bifunctor Effect where
bimap f g (Effect m acts) = Effect (g m) (map (fmap f) acts)
-- | Smart constructor for an 'Effect' with no actions.
noEff :: model -> Effect action model
noEff m = Effect m []
-- | Smart constructor for an 'Effect' with exactly one action.
(<#) :: model -> IO action -> Effect action model
(<#) m a = Effect m [a]
-- | `Effect` smart constructor, flipped
(#>) :: IO action -> model -> Effect action model
(#>) = flip (<#)