glazier-react-examples-0.6.0.0: examples/todo/haskell/app/Todo/App/Run.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
module Todo.App.Run where
import Control.Concurrent.STM
import Control.Concurrent.MVar
import Control.Lens
import Control.Monad
import Control.Monad.Trans.Class
import Control.Monad.Trans.Maybe
import Data.Foldable
import qualified Glazier.React.Command.Run as R
import qualified Glazier.React.Component as R
import qualified Glazier.React.Widgets.Input.Run as W.Input
import qualified Glazier.React.Widgets.List as W.List
import qualified Glazier.React.Widgets.List.Run as W.List
import qualified Pipes.Concurrent as PC
import Todo.App as TD.App
import qualified Todo.Footer.Run as TD.Footer
import qualified Todo.Todo.Run as TD.Todo
run :: MVar Int -> R.ReactComponent -> PC.Output Action -> Command -> IO ()
run _ _ _ (RenderCommand sm props j) = R.componentSetState sm props j
run _ _ output (SendTodosActionsCommand acts) =
void $ runMaybeT $
traverse_ (\act -> lift $ atomically $ PC.send output act >>= guard) (TodosAction <$> acts)
run _ _ output (SendFooterActionCommand act) =
void $ atomically $ PC.send output (FooterAction act)
run _ _ _ (InputCommand cmd) = W.Input.run cmd
run muid comp output (TodosCommand cmd) =
W.List.run
(\k -> TD.Todo.run (contramap (TodosAction . W.List.ItemAction k) output))
muid
comp
(contramap TodosAction output)
cmd
run _ _ _ (FooterCommand cmd) = TD.Footer.run cmd