2016-12-13 40 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

感謝,多數民衆贊成罰款爲我用的情況! –