Last active
May 30, 2018 15:02
-
-
Save cryogenian/ededd916867af50f07b639d28449f3d5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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