Модификация атрибута с помощью линз 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)
Другие вопросы по тегам