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

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

package proptics.syntax.applied

import scala.reflect.ClassTag

import cats.data.NonEmptyList
import cats.{Foldable, Traverse}

import proptics.applied.{AppliedAffineTraversal_, AppliedFold_, AppliedTraversal_}
import proptics.std.list._
import proptics.std.string.{mkString => mkStr, takeWords => tkWords, _}
import proptics.{AffineTraversal_, AppliedAffineTraversal, AppliedFold, Fold, Traversal}

trait AppliedAffineTraversalSyntax {
  implicit final def appliedAffineTraversalOps[F[_], S, T, A](appliedAffineTraversal: AppliedAffineTraversal_[S, T, F[A], F[A]]): AppliedAffineTraversalOps[F, S, T, A] =
    AppliedAffineTraversalOps(appliedAffineTraversal)

  implicit final def appliedAffineTraversalListOps[S, A](appliedAffineTraversal: AppliedAffineTraversal[S, List[A]]): AppliedAffineTraversalListOps[S, A] =
    AppliedAffineTraversalListOps(appliedAffineTraversal)

  implicit final def appliedAffineTraversalListOfCharsOps[S](appliedAffineTraversal: AppliedAffineTraversal[S, List[Char]]): AppliedAffineTraversalListOfCharsOps[S] =
    AppliedAffineTraversalListOfCharsOps(appliedAffineTraversal)

  implicit final def appliedAffineTraversalStringOps[S](appliedAffineTraversal: AppliedAffineTraversal[S, String]): AppliedAffineTraversalStringOps[S] =
    AppliedAffineTraversalStringOps(appliedAffineTraversal)
}

final case class AppliedAffineTraversalOps[F[_], S, T, A](private val appliedAffineTraversal: AppliedAffineTraversal_[S, T, F[A], F[A]]) extends AnyVal {
  def value: S = appliedAffineTraversal.value
  def optic: AffineTraversal_[S, T, F[A], F[A]] = appliedAffineTraversal.optic

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

  /** compose this [[AffineTraversal_]] with a [[Fold]] having this [[AffineTraversal_]] applied first */
  def andThenFold(implicit ev: Foldable[F]): AppliedFold_[S, T, A, A] =
    AppliedFold_(appliedAffineTraversal.value, appliedAffineTraversal.optic.andThen(Fold.fromFoldable[F, A]))
}

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

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

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

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

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

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

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

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




© 2015 - 2025 Weber Informatics LLC | Privacy Policy