module Web.Front where

import           Data.Text                 (Text)

import           Bridge
import           Text.Blaze.Front
import           Text.Blaze.Front.Renderer

import qualified Data.Text                 as T

-- | Generate message that will be pushed to client(s) based on underlying communication.
createTask
  :: Show a
  => Text -- ^ DOM Element Id.
  -> (t -> Markup a) -- ^ How to render state.
  -> t -- ^ State to render.
  -> ClientTask a -- ^ Message that will be pushed to client(s).
createTask :: Text -> (t -> Markup a) -> t -> ClientTask a
createTask eid :: Text
eid renderer :: t -> Markup a
renderer state :: t
state = ClientTask a
task
  where rhtml :: RenderHtml
rhtml = Text -> Text -> RenderHtml
AttachText Text
eid (String -> Text
T.pack (String -> Text) -> (Markup a -> String) -> Markup a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Markup a -> String
forall act. Show act => Markup act -> String
renderHtml (Markup a -> Text) -> Markup a -> Text
forall a b. (a -> b) -> a -> b
$ Markup a
markup)
        markup :: Markup a
markup = t -> Markup a
renderer t
state
        task :: ClientTask a
task = ClientTask :: forall a. [RenderHtml] -> [CallbackAction a] -> ClientTask a
ClientTask
          { executeRenderHtml :: [RenderHtml]
executeRenderHtml = [RenderHtml
rhtml]
          , executeAction :: [CallbackAction a]
executeAction = Markup a -> [CallbackAction a] -> [CallbackAction a]
forall a. Markup a -> [CallbackAction a] -> [CallbackAction a]
registerEvents Markup a
markup []
          }

emptyTask :: ClientTask a
emptyTask :: ClientTask a
emptyTask = ClientTask :: forall a. [RenderHtml] -> [CallbackAction a] -> ClientTask a
ClientTask { executeRenderHtml :: [RenderHtml]
executeRenderHtml = [], executeAction :: [CallbackAction a]
executeAction = [] }