diff --git a/default.nix b/default.nix index c0d352f..ed703ab 100644 --- a/default.nix +++ b/default.nix @@ -1,11 +1,18 @@ { nixpkgs, haskellPackages }: -let jsaddle = nixpkgs.fetchFromGitHub { - owner = "ghcjs"; - repo = "jsaddle"; - rev = "68208be806c49a2a0c9f037dfac85feae10a8c80"; - sha256 = "0acj0x716ikfb08ndib36jmwxkwq399lvkip46sfkh1ynn0pvc1c"; -}; +let + jsaddle = nixpkgs.fetchFromGitHub { + owner = "ghcjs"; + repo = "jsaddle"; + rev = "68208be806c49a2a0c9f037dfac85feae10a8c80"; + sha256 = "0acj0x716ikfb08ndib36jmwxkwq399lvkip46sfkh1ynn0pvc1c"; + }; + miso = nixpkgs.fetchFromGitHub { + owner = "dmjio"; + repo = "miso"; + rev = "a9c4f0a3a6e7d87f9432dc6cf4b1d0c052bf7ef1"; + sha256 = "1yq5y4vffslm6abnfnggp5m3k6vla6mzcwmhmm23l8yizsvdkwv2"; + }; in @@ -19,6 +26,7 @@ in generic-lens = nixpkgs.haskell.lib.dontCheck super.generic-lens; jsaddle-warp = nixpkgs.haskell.lib.dontCheck (super.callPackage (jsaddle + "/jsaddle-warp") {}); jsaddle = super.callPackage (jsaddle + "/jsaddle") {}; + miso = super.callPackage (miso + "/miso-ghc-jsaddle.nix") {}; }; tools = with haskellPackages; [ ghcid diff --git a/frontend/frontend.cabal b/frontend/frontend.cabal index f98b98f..1f11653 100644 --- a/frontend/frontend.cabal +++ b/frontend/frontend.cabal @@ -23,5 +23,6 @@ executable frontend , common , miso , jsaddle-warp + , mtl hs-source-dirs: src default-language: Haskell2010 diff --git a/frontend/src/Main.hs b/frontend/src/Main.hs index 65ae4a0..57fe622 100644 --- a/frontend/src/Main.hs +++ b/frontend/src/Main.hs @@ -1,4 +1,41 @@ +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} module Main where +import Control.Monad.Trans (liftIO) +import Language.Javascript.JSaddle.Warp +import Miso +import Miso.String + +data Action = Add + | Subtract + | SayHello + | NoOp + +newtype Model = Model Int deriving (Eq, Num, ToMisoString) + +updateModel :: Action -> Model -> Effect Action Model +updateModel Add m = noEff (m + 1) +updateModel Subtract m = noEff (m - 1) +updateModel SayHello m = m <# (liftIO (putStrLn "Hello world") >> pure NoOp) +updateModel NoOp m = noEff m + +viewModel :: Model -> View Action +viewModel x = + div_ [] [ button_ [ onClick Add ] [ text "+" ] + , text (ms x) + , button_ [ onClick Subtract ] [ text "-" ] + ] + main :: IO () -main = putStrLn "Hello, Haskell!" +main = run 8081 $ startApp App{..} + where + model = Model 0 + initialAction = SayHello + update = updateModel + view = viewModel + subs = [] + events = defaultEvents + mountPoint = Nothing