on master help sign in
* added elm-happstack example && changed text in elm-yesod example
commit2a885bb5643628c25c42c7ec6b0748c8bce667eb authorVincent Ambo <v.ambo@me.com> dateTue 29 May 2012, 23:47 (14 years ago) parent381fbf4
6 files changed+123−4
Examples/elm-happstack/Main.hs+64 Examples/elm-happstack/elm_source/clock.elm+12 Examples/elm-happstack/elm_source/index.elm+35 Examples/elm-happstack/elm_source/mouse.elm+9 Examples/elm-yesod/elm_source/index.elm+1−2 elm-yesod/elm-yesod.cabal+2−2
Examples/elm-happstack/Main.hsnew file+64
@@ -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
Examples/elm-happstack/elm_source/clock.elmnew file+12
@@ -0,0 +1,12 @@
1+clockColor = rgb (6/16) (11/16) (14/16)
2+
3+hand clr len time =
4+ let t = Math.PI * time / 30 - Math.PI / 2 in
5+ solid clr $ line [(200,200), (200 + len * cos t, 200 + len * sin t)]
6+
7+clock t = collage 400 400 [ filled clockColor $ ngon 12 110 (200, 200)
8+ , hand red 100 t
9+ , hand black 100 (t/60)
10+ , hand black 60 (t/720) ]
11+
12+main = lift clock $ Time.every 1
Examples/elm-happstack/elm_source/index.elmnew file+35
@@ -0,0 +1,35 @@
1+title w = size w 60 . box 4 . text . header . toText $ "Elm-Happstack"
2+
3+lightGrey = rgb (240/255) (241/255) (244/255)
4+mediumGrey = rgb (216/255) (221/255) (225/255)
5+heading outer inner =
6+ color mediumGrey . size outer 61 . box 1 .
7+ color lightGrey . size outer 60 . box 5 .
8+ size inner 60 . box 5 $ title inner
9+
10+skeleton body outer =
11+ let inner = if outer < 820 then outer - 20 else 800 in
12+ flow down [ heading outer inner
13+ , body outer inner
14+ ]
15+
16+----------------------
17+
18+section = text . bold . Text.height (5/4) . toText
19+
20+info w = List.map (\f -> f ()) . List.intersperse (\x -> plainText "&nbsp;") . List.map ((\e x -> e) . width w) $
21+ [ section "Written in Elm, served with Happstack"
22+ , text $ toText "This page is written in " ++ link "http://elm-lang.org/" (toText "Elm") ++
23+ toText " and served using the " ++
24+ link "http://happstack.com/" (toText "Happstack Web Framework") ++
25+ toText ". Since you are looking at this page it is safe to assume that you already have the example code. "
26+ , text $ toText "A second Happstack example using web-routes will be added later on."
27+ , section "More examples:"
28+ , text $ toText "- " ++ link ^{mouse} (toText "A simple mouse input example")
29+ , text $ toText "- " ++ link ^{clock} (toText "An animated analog clock")
30+ , text $ toText "- " ++ link ^{shapes} (toText "Some simple rendered shapes")
31+ ]
32+
33+body outer inner = width outer . box 2 . flow down . (:) (plainText "&nbsp;") $ info inner
34+
35+main = lift (skeleton body) Window.width
Examples/elm-happstack/elm_source/mouse.elmnew file+9
@@ -0,0 +1,9 @@
1+niceBlue = rgb 0 (1/3) (2/3)
2+clearGreen = rgba (1/9) (8/9) (3/9) (1/2)
3+
4+scene (x,y) (w,h) =
5+ collage w h [ filled niceBlue . rotate ((x+y)/1000) $ ngon 4 100 (200,200)
6+ , filled clearGreen $ ngon 5 30 (x,y)
7+ ]
8+
9+main = lift2 scene Mouse.position Window.dimensions
Examples/elm-yesod/elm_source/index.elm+1−2
@@ -23,8 +23,7 @@ info w = List.map (\f -> f ()) . List.intersperse (\x -> plainText "&nbsp;") . L
2323 toText " and served using the " ++
2424 link "http://yesodweb.com/" (toText "Yesod Web Framework") ++
2525 toText ". Since you are looking at this page it is safe to assume that you already have the example code. "
26− , text $ toText "Rendering Yesod's type-safe URLs is not yet possible, but will be implemented as the currently " ++
27− toText "very simple QuasiQuoter is extended."
26+ , text $ toText "Type-safe URLs are rendered using simple QuasiQuoter variable interpolation."
2827 , section "More examples:"
2928 , text $ toText "- " ++ link ^{mouse} (toText "A simple mouse input example")
3029 , text $ toText "- " ++ link ^{clock} (toText "An animated analog clock")
elm-yesod/elm-yesod.cabal+2−2
@@ -9,8 +9,8 @@ Homepage: http://elm-lang.org
99License: BSD3
1010License-file: LICENSE
1111
12−Author: Evan Czaplicki
13−Maintainer: info@elm-lang.org
12+Author: Vincent Ambo
13+Maintainer: geva@humac.com
1414Copyright: Copyright: (c) 2011-2012 Evan Czaplicki
1515
1616Category: Compiler, Language