Elm Language
Создание сложных функций обновления с помощью ccapndave / elm-update-extra
Поиск…
Вступление
ccapndave / elm-update-extra - фантастический пакет, который помогает вам обрабатывать более сложные функции обновления и может быть очень полезен.
Сообщение, которое вызывает список сообщений
Используя функцию sequence вы можете легко описать сообщение, которое вызывает список других сообщений. Это полезно при работе с семантикой ваших сообщений.
Пример 1: Вы создаете игровой движок, и вам нужно обновить экран на каждом кадре.
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]
Связывание сообщений с помощью andThen
Функция andThen позволяет обновить композицию вызова. Может использоваться с оператором конвейера ( |> ) для обновления цепочек.
Пример. Вы создаете редактор документов и хотите, чтобы каждое сообщение об изменении, которое вы отправляете в документ, вы также сохраняете:
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
Если вы импортируете также Update.Extra.Infix exposing (..) вы можете использовать оператор infix:
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