Skip to content

Commit e8521eb

Browse files
authored
Merge pull request scala#7163 from xuwei-k/Tuple-Zipped-return
use while instead of foreach and return
2 parents ac9f829 + 8dfebdd commit e8521eb

File tree

2 files changed

+45
-63
lines changed

2 files changed

+45
-63
lines changed

src/library/scala/runtime/Tuple2Zipped.scala

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -48,27 +48,23 @@ final class Tuple2Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2]](p
4848
def map[B, To](f: (El1, El2) => B)(implicit bf: BuildFrom[It1, B, To]): To = {
4949
val b = bf.newBuilder(coll1)
5050
b.sizeHint(coll1, 0)
51+
val elems1 = coll1.iterator
5152
val elems2 = coll2.iterator
5253

53-
for (el1 <- coll1) {
54-
if (elems2.hasNext)
55-
b += f(el1, elems2.next())
56-
else
57-
return b.result()
54+
while (elems1.hasNext && elems2.hasNext) {
55+
b += f(elems1.next(), elems2.next())
5856
}
5957

6058
b.result()
6159
}
6260

6361
def flatMap[B, To](f: (El1, El2) => IterableOnce[B])(implicit bf: BuildFrom[It1, B, To]): To = {
6462
val b = bf.newBuilder(coll1)
63+
val elems1 = coll1.iterator
6564
val elems2 = coll2.iterator
6665

67-
for (el1 <- coll1) {
68-
if (elems2.hasNext)
69-
b ++= f(el1, elems2.next())
70-
else
71-
return b.result()
66+
while (elems1.hasNext && elems2.hasNext) {
67+
b ++= f(elems1.next(), elems2.next())
7268
}
7369

7470
b.result()
@@ -77,31 +73,29 @@ final class Tuple2Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2]](p
7773
def filter[To1, To2](f: (El1, El2) => Boolean)(implicit bf1: BuildFrom[It1, El1, To1], bf2: BuildFrom[It2, El2, To2]): (To1, To2) = {
7874
val b1 = bf1.newBuilder(coll1)
7975
val b2 = bf2.newBuilder(coll2)
76+
val elems1 = coll1.iterator
8077
val elems2 = coll2.iterator
8178

82-
for (el1 <- coll1) {
83-
if (elems2.hasNext) {
84-
val el2 = elems2.next()
85-
if (f(el1, el2)) {
86-
b1 += el1
87-
b2 += el2
88-
}
79+
while (elems1.hasNext && elems2.hasNext) {
80+
val el1 = elems1.next()
81+
val el2 = elems2.next()
82+
if (f(el1, el2)) {
83+
b1 += el1
84+
b2 += el2
8985
}
90-
else return (b1.result(), b2.result())
9186
}
9287

9388
(b1.result(), b2.result())
9489
}
9590

9691
def exists(p: (El1, El2) => Boolean): Boolean = {
92+
val elems1 = coll1.iterator
9793
val elems2 = coll2.iterator
9894

99-
for (el1 <- coll1) {
100-
if (elems2.hasNext) {
101-
if (p(el1, elems2.next()))
102-
return true
95+
while (elems1.hasNext && elems2.hasNext) {
96+
if (p(elems1.next(), elems2.next())) {
97+
return true
10398
}
104-
else return false
10599
}
106100
false
107101
}
@@ -112,13 +106,11 @@ final class Tuple2Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2]](p
112106
def iterator: Iterator[(El1, El2)] = coll1.iterator.zip(coll2.iterator)
113107
override def isEmpty: Boolean = coll1.isEmpty || coll2.isEmpty
114108
def foreach[U](f: (El1, El2) => U): Unit = {
109+
val elems1 = coll1.iterator
115110
val elems2 = coll2.iterator
116111

117-
for (el1 <- coll1) {
118-
if (elems2.hasNext)
119-
f(el1, elems2.next())
120-
else
121-
return
112+
while (elems1.hasNext && elems2.hasNext) {
113+
f(elems1.next(), elems2.next())
122114
}
123115
}
124116

src/library/scala/runtime/Tuple3Zipped.scala

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -48,28 +48,24 @@ final class Tuple3Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2], E
4848

4949
def map[B, To](f: (El1, El2, El3) => B)(implicit bf: BuildFrom[It1, B, To]): To = {
5050
val b = bf.newBuilder(coll1)
51+
val elems1 = coll1.iterator
5152
val elems2 = coll2.iterator
5253
val elems3 = coll3.iterator
5354

54-
for (el1 <- coll1) {
55-
if (elems2.hasNext && elems3.hasNext)
56-
b += f(el1, elems2.next(), elems3.next())
57-
else
58-
return b.result()
55+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
56+
b += f(elems1.next(), elems2.next(), elems3.next())
5957
}
6058
b.result()
6159
}
6260

6361
def flatMap[B, To](f: (El1, El2, El3) => IterableOnce[B])(implicit bf: BuildFrom[It1, B, To]): To = {
6462
val b = bf.newBuilder(coll1)
63+
val elems1 = coll1.iterator
6564
val elems2 = coll2.iterator
6665
val elems3 = coll3.iterator
6766

68-
for (el1 <- coll1) {
69-
if (elems2.hasNext && elems3.hasNext)
70-
b ++= f(el1, elems2.next(), elems3.next())
71-
else
72-
return b.result()
67+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
68+
b ++= f(elems1.next(), elems2.next(), elems3.next())
7369
}
7470
b.result()
7571
}
@@ -81,37 +77,33 @@ final class Tuple3Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2], E
8177
val b1 = bf1.newBuilder(coll1)
8278
val b2 = bf2.newBuilder(coll2)
8379
val b3 = bf3.newBuilder(coll3)
80+
val elems1 = coll1.iterator
8481
val elems2 = coll2.iterator
8582
val elems3 = coll3.iterator
86-
def result = (b1.result(), b2.result(), b3.result())
87-
88-
for (el1 <- coll1) {
89-
if (elems2.hasNext && elems3.hasNext) {
90-
val el2 = elems2.next()
91-
val el3 = elems3.next()
92-
93-
if (f(el1, el2, el3)) {
94-
b1 += el1
95-
b2 += el2
96-
b3 += el3
97-
}
83+
84+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
85+
val el1 = elems1.next()
86+
val el2 = elems2.next()
87+
val el3 = elems3.next()
88+
89+
if (f(el1, el2, el3)) {
90+
b1 += el1
91+
b2 += el2
92+
b3 += el3
9893
}
99-
else return result
10094
}
101-
102-
result
95+
(b1.result(), b2.result(), b3.result())
10396
}
10497

10598
def exists(p: (El1, El2, El3) => Boolean): Boolean = {
99+
val elems1 = coll1.iterator
106100
val elems2 = coll2.iterator
107101
val elems3 = coll3.iterator
108102

109-
for (el1 <- coll1) {
110-
if (elems2.hasNext && elems3.hasNext) {
111-
if (p(el1, elems2.next(), elems3.next()))
112-
return true
103+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
104+
if (p(elems1.next(), elems2.next(), elems3.next())) {
105+
return true
113106
}
114-
else return false
115107
}
116108
false
117109
}
@@ -122,14 +114,12 @@ final class Tuple3Zipped[El1, It1 <: Iterable[El1], El2, It2 <: Iterable[El2], E
122114
def iterator: Iterator[(El1, El2, El3)] = coll1.iterator.zip(coll2.iterator).zip(coll3.iterator).map { case ((a, b), c) => (a, b, c)}
123115
override def isEmpty: Boolean = coll1.isEmpty || coll2.isEmpty || coll3.isEmpty
124116
def foreach[U](f: (El1, El2, El3) => U): Unit = {
117+
val elems1 = coll1.iterator
125118
val elems2 = coll2.iterator
126119
val elems3 = coll3.iterator
127120

128-
for (el1 <- coll1) {
129-
if (elems2.hasNext && elems3.hasNext)
130-
f(el1, elems2.next(), elems3.next())
131-
else
132-
return
121+
while (elems1.hasNext && elems2.hasNext && elems3.hasNext) {
122+
f(elems1.next(), elems2.next(), elems3.next())
133123
}
134124
}
135125

0 commit comments

Comments
 (0)