Skip to content

Instantly share code, notes, and snippets.

@cryogenian
Last active May 30, 2018 15:02
Show Gist options
  • Save cryogenian/ededd916867af50f07b639d28449f3d5 to your computer and use it in GitHub Desktop.
Save cryogenian/ededd916867af50f07b639d28449f3d5 to your computer and use it in GitHub Desktop.
module Button where
import Prelude
import Data.Maybe (Maybe(..))
import Halogen as H
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP
type State = Boolean
data Input = Request | DoNothing
data Message = Toggled Boolean | Response Boolean
data Inner = Clicked
type Slot = H.Slot Message
myButton :: forall m. H.Component HH.HTML Input Message m
myButton =
H.component
{ initialState: \_ -> false
, render
, eval
}
where
initialState :: State
initialState = false
render :: State -> H.ComponentHTML Inner () m
render state =
let
label = if state then "On" else "Off"
in
HH.button
[ HP.title label
, HE.onClick Toggle
]
[ HH.text label ]
eval :: H.HalogenQ Input Inner -> H.HalogenM Inner State () Message m Unit
eval = case _ of
Initialize _ ->
pure unit
Finalize ->
pure unit
Handle _ -> do
H.modify_ not
st <- H.get
H.raise $ Toggled st
Receive Request -> do
st <- H.get
H.raise $ Response st
----------------------------------------------------------------------------
module Container where
import Prelude
import Button as Button
import Data.Maybe (Maybe(..), maybe)
import Data.Symbol (SProxy(..))
import Halogen as H
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
data Handle = HandleButton Button.Message | CheckButtonState
type State =
{ toggleCount :: Int
, buttonState :: Maybe Boolean
}
type ChildSlots =
( button :: Button.Slot
)
_button :: SProxy "button"
_button = SProxy
component :: forall m. H.Component HH.HTML Void Void m
component =
H.component
{ initialState: const initialState
, render
, eval
}
where
initialState :: State
initialState =
{ toggleCount: 0
, buttonState: Nothing
}
render :: State -> H.ComponentHTML Inner ChildSlots m
render state =
HH.div_
[ HH.slot _button unit Button.myButton Button.DoNothing HandleButton
, HH.p_
[ HH.text ("Button has been toggled " <> show state.toggleCount <> " time(s)") ]
, HH.p_
[ HH.text
$ "Last time I checked, the button was: "
<> (maybe "(not checked yet)" (if _ then "on" else "off") state.buttonState)
<> ". "
, HH.button
[ HE.onClick CheckButtonState ]
[ HH.text "Check now" ]
]
]
eval :: H.HalogenQ Void Void -> H.HalogenM Void State ChildSlots Void m Unit
eval = case _ of
Initialize _ -> pure unit
Finalize -> pure unit
Handle (HandleButton msg) -> case msg of
Response b -> H.modify_ _{ buttonState = Just b }
_ -> pure unit
Handle CheckButtonState -> H.send _button Button.Request
Receive _ -> pure unit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment