It was just something that bugged me when I first saw it in the examples,
and I just came to the realization of why. And I am wondering out loud what
it look like if they were separate things.
In your example case, you could make a 3rd command that did the issued a
new message InfoConnectIdAssigned to separate the model bit out. The
tradeoff is isolation of model changes vs increased boilerplate (issuing a
no-effect command). I think a shortcut method could be in order like
Cmd.none, but something like Cmd.fromMsg.
On Thursday, August 11, 2016 at 12:53:16 PM UTC-5, OvermindDL1 wrote:
>
> I guess what you are proposing is separating a Message into a 'commands'
> and 'update' callbacks? That could work well too... I could add that as
> an option to my ProgramEx testing library (where I test with extra
> callbacks) if you want to play around with it? Do you propose that
> `update` would be `Msg -> Model -> Model` and `command` would be `Msg ->
> Model -> Cmd Msg, running in sequence of command before update? I can see
> a lot of them having a lot of duplicate code though, but I guess that could
> be removed from my currently testing `filters` callback to clean up the
> message into more pure stateful messages. Though if I did that I really
> think I would want to make two different message types, one for filters and
> one for consuming, however that may make larger API changes than would be
> easy... What precisely would you want it to look like?
>
>
> On Thursday, August 11, 2016 at 11:48:21 AM UTC-6, OvermindDL1 wrote:
>>
>> Just as an aside, but I quite often return a mutated model *and*
>> commands, such as this for the shortest example I am finding:
>> ```elm
>>
>> InfoConnect uid ->
>> ( { model | uid = uid }
>> , Cmd.batch
>> [ connect_roomlist 0
>> , connect_roomlist uid
>> ]
>> )
>>
>> ```
>> So when we connected to the server, got an InfoConnect message back with
>> the unique ID of the user, they then are allowed to connect to both the
>> public and their personal room lists, so I submit those connection requests.
>>
>>
>> On Thursday, August 11, 2016 at 11:37:48 AM UTC-6, Kasey Speakman wrote:
>>>
>>> Hi all,
>>>
>>> I'm getting to know Elm. I recently read this article
>>> <http://marcosh.github.io/post/2016/07/09/elm-event-sourcing.html>
>>> about event sourcing in Elm. Essentially, the time-traveling debugger is
>>> event sourcing. But it's a pattern that could be used in an app for other
>>> great things. (Lots of literature on that in the internet. One particular
>>> interest of mine is producing a complete failing use case from live running
>>> app -- it's just all the events. Obviously wouldn't work for real-time
>>> apps... too many events... but for most of mine it would.)
>>>
>>> However, one thing that is a hindrance (to the TTD as well) and that has
>>> always bothered me about the Elm examples is this signature.
>>>
>>> update : Msg -> Model -> (Model, Cmd Msg)
>>>
>>>
>>> Because an update returns both a Model and Cmd, for instance, the
>>> time-traveling debugger "...needs to tell the runtime not to perform any
>>> side-effects during replay to avoid these issues"[1]. An event-sourcing
>>> implementation would have to figure a way to do the same without runtime
>>> hooks.
>>>
>>> This part of the architecture mixes concerns by returning a model and
>>> effects. And usually (not always) you see each message returning one or the
>>> other, not both. From the docs:
>>>
>>> update : Msg -> Model -> (Model, Cmd Msg)
>>> update msg model =
>>> case msg of
>>> Roll ->
>>> (model, Random.generate NewFace (Random.int 1 6))
>>>
>>> NewFace newFace ->
>>> (Model newFace, Cmd.none)
>>>
>>>
>>> Here, Roll does an effect, but nothing with the model. NewFace returns a
>>> new model but no effects. You do have cases where you want to update a UI
>>> element when an outside effect happens, like activating a spinner when
>>> sending off an HTTP request. Those could still be modeled as two "Cmd"s.
>>> One that immediately returns a separate message affecting the model's
>>> spinner. And another to do the HTTP request.
>>>
>>> So it seems to me that there are really two concepts at work here. There
>>> are "events" which have happened and can be used completely
>>> deterministically, and there are commands which interface with the outside
>>> and may produce events.
>>>
>>> I think it's something worth pointing out and considering for the
>>> future. What do y'all think?
>>>
>>> Kasey
>>>
>>> [1] source <http://debug.elm-lang.org/>, section "How Elm makes this
>>> possible", subsection "Purity", last paragraph
>>>
>>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.