2016-12-13 42 views
7

我有以下型号使用其他属性的值修改与单片眼镜镜片的属性

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 List中的每个元素。我的问题是,新的百分比值是基于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来做这种修改,但我不知道如何。 谢谢。

回答

2

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

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

感谢,多数民众赞成罚款为我用的情况! –