Skip to content

Instantly share code, notes, and snippets.

@deadfoxygrandpa
Last active August 29, 2015 14:00
Show Gist options
  • Select an option

  • Save deadfoxygrandpa/6cb2362eee4d3ba112f9 to your computer and use it in GitHub Desktop.

Select an option

Save deadfoxygrandpa/6cb2362eee4d3ba112f9 to your computer and use it in GitHub Desktop.
Composing Elm Programs
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