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

proptics.syntax.applied.AppliedTraversalSyntax.scala Maven / Gradle / Ivy

package proptics.syntax.applied

import scala.reflect.ClassTag

import cats.data.{NonEmptyList, State}
import cats.{Applicative, Bitraverse, Traverse}

import proptics.applied.{AppliedLens_, AppliedTraversal_}
import proptics.internal.{Bazaar, Sellable}
import proptics.std.list._
import proptics.std.string.{mkString => mkStr, takeWords => tkWords, _}
import proptics.syntax.traversal._
import proptics.{AppliedTraversal, Traversal, Traversal_}

trait AppliedTraversalSyntax {
  implicit final def appliedTraversalOpsWithTraverse[F[_], A](s: F[A]): AppliedTraversalOpsWithTraverse[F, A] = AppliedTraversalOpsWithTraverse(s)

  implicit final def appliedTraversalElementOps[S, T, A](appliedTraversal: AppliedTraversal_[S, T, A, A]): AppliedTraversalElementOps[S, T, A] = AppliedTraversalElementOps(
    appliedTraversal)

  implicit final def appliedBitraversalElementOps[G[_, _], A](s: G[A, A]): AppliedBitraversalElementOps[G, A] = AppliedBitraversalElementOps(s)

  implicit final def appliedTraversalWithTraverseFocusElementOps[F[_], S, T, A](
      appliedTraversal: AppliedTraversal_[S, T, F[A], F[A]]): AppliedTraversalWithTraverseFocusElementOps[F, S, T, A] =
    AppliedTraversalWithTraverseFocusElementOps(appliedTraversal)

  implicit final def appliedTraversalListOps[S, A](appliedTraversal: AppliedTraversal[S, List[A]]): AppliedTraversalListOps[S, A] = AppliedTraversalListOps(appliedTraversal)

  implicit final def appliedTraversalStringOps[S](appliedTraversal: AppliedTraversal[S, String]): AppliedTraversalStringOps[S] = AppliedTraversalStringOps(appliedTraversal)

  implicit final def appliedTraversalListOfCharsOps[S](appliedTraversal: AppliedTraversal[S, List[Char]]): AppliedTraversalListOfCharsOps[S] = AppliedTraversalListOfCharsOps(
    appliedTraversal)

  implicit final def appliedTraversalFSequenceOps[F[_], G[_], T, A](appliedTraversal: AppliedTraversal_[F[G[A]], F[A], G[A], A]): AppliedTraversalFSequenceOps[F, G, T, A] =
    AppliedTraversalFSequenceOps(appliedTraversal)
}

final case class AppliedTraversalOpsWithTraverse[F[_], A](private val s: F[A]) extends AnyVal {
  /** create a polymorphic [[proptics.Traversal_]] */
  def traversal_[B](implicit ev: Traverse[F]): AppliedTraversal_[F[A], F[B], A, B] =
    AppliedTraversal_(s, Traversal_.fromTraverse[F, A, B])

  /** create a monomorphic [[proptics.Traversal]] */
  def traversal(implicit ev: Traverse[F]): AppliedTraversal[F[A], A] =
    AppliedTraversal_(s, Traversal.fromTraverse[F, A])
}

final case class AppliedTraversalElementOps[S, T, A](private val appliedTraversal: AppliedTraversal_[S, T, A, A]) extends AnyVal {
  def value: S = appliedTraversal.value
  def optic: Traversal_[S, T, A, A] = appliedTraversal.optic

  /** convert a [[Traversal_]] into a [[proptics.Lens]] over a list of the Traversal's foci */
  def partsOf(implicit ev0: Sellable[* => *, Bazaar[* => *, *, *, Unit, *]]): AppliedLens_[S, T, List[A], List[A]] =
    AppliedLens_(value, Traversal.partsOf(optic))

  /** narrow the focus of a [[Traversal_]] to a single element */
  def single(i: Int): AppliedTraversal_[S, T, A, A] = AppliedTraversal_(value, optic.single(i))

  /** traverse elements of a [[Traversal_]] whose index satisfy a predicate */
  def filterByIndex(predicate: Int => Boolean): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.filterByIndex(predicate))

  /** select the first n elements of a [[Traversal_]] */
  def take(i: Int): AppliedTraversal_[S, T, A, A] = AppliedTraversal_(value, optic.take(i))

  /** select all elements of a [[Traversal_]] except first n ones */
  def drop(i: Int): AppliedTraversal_[S, T, A, A] = AppliedTraversal_(value, optic.drop(i))

  /** take longest prefix of elements of a [[Traversal_]] that satisfy a predicate */
  def takeWhile(predicate: A => Boolean)(implicit ev0: Applicative[State[Boolean, *]]): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.takeWhile(predicate))

  /** drop longest prefix of elements of a [[Traversal_]] that satisfy a predicate */
  def dropWhile(predicate: A => Boolean)(implicit ev0: Applicative[State[Boolean, *]]): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.dropWhile(predicate))

  /** filter out elements that do not match the predicate, of optics composed with this [[Traversal_]] */
  def filter(predicate: A => Boolean): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.andThen(Traversal.filter[A](predicate)))

  /** filter out elements that match the predicate, of optics composed with this [[Traversal_]] */
  def filterNot(predicate: A => Boolean): AppliedTraversal_[S, T, A, A] =
    filter(a => !predicate(a))
}

final case class AppliedBitraversalElementOps[G[_, _], A](private val s: G[A, A]) extends AnyVal {
  /** create a polymorphic [[proptics.Traversal_]] for structure `G[A, A]` that can traverse both sides */
  def bitraverse_[B](implicit ev: Bitraverse[G]): AppliedTraversal_[G[A, A], G[B, B], A, B] =
    AppliedTraversal_(s, Traversal_.both[G, A, B])

  /** create a monomorphic [[proptics.Traversal_]] for structure `G[A, A]` that can traverse both sides */
  def bitraverse(implicit ev: Bitraverse[G]): AppliedTraversal[G[A, A], A] =
    AppliedTraversal_(s, Traversal.both[G, A])
}

final case class AppliedTraversalWithTraverseFocusElementOps[F[_], S, T, A](private val appliedTraversal: AppliedTraversal_[S, T, F[A], F[A]]) extends AnyVal {
  def value: S = appliedTraversal.value
  def optic: Traversal_[S, T, F[A], F[A]] = appliedTraversal.optic

  /** select the first n elements of a [[Traversal_]] */
  def take(i: Int)(implicit ev: Traverse[F]): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.andThen(Traversal.take[F, A](i)))

  /** select all elements of a [[Traversal_]] except first n ones */
  def drop(i: Int)(implicit ev: Traverse[F]): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.andThen(Traversal.drop[F, A](i)))

  /** take longest prefix of elements of a [[Traversal_]] that satisfy a predicate */
  def takeWhile(predicate: A => Boolean)(implicit ev0: Applicative[State[Boolean, *]], ev1: Traverse[F]): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.andThen(Traversal.takeWhile[F, A](predicate)))

  /** drop longest prefix of elements of a [[Traversal_]] that satisfy a predicate */
  def dropWhile(predicate: A => Boolean)(implicit ev0: Applicative[State[Boolean, *]], ev1: Traverse[F]): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.andThen(Traversal.dropWhile[F, A](predicate)))

  /** compose this [[Traversal_]] with a [[Traversal_]], having this [[Traversal_]] applied first */
  def andThenTraverse(implicit ev: Traverse[F]): AppliedTraversal_[S, T, A, A] =
    AppliedTraversal_(value, optic.andThen(Traversal.fromTraverse[F, A]))
}

final case class AppliedTraversalListOps[S, A](private val appliedTraversal: AppliedTraversal[S, List[A]]) extends AnyVal {
  /** convert from a [[List[A]]] to a [[Vector[A]] */
  def toVector: AppliedTraversal[S, Vector[A]] = appliedTraversal.andThen(listToVector[A])

  /** convert from a [[List[A]]] to a [[Array[A]] */
  def toArray(implicit ev: ClassTag[A]): AppliedTraversal[S, Array[A]] = appliedTraversal.andThen(listToArray[A])

  /** convert from a [[List[A]]] to a [[NonEmptyList[A]] */
  def toNel: AppliedTraversal[S, NonEmptyList[A]] = appliedTraversal.andThen(listToNonEmptyList[A])
}

final case class AppliedTraversalListOfCharsOps[S](private val appliedTraversal: AppliedTraversal[S, List[Char]]) extends AnyVal {
  /** convert from a [[List[char]]] to a [[String]] */
  def mkString: AppliedTraversal[S, String] = appliedTraversal.andThen(charsToString)
}

final case class AppliedTraversalStringOps[S](private val appliedTraversal: AppliedTraversal[S, String]) extends AnyVal {
  /** convert from a [[List[char]]] to a [[String]] */
  def toChars: AppliedTraversal[S, List[Char]] = appliedTraversal.andThen(stringToChars)

  /** shows all elements of a collection in a string using a separator string */
  def mkString(sep: String): AppliedTraversal_[S, S, String, List[String]] = appliedTraversal.andThen(mkStr(sep))

  /** fold over the individual words of a String */
  def toWords: AppliedTraversal[S, String] = appliedTraversal.andThen(words)

  /** select the first n words of a string */
  def takeWords(i: Int): AppliedTraversal[S, String] = appliedTraversal.andThen(tkWords(i))
}

final case class AppliedTraversalFSequenceOps[F[_], G[_], T, A](private val appliedTraversal: AppliedTraversal_[F[G[A]], F[A], G[A], A]) extends AnyVal {
  /** invert a structure of `F[G[A]]` into `G[F[A]]` */
  def sequence(implicit ev: Applicative[G]): G[F[A]] = appliedTraversal.optic.traverse(appliedTraversal.value)(identity)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy