Skip to content

Commit c8bd61a

Browse files
committed
Direct implementations of MapN.{filterImpl,exists,forall}
1 parent 16a76b0 commit c8bd61a

File tree

1 file changed

+55
-0
lines changed
  • library/src/scala/collection/immutable

1 file changed

+55
-0
lines changed

library/src/scala/collection/immutable/Map.scala

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,10 @@ object Map extends MapFactory[Map] {
253253
override def foreach[U](f: ((K, V)) => U): Unit = {
254254
f((key1, value1))
255255
}
256+
override def exists(p: ((K, V)) => Boolean): Boolean = p((key1, value1))
257+
override def forall(p: ((K, V)) => Boolean): Boolean = p((key1, value1))
258+
override protected[collection] def filterImpl(pred: ((K, V)) => Boolean, isFlipped: Boolean): Map[K, V] =
259+
if (pred((key1, value1)) != isFlipped) this else Map.empty
256260
override def transform[W](f: (K, V) => W): Map[K, W] = {
257261
val walue1 = f(key1, value1)
258262
if (walue1.asInstanceOf[AnyRef] eq value1.asInstanceOf[AnyRef]) this.asInstanceOf[Map[K, W]]
@@ -330,6 +334,21 @@ object Map extends MapFactory[Map] {
330334
override def foreach[U](f: ((K, V)) => U): Unit = {
331335
f((key1, value1)); f((key2, value2))
332336
}
337+
override def exists(p: ((K, V)) => Boolean): Boolean = p((key1, value1)) || p((key2, value2))
338+
override def forall(p: ((K, V)) => Boolean): Boolean = p((key1, value1)) && p((key2, value2))
339+
override protected[collection] def filterImpl(pred: ((K, V)) => Boolean, isFlipped: Boolean): Map[K, V] = {
340+
var k1 = null.asInstanceOf[K]
341+
var v1 = null.asInstanceOf[V]
342+
var n = 0
343+
if (pred((key1, value1)) != isFlipped) { {k1 = key1; v1 = value1}; n += 1}
344+
if (pred((key2, value2)) != isFlipped) { if (n == 0) {k1 = key2; v1 = value2}; n += 1}
345+
346+
n match {
347+
case 0 => Map.empty
348+
case 1 => new Map1(k1, v1)
349+
case 2 => this
350+
}
351+
}
333352
override def transform[W](f: (K, V) => W): Map[K, W] = {
334353
val walue1 = f(key1, value1)
335354
val walue2 = f(key2, value2)
@@ -420,6 +439,23 @@ object Map extends MapFactory[Map] {
420439
override def foreach[U](f: ((K, V)) => U): Unit = {
421440
f((key1, value1)); f((key2, value2)); f((key3, value3))
422441
}
442+
override def exists(p: ((K, V)) => Boolean): Boolean = p((key1, value1)) || p((key2, value2)) || p((key3, value3))
443+
override def forall(p: ((K, V)) => Boolean): Boolean = p((key1, value1)) && p((key2, value2)) && p((key3, value3))
444+
override protected[collection] def filterImpl(pred: ((K, V)) => Boolean, isFlipped: Boolean): Map[K, V] = {
445+
var k1, k2 = null.asInstanceOf[K]
446+
var v1, v2 = null.asInstanceOf[V]
447+
var n = 0
448+
if (pred((key1, value1)) != isFlipped) { { k1 = key1; v1 = value1 }; n += 1}
449+
if (pred((key2, value2)) != isFlipped) { if (n == 0) { k1 = key2; v1 = value2 } else { k2 = key2; v2 = value2 }; n += 1}
450+
if (pred((key3, value3)) != isFlipped) { if (n == 0) { k1 = key3; v1 = value3 } else if (n == 1) { k2 = key3; v2 = value3 }; n += 1}
451+
452+
n match {
453+
case 0 => Map.empty
454+
case 1 => new Map1(k1, v1)
455+
case 2 => new Map2(k1, v1, k2, v2)
456+
case 3 => this
457+
}
458+
}
423459
override def transform[W](f: (K, V) => W): Map[K, W] = {
424460
val walue1 = f(key1, value1)
425461
val walue2 = f(key2, value2)
@@ -525,6 +561,25 @@ object Map extends MapFactory[Map] {
525561
override def foreach[U](f: ((K, V)) => U): Unit = {
526562
f((key1, value1)); f((key2, value2)); f((key3, value3)); f((key4, value4))
527563
}
564+
override def exists(p: ((K, V)) => Boolean): Boolean = p((key1, value1)) || p((key2, value2)) || p((key3, value3)) || p((key4, value4))
565+
override def forall(p: ((K, V)) => Boolean): Boolean = p((key1, value1)) && p((key2, value2)) && p((key3, value3)) && p((key4, value4))
566+
override protected[collection] def filterImpl(pred: ((K, V)) => Boolean, isFlipped: Boolean): Map[K, V] = {
567+
var k1, k2, k3 = null.asInstanceOf[K]
568+
var v1, v2, v3 = null.asInstanceOf[V]
569+
var n = 0
570+
if (pred((key1, value1)) != isFlipped) { { k1 = key1; v1 = value1 }; n += 1}
571+
if (pred((key2, value2)) != isFlipped) { if (n == 0) { k1 = key2; v1 = value2 } else { k2 = key2; v2 = value2 }; n += 1}
572+
if (pred((key3, value3)) != isFlipped) { if (n == 0) { k1 = key3; v1 = value3 } else if (n == 1) { k2 = key3; v2 = value3 } else { k3 = key3; v3 = value3}; n += 1}
573+
if (pred((key4, value4)) != isFlipped) { if (n == 0) { k1 = key4; v1 = value4 } else if (n == 1) { k2 = key4; v2 = value4 } else if (n == 2) { k3 = key4; v3 = value4 }; n += 1}
574+
575+
n match {
576+
case 0 => Map.empty
577+
case 1 => new Map1(k1, v1)
578+
case 2 => new Map2(k1, v1, k2, v2)
579+
case 3 => new Map3(k1, v1, k2, v2, k3, v3)
580+
case 4 => this
581+
}
582+
}
528583
override def transform[W](f: (K, V) => W): Map[K, W] = {
529584
val walue1 = f(key1, value1)
530585
val walue2 = f(key2, value2)

0 commit comments

Comments
 (0)