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

overflowdb.traversal.package.scala Maven / Gradle / Ivy

package overflowdb

import overflowdb.util.JIteratorCastingWrapper

import scala.collection.IterableOnce
import scala.jdk.CollectionConverters._

package object traversal {

  implicit def jIteratortoTraversal[A](jiterator: java.util.Iterator[A]): Traversal[A] =
    iteratorToTraversal(jiterator.asScala)

  implicit def iteratorToTraversal[A](iterator: Iterator[A]): Traversal[A] =
    iterator.to(Traversal)

  implicit def iterableToTraversal[A](iterable: IterableOnce[A]): Traversal[A] =
    Traversal.from(iterable)

  implicit def toNodeTraversal[A <: Node](traversal: Traversal[A]): NodeTraversal[A] =
    new NodeTraversal[A](traversal)

  implicit def toEdgeTraversal[A <: Edge](traversal: Traversal[A]): EdgeTraversal[A] =
    new EdgeTraversal[A](traversal)

  implicit def toElementTraversal[A <: Element](traversal: Traversal[A]): ElementTraversal[A] =
    new ElementTraversal[A](traversal)

  implicit def toNodeTraversalViaAdditionalImplicit[A <: Node, Trav](traversable: Trav)(implicit toTraversal: Trav => Traversal[A]): NodeTraversal[A] =
    new NodeTraversal[A](toTraversal(traversable))

  implicit def toEdgeTraversalViaAdditionalImplicit[A <: Edge, Trav](traversable: Trav)(implicit toTraversal: Trav => Traversal[A]): EdgeTraversal[A] =
    new EdgeTraversal[A](toTraversal(traversable))

  implicit def toElementTraversalViaAdditionalImplicit[A <: Element, Trav](traversable: Trav)(implicit toTraversal: Trav => Traversal[A]): ElementTraversal[A] =
    new ElementTraversal[A](toTraversal(traversable))

  implicit def toNumericTraversal[A : Numeric](traversal: Traversal[A]): NumericTraversal[A] =
    new NumericTraversal[A](traversal)

  implicit class NodeOps[N <: Node](val node: N) extends AnyVal {
    /** start a new Traversal with this Node, i.e. lift it into a Traversal */
    def start: Traversal[N] =
      Traversal.fromSingle(node)
  }

  implicit class JIterableOps[A](val jIterator: java.util.Iterator[A]) extends AnyVal {

    /**
      * Wraps a java iterator into a scala iterator, and casts it's elements.
      * This is faster than `jIterator.asScala.map(_.asInstanceOf[B])` because
      * 1) `.asScala` conversion is actually quite slow: multiple method calls and a `match` without @switch
      * 2) no additional `map` step that iterates and creates yet another iterator
     **/
    def toScalaAs[B]: IterableOnce[B] =
      new JIteratorCastingWrapper[B](jIterator)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy