All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.metastack.metarx.Tree.scala Maven / Gradle / Ivy

The newest version!
package pl.metastack.metarx

trait Tree[T] {
  val value: Var[T]
  val children: Buffer[Tree[T]]

  def find(f: Tree[T] => Boolean): Option[Tree[T]] =
    if (f(this)) Some(this)
    else children.elements.foldLeft(Option.empty[Tree[T]]) { (acc, cur) =>
      if (acc.isDefined) acc
      else cur.find(f)
    }

  def findChild(f: Tree[T] => Boolean): Option[Tree[T]] = {
    val found = children.elements.find(f)
    if (found.isDefined) found
    else children.elements.foldLeft(Option.empty[Tree[T]]) { (acc, cur) =>
      if (acc.isDefined) acc
      else cur.findChild(f)
    }
  }

  def parentOf(node: Tree[T]): Option[Tree[T]] = {
    val found = children.elements.find(
      _.children.elements.contains(node)
    )

    if (found.isDefined) found
    else children.elements.foldLeft(Option.empty[Tree[T]]) { (acc, cur) =>
      if (acc.isDefined) acc
      else cur.parentOf(node)
    }
  }
}

object Tree {
  def apply[T](root: T, child: Tree[T]*): Tree[T] = new Tree[T] {
    val value = Var(root)
    val children = Buffer(child: _*)
    override def toString = s"Tree($value, $children)"
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy