Suppose I have some application that can be in one of various states. The 
application also has say a menu and a dialog, each with their own states. 
The dialog and menu are not always shown, but they can also be shown at the 
same time. This gives me quite a large cross product of the state space to 
enumerate:

type State = 
   App1
   | App2
   | ...
   | App1WithMenu Menu
   | ...
   | App1WithMenuAndDialog Menu Dialog

Which is not going to be very practical.

I am thinking instead that the menu and dialog state spaces should also 
include some kind of default inactive state. Lets just call it Hidden.

type Menu = 
  Hidden
  | Menu1
  | ...

type Dialog =
  Hidden
  | Dialog1
  | ...

Now these state spaces can be made always present in the application model:

type alias Model = 
  { dialog : Dialog,
    menu : Menu,
    app : State
  }

And the 'view' functions for them can even return optional results, so that 
nothing is rendered when they are hidden. 'view : Menu -> Maybe (Html Msg)'.

This does mean though, that the whole cross product of the state space can 
be represented. Perhaps there are some combinations of states that I want 
to disallow - for example, maybe I do not want to allow the menu to be 
opened when the dialog is already open. I can encode these rules in some 
state transition functions that enforce them, but I have lost the nice 
quality of eliminating even the possibility of them existing in the data 
model.

Just wondering if anyone has tried this kind of thing on a larger 
application and what you think worked best?

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to