Skip to content

Commit 4046983

Browse files
authored
Merge pull request scala#6576 from NthPortal/bug#10855/PR
bug#10855 Fix IterableOnceOps.min and .max
2 parents 08ab3c4 + 24efbdd commit 4046983

File tree

3 files changed

+18
-10
lines changed

3 files changed

+18
-10
lines changed

src/library/scala/collection/IterableOnce.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ trait IterableOnceOps[+A, +CC[_], +C] extends Any { this: IterableOnce[A] =>
724724
def min[B >: A](implicit ord: Ordering[B]): A = {
725725
if (isEmpty)
726726
throw new UnsupportedOperationException("empty.min")
727-
reduceLeft((x, y) => if (ord.lteq(x, y)) x else y)
727+
reduceLeft(ord.min)
728728
}
729729

730730
/** Finds the smallest element.
@@ -761,7 +761,7 @@ trait IterableOnceOps[+A, +CC[_], +C] extends Any { this: IterableOnce[A] =>
761761
def max[B >: A](implicit ord: Ordering[B]): A = {
762762
if (isEmpty)
763763
throw new UnsupportedOperationException("empty.max")
764-
reduceLeft((x, y) => if (ord.gteq(x, y)) x else y)
764+
reduceLeft(ord.max)
765765
}
766766

767767
/** Finds the largest element.

src/library/scala/math/Ordering.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializabl
101101
override def equiv(x: T, y: T): Boolean = compare(x, y) == 0
102102

103103
/** Return `x` if `x` >= `y`, otherwise `y`. */
104-
def max(x: T, y: T): T = if (gteq(x, y)) x else y
104+
def max[U <: T](x: U, y: U): U = if (gteq(x, y)) x else y
105105

106106
/** Return `x` if `x` <= `y`, otherwise `y`. */
107-
def min(x: T, y: T): T = if (lteq(x, y)) x else y
107+
def min[U <: T](x: U, y: U): U = if (lteq(x, y)) x else y
108108

109109
/** Return the opposite ordering of this one. */
110110
override def reverse: Ordering[T] = new Ordering[T] {
@@ -115,8 +115,8 @@ trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializabl
115115
override def lt(x: T, y: T) = outer.lt(y, x)
116116
override def gt(x: T, y: T) = outer.gt(y, x)
117117
override def equiv(x: T, y: T) = outer.equiv(y, x)
118-
override def max(x: T, y: T) = outer.min(x, y)
119-
override def min(x: T, y: T) = outer.max(x, y)
118+
override def max[U <: T](x: U, y: U) = outer.min(x, y)
119+
override def min[U <: T](x: U, y: U) = outer.max(x, y)
120120
}
121121

122122
/** Given f, a function from U into T, creates an Ordering[U] whose compare
@@ -363,8 +363,8 @@ object Ordering extends LowPriorityOrderingImplicits {
363363
override def lt(x: Float, y: Float): Boolean = x < y
364364
override def gt(x: Float, y: Float): Boolean = x > y
365365
override def equiv(x: Float, y: Float): Boolean = x == y
366-
override def max(x: Float, y: Float): Float = math.max(x, y)
367-
override def min(x: Float, y: Float): Float = math.min(x, y)
366+
override def max[U <: Float](x: U, y: U): U = math.max(x, y).asInstanceOf[U]
367+
override def min[U <: Float](x: U, y: U): U = math.min(x, y).asInstanceOf[U]
368368
}
369369
implicit object IeeeOrdering extends IeeeOrdering
370370
}
@@ -423,8 +423,8 @@ object Ordering extends LowPriorityOrderingImplicits {
423423
override def lt(x: Double, y: Double): Boolean = x < y
424424
override def gt(x: Double, y: Double): Boolean = x > y
425425
override def equiv(x: Double, y: Double): Boolean = x == y
426-
override def max(x: Double, y: Double): Double = math.max(x, y)
427-
override def min(x: Double, y: Double): Double = math.min(x, y)
426+
override def max[U <: Double](x: U, y: U): U = math.max(x, y).asInstanceOf[U]
427+
override def min[U <: Double](x: U, y: U): U = math.min(x, y).asInstanceOf[U]
428428
}
429429
implicit object IeeeOrdering extends IeeeOrdering
430430
}

test/junit/scala/collection/TraversableOnceTest.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,12 @@ class TraversableOnceTest {
9292
assert(Seq(1).minByOption(identity) == Some(1), "minByOption on a Non Empty Iterable has value")
9393
}
9494

95+
@Test
96+
def testMinMaxCorrectness(): Unit = {
97+
import Ordering.Double.IeeeOrdering
98+
val seq = Seq(5.0, 3.0, Double.NaN, 4.0)
99+
assert(seq.min.isNaN)
100+
assert(seq.max.isNaN)
101+
}
102+
95103
}

0 commit comments

Comments
 (0)