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

japgolly.scalajs.react.internal.monocle.MonoclePoly.scala Maven / Gradle / Ivy

The newest version!
package japgolly.scalajs.react.internal.monocle

import japgolly.scalajs.react.internal.monocle.CatsInstances._

// ===================================================================================================================

/** Provide access to the set function on any compatible optic.
  *
  * @tparam O The optic type.
  */
trait MonocleSetter[O[_, _, _, _]] {
  def set[S, A, B](l: O[S, S, A, B]): B => S => S
}

object MonocleSetter {
  // Keep this import here so that Lens etc take priority over .internal
  import monocle._

  implicit object LensS extends MonocleSetter[PLens] {
    @inline final override def set[S, A, B](l: PLens[S, S, A, B]): B => S => S = l.set
  }
  implicit object SetterS extends MonocleSetter[PSetter] {
    @inline final override def set[S, A, B](l: PSetter[S, S, A, B]): B => S => S = l.set
  }
  implicit object OptionalS extends MonocleSetter[POptional] {
    @inline final override def set[S, A, B](l: POptional[S, S, A, B]): B => S => S = l.set
  }
  implicit object IsoS extends MonocleSetter[PIso] {
    @inline final override def set[S, A, B](l: PIso[S, S, A, B]): B => S => S = l.set
  }
  implicit object PrismS extends MonocleSetter[PPrism] {
    @inline final override def set[S, A, B](l: PPrism[S, S, A, B]): B => S => S = l.set
  }
  implicit object TraversalS extends MonocleSetter[PTraversal] {
    @inline final override def set[S, A, B](l: PTraversal[S, S, A, B]): B => S => S = l.set
  }
}

// ===================================================================================================================

/** Provide access to the modify to Option function on any compatible optic.
  *
  * @tparam O The optic type.
  */
trait MonocleOptionalModifier[O[_, _, _, _]] {
  def modifyOption[S, T, A, B](l: O[S, T, A, B])(f: A => Option[B]): S => Option[T]
}

object MonocleOptionalModifier {
  // Keep this import here so that Lens etc take priority over .internal
  import monocle._

  implicit object LensM extends MonocleOptionalModifier[PLens] {
    @inline final override def modifyOption[S, T, A, B](l: PLens[S, T, A, B])(f: A => Option[B]) = l.modifyF(f)
  }
  implicit object OptionalM extends MonocleOptionalModifier[POptional] {
    @inline final override def modifyOption[S, T, A, B](l: POptional[S, T, A, B])(f: A => Option[B]) = l.modifyF(f)
  }
  implicit object IsoM extends MonocleOptionalModifier[PIso] {
    @inline final override def modifyOption[S, T, A, B](l: PIso[S, T, A, B])(f: A => Option[B]) = l.modifyF(f)
  }
  implicit object PrismM extends MonocleOptionalModifier[PPrism] {
    @inline final override def modifyOption[S, T, A, B](l: PPrism[S, T, A, B])(f: A => Option[B]) = l.modifyF(f)
  }
  implicit object TraversalM extends MonocleOptionalModifier[PTraversal] {
    @inline final override def modifyOption[S, T, A, B](l: PTraversal[S, T, A, B])(f: A => Option[B]) = l.modifyF(f)
  }
}

// ===================================================================================================================

/** Provide access to the modify function on any compatible optic.
  *
  * @tparam O The optic type.
  */
trait MonocleModifier[O[_, _, _, _]] {
  def modify[S, T, A, B](l: O[S, T, A, B]): (A => B) => S => T
}

object MonocleModifier {
  // Keep this import here so that Lens etc take priority over .internal
  import monocle._

  implicit object LensM extends MonocleModifier[PLens] {
    @inline final override def modify[S, T, A, B](l: PLens[S, T, A, B]) = l.modify
  }
  implicit object SetterM extends MonocleModifier[PSetter] {
    @inline final override def modify[S, T, A, B](l: PSetter[S, T, A, B]) = l.modify
  }
  implicit object OptionalM extends MonocleModifier[POptional] {
    @inline final override def modify[S, T, A, B](l: POptional[S, T, A, B]) = l.modify
  }
  implicit object IsoM extends MonocleModifier[PIso] {
    @inline final override def modify[S, T, A, B](l: PIso[S, T, A, B]) = l.modify
  }
  implicit object PrismM extends MonocleModifier[PPrism] {
    @inline final override def modify[S, T, A, B](l: PPrism[S, T, A, B]) = l.modify
  }
  implicit object TraversalM extends MonocleModifier[PTraversal] {
    @inline final override def modify[S, T, A, B](l: PTraversal[S, T, A, B]) = l.modify
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy