module Language.Elm.Yesod (
elmWidget
, YesodElm (..)
, ElmUrl) where
import Control.Monad (liftM)
import Text.Blaze (preEscapedToMarkup)
import Text.Julius
import Yesod.Core (Route (..))
import Yesod.Handler (getUrlRenderParams, GHandler (..))
import Yesod.Widget
import Yesod.Handler (lift, getYesod)
import Language.Elm
import Language.Elm.Quasi
import qualified Data.Text as TS
import qualified Data.Text.Lazy as TL
class YesodElm master where
urlElmJs :: a -> Either (Route master) TS.Text
instance (YesodElm master, render ~ RenderFn (Route master))
=> ToWidget sub master (render -> Elm) where
toWidget = elmWidget
elmWidget :: YesodElm master
=> ElmUrl (Route master)
-> GWidget sub master()
elmWidget source = do
urlF <- lift getUrlRenderParams
mkElmWidget source urlF
master <- lift getYesod
addScriptEither $ urlElmJs master
mkElmWidget :: ElmUrl (Route master)
-> RenderFn (Route master)
-> GWidget sub master ()
mkElmWidget source urlFn =
let (html, css, js) = toParts (urlFn, source) in
do toWidgetHead css
toWidgetHead [julius| #{js} |]
toWidgetBody html
type ElmUrl url = (url -> [(TS.Text, TS.Text)] -> TS.Text) -> Elm
type RenderFn url = (url -> [(TS.Text, TS.Text)] -> TS.Text)