2016-12-13 4 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. Моя проблема заключается в том, что новые процентные значения основаны на значения атрибута PollChoice и totalValueCount из Poll.

То, что я сделал до сих пор:

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

Спасибо, то отлично для моего случая использования! –