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

proptics.syntax.SetterSyntax.scala Maven / Gradle / Ivy

package proptics.syntax

import algebra.lattice.Heyting
import cats.kernel.Semigroup
import spire.algebra.{Field, Ring, Semiring}

import proptics.Setter_

trait SetterSyntax {
  implicit def setterSTAAOps[S, T, A](setter: Setter_[S, T, A, A]): SetterSTAAOps[S, T, A] = SetterSTAAOps(setter)

  implicit def setterSTAOptionB[S, T, A, B](setter: Setter_[S, T, A, Option[B]]): SetterSTAOptionB[S, T, A, B] = SetterSTAOptionB(setter)
}

final case class SetterSTAOptionB[S, T, A, B](private val setter: Setter_[S, T, A, Option[B]]) extends AnyVal {
  /** modify the focus type of a [[Setter_]] using an Option */
  def setJust(s: S)(b: B): T = setter.set(Some(b))(s)
}

final case class SetterSTAAOps[S, T, A](private val setter: Setter_[S, T, A, A]) extends AnyVal {
  /** modify the focus type of a [[Setter_]] using a Semiring additive */
  def addOver(s: S)(a: A)(implicit ev0: Semiring[A]): T = setter.over(ev0.additive.combine(_, a))(s)

  /** modify the focus type of a [[Setter_]] using a Semiring multiplicative */
  def mulOver(s: S)(a: A)(implicit ev0: Semiring[A]): T = setter.over(ev0.multiplicative.combine(_, a))(s)

  /** modify the focus type of a [[Setter_]] using a Ring minus */
  def subOver(s: S)(a: A)(implicit ev0: Ring[A]): T = setter.over(ev0.minus(_, a))(s: S)

  /** modify the focus type of a [[Setter_]] using a Field div */
  def divOver(s: S)(a: A)(implicit ev0: Field[A]): T = setter.over(ev0.div(_, a))(s)

  /** modify the focus type of a [[Setter_]] using a Heyting or */
  def disjOver(s: S)(a: A)(implicit ev0: Heyting[A]): T = setter.over(ev0.or(_, a))(s)

  /** modify the focus type of a [[Setter_]] using a Heyting and */
  def conjOver(s: S)(a: A)(implicit ev0: Heyting[A]): T = setter.over(ev0.and(_, a))(s)

  /** modify the focus type of a [[Setter_]] using a Semigroup combine */
  def appendOver(s: S)(a: A)(implicit ev0: Semigroup[A]): T = setter.over(ev0.combine(_, a))(s)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy