Skip to content

Commit 0328e94

Browse files
committed
use indexed seq instead of views, refactor MyersDiff to not use for-comprehensions (because of early returns)
1 parent 385085d commit 0328e94

File tree

16 files changed

+91
-190
lines changed

16 files changed

+91
-190
lines changed

stringdiff/src/main/scala-2.12/app/tulz/diff/compat/IndexedSeqView.scala

Lines changed: 0 additions & 28 deletions
This file was deleted.

stringdiff/src/main/scala-2.12/app/tulz/diff/compat/IndexedSeqViewOfCharOps.scala

Lines changed: 0 additions & 9 deletions
This file was deleted.

stringdiff/src/main/scala-2.12/app/tulz/diff/compat/IndexedSeqViewOfStringOps.scala

Lines changed: 0 additions & 9 deletions
This file was deleted.

stringdiff/src/main/scala-2.12/app/tulz/diff/compat/package.scala

Lines changed: 0 additions & 24 deletions
This file was deleted.

stringdiff/src/main/scala-2.13/app/tulz/diff/compat/package.scala

Lines changed: 0 additions & 7 deletions
This file was deleted.

stringdiff/src/main/scala-3/app/tulz/diff/compat/package.scala

Lines changed: 0 additions & 7 deletions
This file was deleted.

stringdiff/src/main/scala/app/tulz/diff/MyersDiff.scala

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package app.tulz.diff
22

3-
import compat._
4-
53
object MyersDiff {
64

7-
def diff[A](ss1: IndexedSeqView[A], ss2: IndexedSeqView[A]): Seq[Operation] = {
5+
def diff[A](ss1: IndexedSeq[A], ss2: IndexedSeq[A]): Seq[Operation] = {
86

97
def mod(a: Int, b: Int): Int = {
108
(b + (a % b)) % b
119
}
1210

1311
def rec(
14-
ss1: IndexedSeqView[A],
15-
ss2: IndexedSeqView[A],
12+
ss1: IndexedSeq[A],
13+
ss2: IndexedSeq[A],
1614
i: Int,
1715
j: Int
1816
): Seq[Operation] = {
@@ -24,10 +22,13 @@ object MyersDiff {
2422
val w = N - M
2523
val g = Array.fill(Z)(0)
2624
val p = Array.fill(Z)(0)
27-
for (h <- 0 until (L / 2 + mod(L, 2)) + 1) {
28-
for (r <- 0 until 2) {
25+
var h = 0
26+
while (h < (L / 2 + mod(L, 2)) + 1) {
27+
var r = 0
28+
while (r < 2) {
2929
val (c, d, o, m) = if (r == 0) (g, p, 1, 1) else (p, g, 0, -1)
30-
for (k <- -(h - 2 * Math.max(0, h - M)) until h - 2 * Math.max(0, h - N) + 1 by 2) {
30+
var k = -(h - 2 * Math.max(0, h - M))
31+
while (k < h - 2 * Math.max(0, h - N) + 1) {
3132
var a =
3233
if (k == -h || k != h && c(mod(k - 1, Z)) < c(mod(k + 1, Z))) {
3334
c(mod(k + 1, Z))
@@ -61,8 +62,11 @@ object MyersDiff {
6162
return Seq.empty
6263
}
6364
}
65+
k += 2
6466
}
67+
r += 1
6568
}
69+
h += 1
6670
}
6771
throw new RuntimeException("should never have reached here")
6872
} else if (N > 0) {

stringdiff/src/main/scala/app/tulz/diff/MyersInterpret.scala

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package app.tulz.diff
33
import app.tulz.diff.MyersDiff.Operation
44

55
import scala.collection.mutable.ListBuffer
6-
import compat._
76

87
object MyersInterpret {
98

@@ -12,13 +11,13 @@ object MyersInterpret {
1211

1312
def apply[A](
1413
ops: Seq[Operation],
15-
s1: IndexedSeqView[A],
16-
s2: IndexedSeqView[A]
17-
): List[DiffElement[IndexedSeqView[A]]] =
14+
s1: IndexedSeq[A],
15+
s2: IndexedSeq[A]
16+
): List[DiffElement[IndexedSeq[A]]] =
1817
if (ops.isEmpty) {
1918
List(DiffElement.InBoth(s1))
2019
} else {
21-
val buffer = new ListBuffer[DiffElement[IndexedSeqView[A]]]
20+
val buffer = new ListBuffer[DiffElement[IndexedSeq[A]]]
2221
buffer.sizeHint(ops.length)
2322
(Start +: ops).zip(ops :+ End).foreach {
2423
case (Start, Delete(deleteFrom, deleteCount)) =>

stringdiff/src/main/scala/app/tulz/diff/SeqDiff.scala

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package app.tulz.diff
22

33
import app.tulz.diff.util.DiffCollapse
4-
import compat._
54

65
object SeqDiff {
76

@@ -10,13 +9,13 @@ object SeqDiff {
109
s2: IndexedSeq[A],
1110
collapse: Boolean = true
1211
): List[DiffElement[IndexedSeq[A]]] =
13-
apply(s1.view, s2.view, collapse).map(_.map(_.toIndexedSeq))
12+
apply(s1, s2, collapse)
1413

1514
def apply[A](
16-
s1: IndexedSeqView[A],
17-
s2: IndexedSeqView[A],
15+
s1: IndexedSeq[A],
16+
s2: IndexedSeq[A],
1817
collapse: Boolean = true
19-
): List[DiffElement[IndexedSeqView[A]]] = {
18+
): List[DiffElement[IndexedSeq[A]]] = {
2019
val myersDiff = MyersDiff.diff(s1, s2)
2120
val diff = MyersInterpret(myersDiff, s1, s2)
2221
if (collapse) {

stringdiff/src/main/scala/app/tulz/diff/StringDiff.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package app.tulz.diff
22

33
import app.tulz.diff.format.DiffFormat
44
import app.tulz.diff.util.DiffCollapse
5-
import compat._
65

76
object StringDiff {
87

@@ -38,8 +37,10 @@ object StringDiff {
3837
s2: String,
3938
collapse: Boolean = true
4039
): List[DiffElement[String]] = {
41-
val myersDiff = MyersDiff.diff(s1.view, s2.view)
42-
val diff = MyersInterpret(myersDiff, s1.view, s2.view)
40+
val v1 = s1.toIndexedSeq
41+
val v2 = s2.toIndexedSeq
42+
val myersDiff = MyersDiff.diff(v1, v2)
43+
val diff = MyersInterpret(myersDiff, v1, v2)
4344
val result = if (collapse) {
4445
DiffCollapse(diff)
4546
} else {

0 commit comments

Comments
 (0)