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

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

package proptics.syntax

import proptics._
import proptics.applied.AppliedAffineTraversal
import proptics.typeclass.Index

trait IndexSyntax {
  implicit final def appliedIndexOfCollectionOps[F[_], A](fa: F[A]): AppliedIndexOfCollectionOps[F, A] = AppliedIndexOfCollectionOps(fa)

  implicit final def lensIndexOps[S, T, A](lens: Lens[S, T]): LensIndexOps[S, T, A] = LensIndexOps(lens)

  implicit final def traversalIndexOps[S, T, A](traversal: Traversal[S, T]): TraversalIndexOps[S, T, A] = TraversalIndexOps(traversal)
}

final case class AppliedIndexOfCollectionOps[F[_], A](private val fa: F[A]) extends AnyVal {
  /** traverse a value at a given index of a data structure `F[A]` */
  def index[I](i: I)(implicit ev: Index[F[A], I, A]): AppliedAffineTraversal[F[A], A] = AppliedAffineTraversal(fa, ev.ix(i))
}

final case class AppliedPrismIndexOps[S, T, A](private val appliedPrism: AppliedPrism[S, T]) extends AnyVal {
  /** traverse a value at a given index of a data structure `S` */
  def index[I](i: I)(implicit ev: Index[T, I, A]): AppliedAffineTraversal[S, A] = appliedPrism.andThen(ev.ix(i))
}

final case class LensIndexOps[S, T, A](private val lens: Lens[S, T]) extends AnyVal {
  /** traverse a value at a given index of a data structure `S` */
  def index[I](i: I)(implicit ev: Index[T, I, A]): AffineTraversal[S, A] = lens.andThen(ev.ix(i))
}

final case class TraversalIndexOps[S, T, A](private val traversal: Traversal[S, T]) extends AnyVal {
  /** traverse a value at a given index of a data structure `S` */
  def index[I](i: I)(implicit ev: Index[T, I, A]): Traversal[S, A] = traversal.andThen(ev.ix(i))
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy