Elm Language
Création de fonctions de mise à jour complexes avec ccapndave / elm-update-extra
Recherche…
Introduction
ccapndave / elm-update-extra est un package fantastique qui vous aide à gérer des fonctions de mise à jour plus complexes et peut être très utile.
Message qui appelle une liste de messages
En utilisant la fonction de sequence , vous pouvez facilement décrire un message qui appelle une liste d'autres messages. C'est utile lorsque vous traitez la sémantique de vos messages.
Exemple 1: vous créez un moteur de jeu et vous devez actualiser l’écran à chaque image.
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]
Enchaîner des messages avec et puis
La fonction andThen permet de mettre à jour la composition de l'appel. Peut être utilisé avec l'opérateur de pipeline ( |> ) pour enchaîner les mises à jour.
Exemple: Vous créez un éditeur de document et vous souhaitez que chaque message de modification que vous envoyez à votre document, vous l'enregistrez également:
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
Si vous importez également Update.Extra.Infix exposing (..) vous pourrez peut-être utiliser l'opérateur infixe:
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