All Downloads are FREE. Search and download functionalities are using the official Maven repository.

algebra.std.option.scala Maven / Gradle / Ivy

The newest version!
package algebra
package std

import scala.annotation.tailrec
import scala.collection.mutable

package object option extends OptionInstances

trait OptionInstances extends OptionInstances1 {
  implicit def optionOrder[A: Order] = new OptionOrder[A]
  implicit def optionMonoid[A: Semigroup] = new OptionMonoid[A]
}

trait OptionInstances1 extends OptionInstances0 {
  implicit def optionPartialOrder[A: PartialOrder] = new OptionPartialOrder[A]
}

trait OptionInstances0 {
  implicit def optionEq[A: Eq] = new OptionEq[A]
}

class OptionOrder[A](implicit A: Order[A]) extends Order[Option[A]] {
  def compare(x: Option[A], y: Option[A]): Int =
    x match {
      case None =>
        if (y.isEmpty) 0 else -1
      case Some(a) =>
        y match {
          case None => 1
          case Some(b) => A.compare(a, b)
        }
    }
}

class OptionPartialOrder[A](implicit A: PartialOrder[A]) extends PartialOrder[Option[A]] {
  def partialCompare(x: Option[A], y: Option[A]): Double =
    x match {
      case None =>
        if (y.isEmpty) 0.0 else -1.0
      case Some(a) =>
        y match {
          case None => 1.0
          case Some(b) => A.partialCompare(a, b)
        }
    }
}

class OptionEq[A](implicit A: Eq[A]) extends Eq[Option[A]] {
  def eqv(x: Option[A], y: Option[A]): Boolean =
    x match {
      case None => y.isEmpty
      case Some(a) =>
        y match {
          case None => false
          case Some(b) => A.eqv(a, b)
        }
    }
}

class OptionMonoid[A](implicit A: Semigroup[A]) extends Monoid[Option[A]] {
  def empty: Option[A] = None
  def combine(x: Option[A], y: Option[A]): Option[A] =
    x match {
      case None => y
      case Some(a) =>
        y match {
          case None => x
          case Some(b) => Some(A.combine(a, b))
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy