app/lib/OrderingImplicits.scala (20 lines of code) (raw):

package lib import org.joda.time.DateTime import scala.math.Ordering object OrderingImplicits { implicit val jodaDateTimeOrdering: Ordering[DateTime] = Ordering.fromLessThan(_ isBefore _) implicit def nonesLast[T](implicit ord: Ordering[T]): Ordering[Option[T]] = new Ordering[Option[T]] { override def compare(x: Option[T], y: Option[T]) = (x, y) match { case (None, None) => 0 case (None, _) => 1 case (_, None) => -1 case (Some(x), Some(y)) => ord.compare(x, y) } } implicit val unpublishedOrdering: Ordering[(Int, Option[DateTime])] = { Ordering.Tuple2(Ordering.Int.reverse, Ordering.Option(jodaDateTimeOrdering)) } implicit val publishedOrdering: Ordering[(Option[DateTime], DateTime)] = { Ordering.Tuple2(nonesLast(jodaDateTimeOrdering.reverse), jodaDateTimeOrdering.reverse) } }