Skip to content

Instantly share code, notes, and snippets.

@privateblue
Last active August 29, 2015 13:56
Show Gist options
  • Save privateblue/8867305 to your computer and use it in GitHub Desktop.
Save privateblue/8867305 to your computer and use it in GitHub Desktop.
package org.pblue.treee
case class Node[T](var value: T, var children: List[Node[T]])
trait Treee[T] {
val root: Node[T]
def filter(pred: T => Boolean): List[Node[T]]
}
class TreeeImpl[T](val root: Node[T]) extends Treee[T] {
private def flatten(node: Node[T]): List[Node[T]] =
node :: node.children.flatMap(flatten(_))
val nodes = flatten(root)
def filter(pred: T => Boolean) = nodes.filter(n => pred(n.value))
}
object XmlTreee {
def wrap(node: scala.xml.Node): Node[scala.xml.Node] = {
val wrapped = Node(node, List())
wrapped.children = node.child.map(wrap(_)).toList
wrapped
}
def apply(node: scala.xml.Node) = new TreeeImpl(wrap(node))
def unwrap(node: Node[scala.xml.Node]): scala.xml.Node = {
val unwrapped = node.value
unwrapped match {
case e: scala.xml.Elem =>
val children = node.children.map(unwrap(_))
e.copy(child = children)
case n => n
}
}
def build(treee: TreeeImpl[scala.xml.Node]) = unwrap(treee.root)
def update(node: Node[scala.xml.Node], newElem: scala.xml.Node) = {
val wrapped = wrap(newElem)
node.value = newElem
node.children = wrapped.children
}
}
// how to use
object Main {
def main(args: Array[String]) {
val xml =
<pisa foo="bar">
<kaka hello="world">
mivan MIVAN MIVAN?!!?!
</kaka>
<fika foo="nembar"><fos></fos></fika>
</pisa>
println(xml)
val replacement = <fing>:DDDDD</fing>
println
println(s"replacing with $replacement")
val treee = XmlTreee(xml)
val selectedNodes = treee.filter(elem => elem.label == "fika")
selectedNodes.foreach(XmlTreee.update(_, replacement))
val newXml = XmlTreee.build(treee)
println()
println(newXml)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment