Optimize interleave method
Benchmarking shows this is 20x faster for vectors.pull/2701/head
parent
f2301f334d
commit
828e727900
|
@ -1,21 +1,15 @@
|
|||
package lila.common
|
||||
|
||||
import scala.annotation.tailrec
|
||||
|
||||
object Sequence {
|
||||
def interleave[A](a: Seq[A], b: Seq[A]): Vector[A] = {
|
||||
val iterA = a.iterator
|
||||
val iterB = b.iterator
|
||||
val builder = Vector.newBuilder[A]
|
||||
while (iterA.hasNext && iterB.hasNext) {
|
||||
builder += iterA.next += iterB.next
|
||||
}
|
||||
builder ++= iterA ++= iterB
|
||||
|
||||
@tailrec
|
||||
def interleave[A](base: Vector[A], a: List[A], b: List[A]): Vector[A] = a match {
|
||||
case elt :: aTail => interleave(base :+ elt, b, aTail)
|
||||
case _ => base ++ b
|
||||
}
|
||||
|
||||
def interleave[A](a: Vector[A], b: Vector[A]): Vector[A] = interleave(Vector.empty, a, b)
|
||||
|
||||
@tailrec
|
||||
def interleave[A](acc: Vector[A], a: Vector[A], b: Vector[A]): Vector[A] = (a, b) match {
|
||||
case (a1 +: as, b1 +: bs) => interleave(acc :+ a1 :+ b1, as, bs)
|
||||
case (Vector(), y) => acc ++ y
|
||||
case (x, Vector()) => acc ++ x
|
||||
builder.result
|
||||
}
|
||||
}
|
||||
|
|
|
@ -134,7 +134,7 @@ case class Game(
|
|||
for {
|
||||
a <- moveTimes(startColor)
|
||||
b <- moveTimes(!startColor)
|
||||
} yield Sequence.interleave(Vector.empty, a, b)
|
||||
} yield Sequence.interleave(a, b)
|
||||
}
|
||||
|
||||
def bothClockStates = clockHistory.map(_ bothClockStates startColor)
|
||||
|
|
Loading…
Reference in New Issue