Если вы действительно хотите остаться неизменным, я бы определил функцию recMap
на Node
, например:
def recMap(f: NodeData => NodeData) : Node = Node(f(data), children.map(_.recMap(f)))
Затем вы можете использовать ее, как в этом примере (я сделал Node
кейс тоже):
type Bar = Int
case class NodeData(text: String, foo: List[Bar])
case class Node(data: NodeData, children: Seq[Node]) {
def recMap(f: NodeData => NodeData) : Node = Node(f(data), children.map(_.recMap(f)))
}
val tree = new Node(NodeData("parent", List(1, 2, 3, 4)), Seq(
Node(NodeData("a child", List(5, 6, 7, 8)), Seq.empty),
Node(NodeData("another child", List(9, 10, 11, 12)), Seq.empty)
))
val modifiedTree = tree.recMap(
data => NodeData(
if(data.text == "parent") "I am the parent!" else "I am a child!",
data.foo.filter(_ % 2 == 0)
)
)
println(modifiedTree)
Попробуйте!
Возможно, это то, что вы ищете.