elm/Examples/elm-happstack/Main.hs

64 lines
No EOL
1.7 KiB
Haskell

{-# LANGUAGE QuasiQuotes #-}
import Control.Monad (msum)
import Happstack.Server
import Language.Elm (elmFile, elm)
import qualified Language.Elm as Elm
elmLoc :: String
elmLoc = "http://f.cl.ly/items/2e3Z3r3v29263U393c3x/elm-min.js"
elmResponse :: String -- ^ Page title
-> String -- ^ elm source
-> Response
elmResponse title = toResponse . Elm.toHtml elmLoc title
-- embedding variables (in this case URLs)
rootHandler :: ServerPart Response
rootHandler = ok $ elmResponse "Welcome!" $ elmIndex
where
mouse = "/mouse"
clock = "/clock"
shapes = "/shapes"
elmIndex = [elmFile|elm_source/index.elm|]
-- loading elm source from file
mouseHandler :: ServerPart Response
mouseHandler = ok $ elmResponse "Mouse position demo" $
[elmFile|elm_source/mouse.elm|]
clockHandler :: ServerPart Response
clockHandler = ok $ elmResponse "A clock" $ [elmFile|elm_source/clock.elm|]
-- embedding elm code inside Haskell using the QuasiQuoter:
shapesPage = [elm|
square = rect 200 200 (150,150)
circle = oval 140 140 (150,150)
pentagon = ngon 5 60 (150,150)
main = collage 300 300
[ outlined black square
, filled green pentagon
, customOutline [8,4] blue circle
]
|]
shapesHandler :: ServerPart Response
shapesHandler = ok $ elmResponse "Simple shapes" $ shapesPage
-- routing
elmExample :: ServerPart Response
elmExample =
msum [ nullDir >> rootHandler
, dir "mouse" $ nullDir >>
mouseHandler
, dir "clock" $ nullDir >>
clockHandler
, dir "shapes" $ nullDir >>
shapesHandler
]
main :: IO ()
main = simpleHTTP nullConf {port = 3000} elmExample