Здесь у меня есть несколько функций, которые просто устанавливают одно поле в записи модели. На более динамичном языке я бы просто использовал одну функцию установки и передал бы ей имя поля (в виде строки) и значение, которое я хочу установить для объекта модели.
Есть ли способ передать имя поля в Elm? Как Elm делает что-то подобное?
type alias Patient =
{ id : String
, name : String
, dateOfBirth : String
, sex : String
... other fields
}
setPatientName : Patient -> String -> Patient
setPatientName patient value =
{ patient | name = value }
setPatientDateOfBirth : Patient -> String -> Patient
setPatientDateOfBirth patient value =
{ patient | dateOfBirth = value }
setPatientSex : Patient -> String -> Patient
setPatientSex patient value =
{ patient | sex = value }
... many others
-- idx is the index of the patient in the model (which is an array of patients)
-- UpdateCell is a variant of my Msg type, like this: UpdateCell Int (Patient -> String -> Patient) String
onInputHandler : Int -> (Patient -> String -> Patient) -> String -> Msg
onInputHandler idx setter inputText =
UpdateCell idx setter inputText
-- idx is the index of the patient in the model (which is an array of patients)
createTableRow : Int -> Patient -> Html Msg
createTableRow idx patient =
...
, input [ type_ "text", onInput (onInputHandler idx setPatientName), value patient.name ] []
, input [ type_ "text", onInput (onInputHandler idx setPatientDateOfBirth), value patient.dateOfBirth ] []
...
В настоящее время я использую каждую из этих функций в качестве обработчика событий для элементов ввода. Поэтому мне нужна функция, которую я могу использовать для обработки события ввода. В идеале я бы определил только одну функцию и использовал бы ее для всех элементов ввода и передал бы ей поле, которое я хочу обновить в записи пациента.