module Language.Elm.Yesod (
elmWidget
, YesodElm (..)
, ElmUrl) where
import Control.Monad (liftM)
import Text.Blaze (preEscapedToMarkup)
import Text.Julius
import Yesod.Core (Route (..), Yesod(..), ScriptLoadPosition(..))
import Yesod.Handler
import Yesod.Widget
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 (Yesod master, YesodElm master, render ~ RenderFn (Route master))
=> ToWidget sub master (render -> Elm) where
toWidget = elmWidget
elmWidget :: (Yesod master, YesodElm master)
=> ElmUrl (Route master)
-> GWidget sub master()
elmWidget source = do
urlF <- lift getUrlRenderParams
master <- lift getYesod
mkElmWidget source urlF (jsLoader master)
addScriptEither $ urlElmJs master
mkElmWidget :: Yesod master
=> ElmUrl (Route master)
-> RenderFn (Route master)
-> ScriptLoadPosition master
-> GWidget sub master ()
mkElmWidget source urlFn jsl =
let (html, css, js) = toParts (urlFn, source)
initscript = [julius| Dispatcher.initialize(); |]
in do toWidgetHead css
toWidgetBody [julius| #{rawJS js} |]
toWidget html
case jsl of
BottomOfBody -> toWidget initscript
otherwise -> toWidgetBody initscript
type ElmUrl url = (url -> [(TS.Text, TS.Text)] -> TS.Text) -> Elm
type RenderFn url = (url -> [(TS.Text, TS.Text)] -> TS.Text)