glazier-react-examples-0.6.0.0: examples/todo/haskell/app/Todo/Todo/Run.hs
{-# LANGUAGE CPP #-}
module Todo.Todo.Run
( run
) where
import Control.Concurrent.STM
import Control.Monad
import Control.Monad.Trans.Class
import Control.Monad.Trans.Maybe
import qualified GHCJS.Types as J
import qualified Glazier.React.Command.Run as R
import qualified JavaScript.Extras as JE
import qualified Pipes.Concurrent as PC
import Todo.Todo
run :: PC.Output Action -> Command -> IO ()
run _ (SetPropertyCommand prop j) = JE.setProperty prop j
run _ (RenderCommand sm props j) = R.componentSetState sm props j
run _ (FocusNodeCommand j) = js_focus j
run output SendDestroyActionCommand =
void $ runMaybeT $ lift $ atomically $ PC.send output DestroyAction >>= guard
#ifdef __GHCJS__
foreign import javascript unsafe
"if ($1 && $1['focus']) { $1['focus'](); }"
js_focus :: J.JSVal -> IO ()
#else
js_focus :: J.JSVal -> IO ()
js_focus _ = pure ()
#endif