Elm Language
Realizzare funzioni di aggiornamento complesse con ccapndave / elm-update-extra
Ricerca…
introduzione
ccapndave / elm-update-extra è un fantastico pacchetto che ti aiuta a gestire funzioni di aggiornamento più complesse e può essere molto utile.
Messaggio che chiama un elenco di messaggi
Usando la funzione di sequence puoi facilmente descrivere un messaggio che chiama un elenco di altri messaggi. È utile quando si ha a che fare con la semantica dei messaggi.
Esempio 1: stai creando un motore di gioco e devi aggiornare lo schermo su ogni frame.
module Video exposing (..)
type Message = module Video exposing (..)
import Update.Extra exposing (sequence)
-- Model definition [...]
type Message
= ClearBuffer
| DrawToBuffer
| UpdateLogic
| Update
update : Message -> Model -> (Model, Cmd)
update msg model =
case msg of
ClearBuffer ->
-- do something
DrawToBuffer ->
-- do something
UpdateLogic ->
-- do something
Update ->
model ! []
|> sequence update [ ClearBuffer
, DrawToBuffer
, UpdateLogic]
Concatenare messaggi con andThen
La funzione andThen consente di aggiornare la composizione delle chiamate. Può essere utilizzato con l'operatore pipeline ( |> ) per gli aggiornamenti della catena.
Esempio: stai creando un editor di documenti e vuoi che ogni messaggio di modifica che hai inviato al documento, lo salvi anche:
import Update.Extra exposing (andThen)
import Update.Extra.Infix exposing (..)
-- type alias Model = [...]
type Message
= ModifyDocumentWithSomeSettings
| ModifyDocumentWithOtherSettings
| SaveDocument
update : Model -> Message -> (Model, Cmd)
update model msg =
case msg of
ModifyDocumentWithSomeSettings ->
-- make the modifications
(modifiedModel, Cmd.none)
|> andThen SaveDocument
ModifyDocumentWithOtherSettings ->
-- make other modifications
(modifiedModel, Cmd.none)
|> andThen SaveDocument
SaveDocument ->
-- save document code
Se Update.Extra.Infix exposing (..) anche Update.Extra.Infix exposing (..) potresti essere in grado di utilizzare l'operatore infisso:
update : Model -> Message -> (Model, Cmd)
update model msg =
case msg of
ModifyDocumentWithSomeSettings ->
-- make the modifications
(modifiedModel, Cmd.none)
:> andThen SaveDocument
ModifyDocumentWithOtherSettings ->
-- make other modifications
(modifiedModel, Cmd.none)
:> SaveDocument
SaveDocument ->
-- save document code