Я часто использую линзу при работе с вложенными структурами (JSON из различных API), и меня беспокоит, что нетривиальные манипуляции с данными с линзой несколько сложны.
Под нетривиальным пониманием я подразумеваю выполнение обновления на другом узле, чем узел, для которого я запрашиваю.
Например, я бы:
- Разверните, чтобы получить складной список интересных значений (например,
price
)
- Примените критерии в этом списке (например,
max
), чтобы определить «владеющую» сущность результата (например, order
)
- Разверните еще раз для некоторого интересного значения (скажем,
vip
флаг клиента)
- Наконец, обновите еще одно значение в этой структуре (скажем, добавьте новый
item
бесплатно до последнего заказа)
В некоторой степени надежной стратегией является использование «этапов», в которых используются простые линзы для извлечения промежуточных результатов, и применение новых линз для дальнейшего сужения или обновления результата. Но это несколько противоречит духу линзы, где я смогу обновить всю структуру.
В других случаях мне повезло найти комбинаторы, такие как maximumByOf
, aside
, но я чувствую, что мне не хватает словарного запаса и понимания проблемы - какого рода комбинаторов достаточно для такого рода задач?
Есть ли идиоматический способ сделать это с lens
?