on b5b87f2 help sign in
67 lines 1.9 kB history raw
1{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
3import Control.Monad (msum)
4import Happstack.Server
5import Language.Elm
6import Language.Elm.Quasi
8elmLoc :: String
9elmLoc = "https://raw.github.com/evancz/Elm/master/elm/elm-runtime-0.3.5.js"
11-- elmResponse is a "nice to have" helper function for compiling
12-- Elm code when using Elm with Happstack. At some point this might
13-- be moved to an elm-happstack package.
14elmResponse :: ElmSource a
15 => String -- ^ Page title
16 -> a -- ^ elm source
17 -> Response
18elmResponse title = toResponse . toHtml elmLoc title
20-- embedding variables (in this case URLs)
21rootHandler :: ServerPart Response
22rootHandler = ok $ elmResponse "Welcome!" $ elmIndex
23 where
24 mouse = "/mouse"
25 clock = "/clock"
26 shapes = "/shapes"
27 elmIndex = $(elmFile "elm_source/index.elm")
29-- loading elm source from file
31mouseHandler :: ServerPart Response
32mouseHandler = ok $ elmResponse "Mouse position demo"
33 $(elmFile "elm_source/mouse.elm")
35clockHandler :: ServerPart Response
36clockHandler = ok $ elmResponse "A clock" $(elmFile "elm_source/clock.elm")
38-- embedding elm code inside Haskell using the QuasiQuoter:
39shapesPage = [elm|
40square = rect 200 200 (150,150)
41circle = oval 140 140 (150,150)
42pentagon = ngon 5 60 (150,150)
44main = collage 300 300
45 [ outlined black square
46 , filled green pentagon
47 , customOutline [8,4] blue circle
48 ]
49|]
51shapesHandler :: ServerPart Response
52shapesHandler = ok $ elmResponse "Simple shapes" $ shapesPage
54-- routing
55elmExample :: ServerPart Response
56elmExample =
57 msum [ nullDir >> rootHandler
58 , dir "mouse" $ nullDir >>
59 mouseHandler
60 , dir "clock" $ nullDir >>
61 clockHandler
62 , dir "shapes" $ nullDir >>
63 shapesHandler
64 ]
66main :: IO ()
67main = simpleHTTP nullConf {port = 3000} elmExample