Isn't `doSideEffects` basically just the current `update` function though? 
 Except it is returning a list of changes (via message) to perform to a 
model instead of doing it in-place?  What is this saving precisely?



On Thursday, August 11, 2016 at 4:05:57 PM UTC-6, Kasey Speakman wrote:
>
> Actually, I'd probably use a List instead of Maybe on the immediately 
> returned event(s).
>
> doSideEffects : Act -> Model -> (List Evt, Cmd Evt)
> doSideEffects act model = 
>   case act of
>     UpdateCustomer customer ->
>       ( [ CustomerUpdateRequested ]
>       , callServerWithCustomer customer
>       )
>
>     ...
>
> updateModel : Evt -> Model -> Model
>     ... -- implementation as previous
>
> update : Msg -> Model -> (Model, Cmd Msg)
> update msg model =
>   case msg of
>     Action act ->
>       let
>         (events, command) = doSideEffects act model
>       in
>         (List.foldr updateModel model events, Cmd.map Evt command)
>
>     Event evt ->
>       (updateModel evt model, Cmd.none)
>
>
>
> On Thursday, August 11, 2016 at 4:26:03 PM UTC-5, Kasey Speakman wrote:
>>
>> Yes, that was the goal. That way the UI state is utterly deterministic / 
>> reproducible in isolation of all outside services.
>>
>> That's a good point on the race conditions. I only use Cmd.batch because 
>> it's the facility that came to mind. (I'm still getting acquainted with 
>> Elm.) I don't know if Cmd.batch makes any ordering guarantee.
>>
>> If not we'd be more or less back to square one. Abuse `update` to do both 
>> things.
>>
>> doSideEffects: Act -> Model -> (Maybe Evt, Cmd Evt)
>> doSideEffects act model =
>>   case act of
>>     UpdateCustomer customer ->
>>       (Just CustomerUpdateRequested, callServerWithCustomer customer)
>>
>>     ...
>>
>> updateModel: Evt -> Model -> Model
>> ... -- implementation as previous
>>
>> maybeUpdateModel:  Maybe Evt -> Model -> Model
>> maybeUpdateModel evtOpt model =
>>   case evtOpt of
>>     Nothing ->
>>       model
>>
>>     Just evt ->
>>       updateModel evt model
>>
>> update : Msg -> Model -> (Model, Cmd Msg)
>> update msg model =
>>   case msg of
>>     Action act ->
>>       let
>>         (eventNow, command) = doSideEffects act model
>>       in
>>         (maybeUpdateModel eventNow model, Cmd.map Evt command)
>>
>>     Event evt ->
>>       (updateModel evt model, Cmd.none)
>>
>> So this should apply an event immediately if one is needed for the 
>> action. But it still keeps the model updating events separate.
>>
>> These immediate events would be seen by a userland event-store 
>> implementation (which is underneath updateModel), but I bet the TTD 
>> wouldn't see it since it doesn't come from Elm.
>>
>> On Thursday, August 11, 2016 at 3:43:36 PM UTC-5, OvermindDL1 wrote:
>>>
>>> So you really are wanting to hard device events into two different ones, 
>>> those that can *only* alter the model, and those that can *only* send 
>>> commands (which may call ones that alter the model).  Unsure if it might 
>>> actually happen but might have to take into account possible race 
>>> conditions for if other messages appear before your other expected ones are 
>>> processed through?  Easier to do that atomically all at once?
>>>
>>>
>>> On Thursday, August 11, 2016 at 2:25:22 PM UTC-6, Kasey Speakman wrote:
>>>>
>>>> doSideEffects above would also have to map Cmd Evt to Cmd Msg.
>>>>
>>>

-- 
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.

Reply via email to