push 3 sub projects
This commit is contained in:
62
server/Main.hs
Normal file
62
server/Main.hs
Normal file
@@ -0,0 +1,62 @@
|
||||
----------------------------------------------------------------------------
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE RecordWildCards #-}
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE CPP #-}
|
||||
----------------------------------------------------------------------------
|
||||
module Main where
|
||||
----------------------------------------------------------------------------
|
||||
import Miso
|
||||
import Miso.String
|
||||
import Miso.Lens
|
||||
----------------------------------------------------------------------------
|
||||
-- | Component model state
|
||||
newtype Model = Model
|
||||
{ _counter :: Int
|
||||
} deriving (Show, Eq)
|
||||
----------------------------------------------------------------------------
|
||||
counter :: Lens Model Int
|
||||
counter = lens _counter $ \record field -> record { _counter = field }
|
||||
----------------------------------------------------------------------------
|
||||
-- | Sum type for Component events
|
||||
data Action
|
||||
= AddOne
|
||||
| SubtractOne
|
||||
| SayHelloWorld
|
||||
deriving (Show, Eq)
|
||||
----------------------------------------------------------------------------
|
||||
-- | Entry point for a miso application
|
||||
main :: IO ()
|
||||
main = run (startComponent component)
|
||||
----------------------------------------------------------------------------
|
||||
-- | WASM export, required when compiling w/ the WASM backend.
|
||||
#ifdef WASM
|
||||
foreign export javascript "hs_start" main :: IO ()
|
||||
#endif
|
||||
----------------------------------------------------------------------------
|
||||
-- | `defaultComponent` takes as arguments the initial model, update function, view function
|
||||
component :: Component name Model Action
|
||||
component = defaultComponent emptyModel updateModel viewModel
|
||||
----------------------------------------------------------------------------
|
||||
-- | Empty application state
|
||||
emptyModel :: Model
|
||||
emptyModel = Model 0
|
||||
----------------------------------------------------------------------------
|
||||
-- | Updates model, optionally introduces side effects
|
||||
updateModel :: Action -> Effect Model Action
|
||||
updateModel = \case
|
||||
AddOne -> counter += 1
|
||||
SubtractOne -> counter -= 1
|
||||
SayHelloWorld -> io_ $ do
|
||||
consoleLog "Hello World"
|
||||
alert "Hello World"
|
||||
----------------------------------------------------------------------------
|
||||
-- | Constructs a virtual DOM from a model
|
||||
viewModel :: Model -> View Action
|
||||
viewModel x = div_ []
|
||||
[ button_ [ onClick AddOne ] [ text "+" ]
|
||||
, text $ ms (x ^. counter)
|
||||
, button_ [ onClick SubtractOne ] [ text "-" ]
|
||||
, button_ [ onClick SayHelloWorld ] [ text "Alert Hello World!" ]
|
||||
]
|
||||
----------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user