Модификация атрибута с помощью линз Monocle с использованием значения другого атрибута
У меня есть следующая модель
import monocle.macros.Lenses
import monocle.function.all._
import monocle.std.list._
@Lenses("_") case class Poll(pollChoices: List[PollChoice], totalVoteCount: Int)
@Lenses("_") case class PollChoice(id: Int, value: Int, percentage: Int)
Я пытаюсь добиться обновления атрибута pollChoices опроса путем обновления всех процентных атрибутов каждого элемента в списке pollChoices. Моя проблема заключается в том, что новые процентные значения основаны на атрибуте значения PollChoice и totalValueCount опроса.
Что я сделал до сих пор:
val poll = Poll(List(PollChoice(1,3,0), PollChoice(2,5,0)), 8)
(Poll._pollChoices composeTraversal each composeLens PollChoice._percentage)
.modify(oldPercentage => oldPercentage + 1)(poll)
Но таким образом я могу получить доступ только к процентному атрибуту элемента, который я обновляю на этапе изменения, мне также нужно это значение.
Я предполагаю, что мне нужно будет использовать Traversable, чтобы сделать такую модификацию, но я не уверен, как. Благодарю.
1 ответ
Решение
Я не думаю, что вы можете выразить это в одной линзе, но в отдельной линзе внутри .modify
работает хорошо:
Poll._pollChoices.composeTraversal(each).modify { choice =>
PollChoice._percentage.set(choice.value / poll.totalVoteCount)(choice)
}(poll)