@@ -0,0 +1,64 @@
1+{-# LANGUAGE QuasiQuotes #-}
2+
3+import Control.Monad (msum)
4+import Happstack.Server
5+import Language.Elm (elmFile, elm)
6+
7+import qualified Language.Elm as Elm
8+
9+elmLoc :: String
10+elmLoc = "http://f.cl.ly/items/2e3Z3r3v29263U393c3x/elm-min.js"
11+
12+elmResponse :: String -- ^ Page title
13+ -> String -- ^ elm source
14+ -> Response
15+elmResponse title = toResponse . Elm.toHtml elmLoc title
16+
17+-- embedding variables (in this case URLs)
18+rootHandler :: ServerPart Response
19+rootHandler = ok $ elmResponse "Welcome!" $ elmIndex
20+ where
21+ mouse = "/mouse"
22+ clock = "/clock"
23+ shapes = "/shapes"
24+ elmIndex = [elmFile|elm_source/index.elm|]
25+
26+-- loading elm source from file
27+
28+mouseHandler :: ServerPart Response
29+mouseHandler = ok $ elmResponse "Mouse position demo" $
30+ [elmFile|elm_source/mouse.elm|]
31+
32+clockHandler :: ServerPart Response
33+clockHandler = ok $ elmResponse "A clock" $ [elmFile|elm_source/clock.elm|]
34+
35+-- embedding elm code inside Haskell using the QuasiQuoter:
36+shapesPage = [elm|
37+square = rect 200 200 (150,150)
38+circle = oval 140 140 (150,150)
39+pentagon = ngon 5 60 (150,150)
40+
41+main = collage 300 300
42+ [ outlined black square
43+ , filled green pentagon
44+ , customOutline [8,4] blue circle
45+ ]
46+|]
47+
48+shapesHandler :: ServerPart Response
49+shapesHandler = ok $ elmResponse "Simple shapes" $ shapesPage
50+
51+-- routing
52+elmExample :: ServerPart Response
53+elmExample =
54+ msum [ nullDir >> rootHandler
55+ , dir "mouse" $ nullDir >>
56+ mouseHandler
57+ , dir "clock" $ nullDir >>
58+ clockHandler
59+ , dir "shapes" $ nullDir >>
60+ shapesHandler
61+ ]
62+
63+main :: IO ()
64+main = simpleHTTP nullConf {port = 3000} elmExample