使用Monocle Lenses使用另一个属性的值修改属性

时间:2016-12-13 14:23:18

标签: scala lenses 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 个答案:

答案 0 :(得分:3)

我不认为你可以在一个镜头中表达这一点,但.modify内的单独镜头效果很好:

Poll._pollChoices.composeTraversal(each).modify { choice =>
  PollChoice._percentage.set(choice.value / poll.totalVoteCount)(choice)
}(poll)