I mentioned it in the very first post of this discussion

Khalid aka DjebbZ
@Dj3bbZ

On Fri, May 22, 2015 at 5:57 PM, Marc Fawzi <marc.fa...@gmail.com> wrote:

> this looks like fun
>
> https://github.com/cdorrat/reduce-fsm
>
> ;)
>
> On Wed, May 20, 2015 at 7:26 AM, Marc Fawzi <marc.fa...@gmail.com> wrote:
>
>> Yup, well captured.
>>
>> On Wed, May 20, 2015 at 6:58 AM, Khalid Jebbari <khalid.jebb...@gmail.com
>> > wrote:
>>
>>> You would want it if you want to inspect/debug/transmit/replay the whole
>>> the state of your application. Having nothing encapsulated and everything
>>> in a global state permits this.
>>>
>>> Khalid aka DjebbZ
>>> @Dj3bbZ
>>>
>>> On Wed, May 20, 2015 at 3:51 PM, Jamie Orchard-Hays <jamie...@gmail.com>
>>> wrote:
>>>
>>>> For local state, I mean state that has to do only with the component
>>>> itself, nothing to do with the data itself. For example, if I have a
>>>> component that can switch between editing/reading states, I can't imagine
>>>> why I would want this information stored outside of the component itself.
>>>>
>>>> Jamie
>>>>
>>>> On May 19, 2015, at 11:58 AM, Daniel Kersten <dkers...@gmail.com>
>>>> wrote:
>>>>
>>>> I don't think it implies local state, necessarily, although it may
>>>> benefit from it. I think alternatives can be modular too.
>>>>
>>>> For example, re-frame's approach of a central place to store data is
>>>> like a Blackboard system, which may even help modularity, not hinder it,
>>>> because modules don't need to know anything about each other - only that
>>>> the data they read and write is in the central place and may be
>>>> (transparent to the modules) be accessed/updated by multiple modules
>>>> transparently (and hopefully gets validated eg through a schema or
>>>> constraint system to prevent one module from writing data that breaks
>>>> another module).
>>>>
>>>> On the other hand, local state implies encapsulation and encourages
>>>> strict interfaces to access it, which can also help modularity. In my
>>>> personal experience this has (more often than not) led to tightly coupled
>>>> modules instead, however.
>>>>
>>>> I personally prefer the re-frame single-place-for-data approach because
>>>> in my opinion its benefits outweigh its disadvantages, but perhaps I've
>>>> just been doing local state wrong :) (actually pretty likely!)
>>>>
>>>>
>>>> PS: It'll probably be some time before I get a chance to read Horrocks'
>>>> book. If anybody knows of any similar content available on the web for me
>>>> to read in the meantime, I'd love to hear of it!
>>>>
>>>>
>>>> On Tue, 19 May 2015 at 14:34 Jamie Orchard-Hays <jamie...@gmail.com>
>>>> wrote:
>>>>
>>>>> I agree. The word that came to mind while reading your comments,
>>>>> Daniel, was "modularity". Does modularity imply local state? Pondering...
>>>>>
>>>>> Jamie
>>>>>
>>>>> On May 18, 2015, at 1:26 PM, Khalid Jebbari <khalid.jebb...@gmail.com>
>>>>> wrote:
>>>>>
>>>>> I like how you break up the state machines, it has sense in web app.
>>>>> Page 1 has 2 widgets, page 2 has a form. Each widget/form can have a FSM
>>>>> associated with it, the higher level FSM knowing just the higher level
>>>>> state of all widget displayed. Mmmh... Interesting.
>>>>>
>>>>> Le 18 mai 2015 à 19:13, Daniel Kersten <dkers...@gmail.com> a écrit :
>>>>>
>>>>> From my understanding of it:
>>>>>
>>>>> Use higher level states and decouple them somewhat from the data.
>>>>>
>>>>> For example, games do have lots of dynamically changing data. In a
>>>>> modern shooter you might have dozens of characters with positions,
>>>>> orientation, velocity, health information, weapons, ammunition, etc all of
>>>>> which can be  constantly changing. And that's just taking the characters
>>>>> into account.
>>>>>
>>>>> I wouldn't go and build a state machine that enumerates all of the
>>>>> possible transitions from a "twelve characters with done distribution of
>>>>> attributes in this location moving in that direction" state. I'd break it
>>>>> down so that each character has a high level state like "seeking powerup"
>>>>> or "running".
>>>>>
>>>>> Probably not a great example although it does illustrate that you
>>>>> might have a hierarchy of state machines. In the game example, the highest
>>>>> level might be something like "in play" or "paused" and the lowest might 
>>>>> be
>>>>> an each characters "firing weapon".
>>>>>
>>>>> In client side web app, you could say that each configuration of data
>>>>> is a state (the re-frame readme mentions that you could think of the 
>>>>> app-db
>>>>> like this), but I think that's too fine grained to be useful.
>>>>>
>>>>> Instead I'd define higher level states (possibly in a hierarchy). I'd
>>>>> ask myself, regardless of the data available, what are the logical states
>>>>> that a user could be in and for each one, what are the actions that they
>>>>> can perform (and what state does each action transition them to).
>>>>> This could be as simple as pages and links, but with a rich single
>>>>> page application it's more likely finer grained than that. Maybe what
>>>>> dialogs or widgets are accessible.
>>>>>
>>>>> Again, you could then layer these into a hierarchy of state machines.
>>>>>
>>>>> One advantage of this is you always know what a user can do at any
>>>>> given time because you can look at what state they're in.
>>>>>
>>>>> I think of FSM states as orthogonal to the data, not as the data
>>>>> itself. The states dictate what data is accessible and what can be done to
>>>>> it; the data doesn't dictate what state the application is in.
>>>>>
>>>>> I suppose terminology gets confusing, but this is the approach I'm
>>>>> toying with. I'll see how that goes :)
>>>>>
>>>>> But yeah, needs more thinking.
>>>>>
>>>>> On Mon, 18 May 2015 16:55 Marc Fawzi <marc.fa...@gmail.com> wrote:
>>>>>
>>>>>> Games are ideal candidate for straight-forward FSM implementation
>>>>>> since you normally download the data at game load time and from there on
>>>>>> you have a *relatively* small set of states that can be transitioned
>>>>>> between based in user input. You can even apply state minimization
>>>>>> techniques to reduce the total number of states.
>>>>>>
>>>>>> But in a web app you are continuously grabbing data from the server
>>>>>> and that data is generated based on not only user input but also the 
>>>>>> state
>>>>>> of the server side database and that server generated data would modify 
>>>>>> UI
>>>>>> side app state and you have to account for all possibilities so the total
>>>>>> number of states could grow wildly if your UI is data driven (where the
>>>>>> state of the UI depends on the data in non-trivial ways) but even if your
>>>>>> UI state dependence on server data was a trivial relationship you could
>>>>>> still end up with a huge state diagram for the simplest viable business 
>>>>>> app
>>>>>> if you include templating the view as part of the UI FSM on top of 
>>>>>> business
>>>>>> logic. You could segment your app into micro apps and that will help
>>>>>> regardless of whether you're building the app as FSM or not.
>>>>>>
>>>>>> And what if the state transitions are probability driven? How many
>>>>>> states will you end up having to chart?
>>>>>>
>>>>>> Not convinced YET...
>>>>>>
>>>>>> Sent from my iPhone
>>>>>>
>>>>>> > On May 18, 2015, at 6:57 AM, Sean Tempesta <sean.tempe...@gmail.com>
>>>>>> wrote:
>>>>>> >
>>>>>> > Hi Khalid.  I found your topic interesting so I thought I'd chime
>>>>>> in.  Regarding your comments on routing:
>>>>>> >
>>>>>> > So, under normal conditions, the initial URL sets the FSM in motion
>>>>>> (as an event).  We could call this entry point a routing state.  
>>>>>> Afterward,
>>>>>> the state transitions are controlling the urls (not the other way 
>>>>>> around),
>>>>>> right?
>>>>>> >
>>>>>> > Outside of normal conditions (ie. people copying and pasting links
>>>>>> into random parts of the system), you also just send the url to the 
>>>>>> routing
>>>>>> state and then switch to a new state based on whatever rules and
>>>>>> definitions you've set.
>>>>>> >
>>>>>> > Or maybe I'm missing something.  I haven't built an FSM in a
>>>>>> while.  :)
>>>>>> >
>>>>>> > Sean
>>>>>> >
>>>>>> >> On Monday, May 18, 2015 at 6:07:22 PM UTC+8, Khalid Jebbari wrote:
>>>>>> >> Trying to push forward the discussion about Web UI with state
>>>>>> machines. I came up with the following decomposition of the core 
>>>>>> components
>>>>>> of a web application :
>>>>>> >>
>>>>>> >> - application state
>>>>>> >> - application data
>>>>>> >> - business logic
>>>>>> >> - ui logic
>>>>>> >> - event processing
>>>>>> >> - presentation layer
>>>>>> >> - routing
>>>>>> >>
>>>>>> >> In this schema, I think the application state is the real core,
>>>>>> because every other components is directly related to it, at least if you
>>>>>> use a state machine. I came up with the following model.
>>>>>> >>
>>>>>> >> - application data : related to application state because both can
>>>>>> easily represented as data. If we want a web app that is completely
>>>>>> state-driven (I want this, for debugging, testing and time-travel
>>>>>> capabilities), simply merge the data and the state in the same data 
>>>>>> entity.
>>>>>> >>
>>>>>> >> - business logic/ui logic : in a state machine there's the notion
>>>>>> of "actions" executed with each transition (where necessary). So the 
>>>>>> logic
>>>>>> could just be executed by the state machine itself.
>>>>>> >>
>>>>>> >> - event processing : a state machine can be event-driven, and this
>>>>>> a perfect match with a web app since the web (and any UI for that matter)
>>>>>> is inherently event driven. So the event/input of the state machine could
>>>>>> just match the event triggered by the user, as well as custom events if
>>>>>> necessary.
>>>>>> >>
>>>>>> >> - presentation layer : simply display the current app-state as
>>>>>> HTML/CSS. In the React.js model, it would simply mean updating the app
>>>>>> state and letting React render everything.
>>>>>> >>
>>>>>> >> - routing : this is where stuff gets complicated in my mind. In a
>>>>>> proper application, lot of state is derived from the URLs. But not all
>>>>>> state, for instance whether a modal is displayed or not, or whether a 
>>>>>> form
>>>>>> is validated client side or not isn't tied to a URL. Which tend to let me
>>>>>> think that there's some kind of hierarchy in the state machine. The URLs
>>>>>> could be represented as events as well in the state machine, but could
>>>>>> happen at anytime, whereas other events and related transition depend on
>>>>>> the current state in a state machine. So it's like you have a top-level
>>>>>> state machine for URLs, and each URL has its own state machine for all
>>>>>> interactions in the page. Maybe page-state machine could be refined in
>>>>>> multiple levels state machines too, not sure about that. It seems like
>>>>>> Hierarchical State Machine may help here, but I haven't studied the 
>>>>>> subject
>>>>>> yet at all.
>>>>>> >>
>>>>>> >> What do you think ?
>>>>>> >
>>>>>> > --
>>>>>> > Note that posts from new members are moderated - please be patient
>>>>>> with your first post.
>>>>>> > ---
>>>>>> > You received this message because you are subscribed to the Google
>>>>>> Groups "ClojureScript" group.
>>>>>> > To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to clojurescript+unsubscr...@googlegroups.com.
>>>>>> > To post to this group, send email to clojurescript@googlegroups.com
>>>>>> .
>>>>>> > Visit this group at http://groups.google.com/group/clojurescript.
>>>>>>
>>>>>> --
>>>>>> Note that posts from new members are moderated - please be patient
>>>>>> with your first post.
>>>>>> ---
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "ClojureScript" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to clojurescript+unsubscr...@googlegroups.com.
>>>>>> To post to this group, send email to clojurescript@googlegroups.com.
>>>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>>>
>>>>>
>>>>> --
>>>>> Note that posts from new members are moderated - please be patient
>>>>> with your first post.
>>>>> ---
>>>>> You received this message because you are subscribed to a topic in the
>>>>> Google Groups "ClojureScript" group.
>>>>> To unsubscribe from this topic, visit
>>>>> https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe
>>>>> .
>>>>> To unsubscribe from this group and all its topics, send an email to
>>>>> clojurescript+unsubscr...@googlegroups.com.
>>>>> To post to this group, send email to clojurescript@googlegroups.com.
>>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>>
>>>>>
>>>>> --
>>>>> Note that posts from new members are moderated - please be patient
>>>>> with your first post.
>>>>> ---
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "ClojureScript" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to clojurescript+unsubscr...@googlegroups.com.
>>>>> To post to this group, send email to clojurescript@googlegroups.com.
>>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Note that posts from new members are moderated - please be patient
>>>>> with your first post.
>>>>> ---
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "ClojureScript" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to clojurescript+unsubscr...@googlegroups.com.
>>>>> To post to this group, send email to clojurescript@googlegroups.com.
>>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>>
>>>>
>>>> --
>>>> Note that posts from new members are moderated - please be patient with
>>>> your first post.
>>>> ---
>>>> You received this message because you are subscribed to the Google
>>>> Groups "ClojureScript" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to clojurescript+unsubscr...@googlegroups.com.
>>>> To post to this group, send email to clojurescript@googlegroups.com.
>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>
>>>>
>>>>  --
>>>> Note that posts from new members are moderated - please be patient with
>>>> your first post.
>>>> ---
>>>> You received this message because you are subscribed to a topic in the
>>>> Google Groups "ClojureScript" group.
>>>> To unsubscribe from this topic, visit
>>>> https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe
>>>> .
>>>> To unsubscribe from this group and all its topics, send an email to
>>>> clojurescript+unsubscr...@googlegroups.com.
>>>> To post to this group, send email to clojurescript@googlegroups.com.
>>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>>
>>>
>>>  --
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "ClojureScript" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to clojurescript+unsubscr...@googlegroups.com.
>>> To post to this group, send email to clojurescript@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>
>>
>>
>  --
> Note that posts from new members are moderated - please be patient with
> your first post.
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "ClojureScript" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> clojurescript+unsubscr...@googlegroups.com.
> To post to this group, send email to clojurescript@googlegroups.com.
> Visit this group at http://groups.google.com/group/clojurescript.
>

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojurescript+unsubscr...@googlegroups.com.
To post to this group, send email to clojurescript@googlegroups.com.
Visit this group at http://groups.google.com/group/clojurescript.

Reply via email to