Одним из вариантов будет декодирование ваших данных в список записей о товарах, а также список цен. Тогда он будет достаточно гибким, чтобы получить price
, productId
и любое другое поле, которое может появиться в будущем:
type alias Product = { price : Float, productId: Int }
productDecoder : Decode.Decoder Product
productDecoder =
Decode.map2 Product
(Decode.field "price" Decode.float)
(Decode.field "productId" Decode.int)
decoder: Decode.Decoder (List Product)
decoder =
Decode.field "data" (Decode.list productDecoder)
Я предполагаю, что вы сортируете список в функции update
при обработке сообщения NewPrice
. Я все еще могу сделать с помощью функции List.sortBy . Или список может быть отсортирован прямо в decoder
с небольшой помощью Decode.map
:
decoder: Decode.Decoder (List Product)
decoder =
Decode.map (List.sortBy .price) (Decode.field "data" (Decode.list productDecoder))
Теперь отсортированный список получен в сообщении NewPrice
. Остается только один шаг - снова получить первый элемент, используя List.head либо в функции update
, либо в decoder
:
decoder: Decode.Decoder (Maybe Product)
decoder =
Decode.map ((List.sortBy .price) >> List.head) (Decode.field "data" (Decode.list productDecoder))
Вот ellie-app для демонстрационных целей.