Advertisement
Guest User

Miso Navigation

a guest
Apr 8th, 2021
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- | Haskell language pragma
  2. {-# LANGUAGE OverloadedStrings #-}
  3. {-# LANGUAGE RecordWildCards #-}
  4. {-# LANGUAGE CPP #-}
  5. {-# LANGUAGE NoImplicitPrelude #-}
  6.  
  7. -- | Haskell module declaration
  8. module Main where
  9.  
  10. import Prelude hiding (concat)
  11.  
  12. -- | Miso framework import
  13. import           Miso
  14. -- import           Miso.Html
  15. import           Miso.String hiding (map)
  16.  
  17. -- | JSAddle import
  18. -- import           Language.Javascript.JSaddle (eval, runJSM, askJSM, textToJSString)
  19. #ifndef __GHCJS__
  20. import           Language.Javascript.JSaddle.Warp as JSaddle
  21. import qualified Network.Wai.Handler.Warp         as Warp
  22. import           Network.WebSockets
  23. #endif
  24. -- import           Control.Monad.IO.Class
  25.  
  26. -- | Type synonym for an application model
  27. data Model = Model { header :: String
  28.                    , content :: String
  29.                    , nPages :: Int} deriving (Show, Eq)
  30.  
  31. -- | Sum type for application events
  32. data Action
  33.   = SetPage Int
  34.   | AddPage
  35.   | RemovePage
  36.   | NoOp
  37.   deriving (Show, Eq)
  38.  
  39. #ifndef __GHCJS__
  40. runApp :: JSM () -> IO ()
  41. runApp f =
  42.   Warp.runSettings (Warp.setPort 8081 (Warp.setTimeout 3600 Warp.defaultSettings)) =<<
  43.     JSaddle.jsaddleOr defaultConnectionOptions (f >> syncPoint) JSaddle.jsaddleApp
  44. #else
  45. runApp :: IO () -> IO ()
  46. runApp app = app
  47. #endif
  48.  
  49. -- | Entry point for a miso application
  50. main :: IO ()
  51. main = runApp $ startApp App {..}
  52.   where
  53.     initialAction = NoOp -- initial action to be executed on application load
  54.     model  = Model "hello" "world" 4                   -- initial model
  55.     update = updateModel          -- update function
  56.     view   = viewModel            -- view function
  57.     events = defaultEvents        -- default delegated events
  58.     subs   = []                   -- empty subscription list
  59.     mountPoint = Nothing          -- mount point for application (Nothing defaults to 'body')
  60.     logLevel = Off                -- used during prerendering to see if the VDOM and DOM are in synch (only used with `miso` function)
  61.  
  62. -- | Updates model, optionally introduces side effects
  63. updateModel :: Action -> Model -> Effect Action Model
  64. updateModel (SetPage pageI) m = noEff $ m {
  65.     header = "page " ++ show pageI
  66.   , content = "page " ++ show pageI ++ " content"
  67.   }
  68. updateModel AddPage m = noEff $ m {nPages = nPages m + 1}
  69. updateModel RemovePage m = noEff $ m {nPages = if nPages m > 0 then nPages m - 1 else 0}
  70. updateModel NoOp m = noEff m
  71.  
  72. -- | Constructs a virtual DOM from a model
  73. viewModel :: Model -> View Action
  74. viewModel m = div_ [] $
  75.  (map (\i -> button_ [ onClick (SetPage i) ] [ text $ ms $ "Page" ++ show i ]) [1..nPages m])
  76.  <>
  77.  [
  78.    br_ []
  79.  , br_ []
  80.  , button_ [onClick AddPage] [ text "add page" ]
  81.  , button_ [onClick RemovePage] [ text "remove page" ]
  82.  , br_ []
  83.  , h1_ [] [text (ms $ header m)]
  84.  , br_ []
  85.  , text (ms $ content m)
  86.  ]
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement