2015-05-17 5 views
1

Можно ли упростить этот код?Упрощение рекурсивного обновления записей

update : Action -> Model -> Model 
update action model = 
    let 
    formValue = model.formValue 
    in 
    case action of 
     UpdateWhat what -> 
     let 
      newValue = { formValue | what <- what } 
     in 
      { model | formValue <- newValue } 
     UpdateTrigger trigger -> 
     let 
      newValue = { formValue | trigger <- trigger } 
     in 
      { model | formValue <- newValue } 

Как я планирую добавить еще пару Update... статей, полезно абстрагироваться на это немного.

Код написан так, как он поступает, потому что Elm не принимает обновления внутренней записи.

ответ

2

Я думаю, что вы ищете, focus library:

Фокуса

Фокус является способом работы с конкретными частями большой порции данных. На самом базовом уровне он позволяет вам создавать и устанавливать поля записи простым и составным образом. Это означает, что вы можете избежать написания специального синтаксиса обновления записи и использовать что-то, что более элегантно.

Это дает возможность писать такие вещи, как замораживание в следующем фрагменте:

mario = 
    { super = False 
    , fire = False 
    , physics = { position = { x=3, y=4 } 
       , velocity = { x=1, y=1 } 
       } 
    } 

freeze object = 
    set (physics => velocity) { x=0, y=0 } object 

В примере кода физике и скорости являются фокусы. Вы можете создать фокус с кодом, как в следующем, чтобы использовать пример:

formValue = Focus.create .formValue (\f r -> { r | formValue <- f r.formValue }) 
what  = Focus.create .what  (\f r -> { r | what  <- f r.what }) 
trigger = Focus.create .trigger (\f r -> { r | trigger <- f r.trigger }) 

update : Action -> Model -> Model 
update action model = 
    case action of 
    UpdateWhat w -> Focus.set (formValue => what) w model 
    UpdateTrigger t -> Focus.set (formValue => trigger) t model 
+0

Спасибо, это сработало: https://github.com/srid/chronicle/commit/c0577c04c330021141a6c544728d5bfd884e094a –

Смежные вопросы