@@ -1,4 +1,4 @@
1−{-# LANGUAGE QuasiQuotes #-}
1+{-# LANGUAGE QuasiQuotes, TypeSynonymInstances #-}
22{- | This module provides a function for compiling Elm source code into a Yesod widget.
33 In order to use this with your Yesod app, you need to define a defaultLayout like
44 function that embeds the elm-min.js file /in the <head> tag/.
@@ -15,32 +15,46 @@
1515
1616 A full example implementation is provided in the examples folder of the Elm github repository.
1717-}
18−module Language.Elm.Yesod (elmWidget) where
18+module Language.Elm.Yesod (
19+ elmWidget
20+ , ElmUrl) where
1921
22+import Control.Monad (liftM)
2023import Text.Blaze (preEscapedToMarkup)
2124import Text.Julius
22−import Yesod.Widget (toWidgetHead, toWidgetBody, GWidget)
25+import Yesod.Core
26+import Yesod.Handler
27+import Yesod.Widget
2328import Language.Elm
2429import Language.Elm.Quasi
2530
2631import qualified Data.Text as TS
2732import qualified Data.Text.Lazy as TL
2833
29−-- |toWidget takes some Elm code in String format and produces a widget. Usage example:
30−--
31−-- > toWidget [elmFile|elm-source/somePage.elm|]
32−elmWidget :: ElmSource a
33− => a -- ^ The Elm source code
34− -> GWidget sub master ()
35−elmWidget source =
36− let (html, css, js) = toParts source in
34+instance ElmSource (ElmUrl url) where
35+ toHtml = undefined
36+ toParts = undefined
37+
38+
39+elmWidget :: ElmUrl (Route master) -- ^ Elm source code
40+ -> GHandler sub master (GWidget sub master())
41+elmWidget source = do
42+ urlF <- getUrlRenderParams
43+ return $ mkElmWidget source urlF
44+
45+
46+mkElmWidget :: ElmUrl (Route master) -- ^ Elm source code
47+ -> RenderFn (Route master) -- ^ URL rendering function
48+ -> GWidget sub master ()
49+mkElmWidget source urlFn =
50+ let (html, css, js) = toParts (urlFn, source) in
3751 do toWidgetHead css
3852 toWidgetHead [julius| #{js} |]
3953 toWidgetBody html
4054
55+
4156-- | Return type of template-reading functions.
4257type ElmUrl url = (url -> [(TS.Text, TS.Text)] -> TS.Text) -> Elm
4358
44−-- | render with route interpolation
45−renderElmUrl :: (url -> [(TS.Text, TS.Text)] -> TS.Text) -> ElmUrl url -> TL.Text
46−renderElmUrl r s = renderElm $ s r
59+-- | Readability synonym for render function
60+type RenderFn url = (url -> [(TS.Text, TS.Text)] -> TS.Text)