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

spire.algebra.partial.Semigroupoid.scala Maven / Gradle / Ivy

The newest version!
package spire
package algebra
package partial

import spire.util.Opt

/**
 * A semigroupoid is any set `A` with a partial binary associative operation (`partialOp`),
  * which is associative in the following sense: if f,g,h are elements of the semigroupoid
  * such that either:
  *   (i) f |+|? g is defined and g |+|? h is defined
  *  (ii) f |+|? g is defined and (f |+|? g).get |+|? h is defined
  * (iii) g |+|? h is defined and f |+|? (g |+|? h).get is defined
  *
  * then all of f |+|? g, g |+|? h, (f |+|? g).get |+|? h, f |+|? (g |+|? h).get
  * are defined and ((f |+|? g).get |+|? h).get = (f |+|? (g |+|? h).get).get
  */
trait Semigroupoid[A] extends Any {
  def opIsDefined(x: A, y: A): Boolean = partialOp(x, y).nonEmpty
  def partialOp(x: A, y: A): Opt[A]
}

trait SemigroupoidLowPriority {
  implicit def fromSemigroup[A](implicit semigroup: Semigroup[A]): Semigroupoid[A] =
    new Semigroupoid[A] {
      override def opIsDefined(x: A, y: A): Boolean = true
      def partialOp(x: A, y: A): Opt[A] = Opt(semigroup.op(x, y))
    }
}

object Semigroupoid extends SemigroupoidLowPriority {
  @inline final def apply[A](implicit s: Semigroupoid[A]): Semigroupoid[A] = s
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy