Monocle полезен, когда нам нужно скопировать такие вложенные структуры, например,
import monocle.Traversal
import monocle.macros.GenLens
import cats.implicits._
val cleanMerchant = GenLens[OrderItem](_.merchant).set(None)
val cleanFType = GenLens[OrderItemGroup](_.fType).set(None)
val cleanGroupItems = Traversal.fromTraverse[List, OrderItemGroup].modify(g => g.copy(items = g.items.map(cleanMerchant)))
OrderRequest(cleanGroupItems(o.groups.toList).map(cleanFType))
output
OrderRequest(List(OrderItemGroup(id1,List(OrderItem(simple1,None), OrderItem(simple3,None)),None), OrderItemGroup(id2,List(OrderItem(simple1,None), OrderItem(simple2,None)),None)))
Чтобы очистить его с помощью ванильного Scala, попробуйте
def cleanOrderItemGroup(group: OrderItemGroup): OrderItemGroup = {
val items = group.items
val cleanItems = items.map(cleanOrderItem)
group.copy(items = cleanItems, fType = None)
}
def cleanOrderItem(item: OrderItem): OrderItem = {
item.copy(merchant = None)
}
OrderRequest(o.groups.map(cleanOrderItemGroup))
, который снова выводит
OrderRequest(List(OrderItemGroup(id1,List(OrderItem(simple1,None), OrderItem(simple3,None)),None), OrderItemGroup(id2,List(OrderItem(simple1,None), OrderItem(simple2,None)),None)))