on master help sign in
* updated elm-yesod for URL interpolation

- An instance for ElmSource (urlRenderFn, url -> Elm) has been added. - elm-yesod's elmWidget function now supports URL interpolation, it returns a widget in the GHandler monad and needs to be used differently. The elm-yesod example has not yet been updated.

commit3d4bbeb84c481f2432f216e9d4082bca4e83d851 authorVincent Ambo <v.ambo@me.com> dateWed 30 May 2012, 21:17 (14 years ago) parentaab25b8
2 files changed+36−16
elm-yesod/Language/Elm/Yesod.hs+28−14 elm/src/Language/Elm.hs+8−2
elm-yesod/Language/Elm/Yesod.hs+28−14
@@ -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)
elm/src/Language/Elm.hs+8−2
@@ -43,9 +43,15 @@ instance ElmSource TL.Text where
4343 toParts = toPartsHelper . TL.unpack
4444 toHtml elmL title = generateHtml elmL title . TL.unpack
4545
46+-- | (urlRenderFn, urlRenderFn -> Elm)
47+instance ElmSource (t, t -> Elm) where
48+ toParts (f, s) = toPartsHelper $ TL.unpack $ renderElm $ s f
49+ toHtml elmL title (f, s) = generateHtml elmL title $ TL.unpack $ renderElm $ s f
50+
51+-- | to be used without URL interpolation
4652instance ElmSource (t -> Elm) where
47− toParts s = toPartsHelper $ TL.unpack $ renderElm $ s undefined
48− toHtml elmL title s = generateHtml elmL title $ TL.unpack $ renderElm $ s undefined
53+ toParts s = toPartsHelper $ TL.unpack $ renderElm $ s undefined
54+ toHtml l t s = generateHtml l t $ TL.unpack $ renderElm $ s undefined
4955
5056
5157-- build helper to avoid boilerplate repetition