Last active
August 29, 2015 14:00
-
-
Save deadfoxygrandpa/6cb2362eee4d3ba112f9 to your computer and use it in GitHub Desktop.
Composing Elm Programs
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
| import Mouse | |
| import Signal.InputGroups as InputGroups | |
| import Program | |
| import Menu | |
| -- State tracking code to see which of Program or Menu is open: | |
| type State = {menuOpen : Bool} | |
| state : Signal State | |
| state = foldp (\step state -> step state) (State False) stateUpdates | |
| stateUpdates : Signal (State -> State) | |
| stateUpdates = merges [ closeMenu <~ (fps 0.1) | |
| , openMenu <~ Mouse.clicks | |
| ] | |
| closeMenu : a -> State -> State | |
| closeMenu _ = {state| menuOpen <- False} | |
| openMenu : a -> State -> State | |
| openMenu _ = {state| menuOpen <- True} | |
| -- InputGroups to make sure inputs only work on the correct screens: | |
| mainGroup : InputGroup a | |
| mainGroup = InputGroups.makeGroup (not . .menuOpen <~ state) | |
| programUpdates : InputGroup Program.Updates | |
| programUpdates = mainGroup.add Program.updates | |
| menuGroup : InputGroup a | |
| menuGroup = InputGroups.makeGroup (.menuOpen <~ state) | |
| menuUpdates : InputGroup Menu.Updates | |
| menuUpdates = menuGroup.add Menu.updates | |
| -- Initializing the two programs: | |
| programState : Signal Program.State | |
| programState = foldp Program.update Program.initialState programUpdates | |
| menuState : Signal Menu.State | |
| menuState = foldp Menu.update Menu.initialState menuUpdates | |
| programScreen : Signal Element | |
| programScreen = Program.display programState | |
| menuScreen : Signal Element | |
| menuScreen = Menu.display menuState | |
| -- Finally, the main function to tie it all together: | |
| main : Signal Element | |
| main = (\program menu state -> if state.menuOpen then menu else program) <~ programScreen | |
| ~ menuScreen | |
| ~ state |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment