@@ -18,33 +18,37 @@ object GenTupleUnorderedFoldableInstances extends Template {
1818 |package instances
1919 |
2020 |private[cats] trait NTupleUnorderedFoldableInstances {
21- - implicit final def catsUnorderedFoldableInstancesForTuple $arity${`[A0, A(N - 1)]`}: Traverse[ ${`(A..N - 1, *)`}] with Reducible[ ${`(A..N - 1, *)`}] =
22- - new Traverse[ ${`(A..N - 1, *)`}] with Reducible[ ${`(A..N - 1, *)`}] {
23- - def traverse[G[_], A, B](fa: ${`A0, A(N - 1)&`(
24- " A"
25- )})(f: A => G[B])(implicit G: Applicative[G]): G[ ${`A0, A(N - 1)&`(
26- " B"
27- )}] =
28- - G.map(f(fa._ $arity))( ${`(fa._1..(n - 1))`})
29- - def foldLeft[A, B](fa: ${`A0, A(N - 1)&`(" A" )}, b: B)(f: (B, A) => B): B = f(b, fa._ $arity)
30- - def foldRight[A, B](fa: ${`A0, A(N - 1)&`(" A" )}, lb: Eval[B])(f: (A, Eval[B]) => Eval[B]): Eval[B] = f(fa._ $arity, lb)
31- - override def map[A, B](fa: ${`A0, A(N - 1)&`(" A" )})(f: A => B): ${`A0, A(N - 1)&`(" B" )} =
32- - ${`fa._1..(n - 1) & `(s " f(fa._ $arity) " )}
33- - override def foldMap[A, B](fa: ${`A0, A(N - 1)&`(" A" )})(f: A => B)(implicit B: Monoid[B]): B = f(fa._ $arity)
34- - override def reduce[A](fa: ${`A0, A(N - 1)&`(" A" )})(implicit A: Semigroup[A]): A = fa._ $arity
35- - def reduceLeftTo[A, B](fa: ${`A0, A(N - 1)&`(" A" )})(f: A => B)(g: (B, A) => B): B = f(fa._ $arity)
36- - override def reduceLeft[A](fa: ${`A0, A(N - 1)&`(" A" )})(f: (A, A) => A): A = fa._ $arity
37- - override def reduceLeftToOption[A, B](fa: ${`A0, A(N - 1)&`(" A" )})(f: A => B)(g: (B, A) => B): Option[B] = Some(f(fa._ $arity))
38- - override def reduceRight[A](fa: ${`A0, A(N - 1)&`(" A" )})(f: (A, Eval[A]) => Eval[A]): Eval[A] = Now(fa._ $arity)
39- - def reduceRightTo[A, B](fa: ${`A0, A(N - 1)&`(" A" )})(f: A => B)(g: (A, Eval[B]) => Eval[B]): Eval[B] = Now(f(fa._ $arity))
40- - override def reduceRightToOption[A, B](fa: ${`A0, A(N - 1)&`(" A" )})(f: A => B)(g: (A, Eval[B]) => Eval[B]): Eval[Option[B]] = Now(Some(f(fa._ $arity)))
41- - override def reduceMap[A, B](fa: ${`A0, A(N - 1)&`(" A" )})(f: A => B)(implicit B: Semigroup[B]): B = f(fa._ $arity)
42- - override def size[A](fa: ${`A0, A(N - 1)&`(" A" )}): Long = 1L
43- - override def get[A](fa: ${`A0, A(N - 1)&`(" A" )})(idx: Long): Option[A] = if (idx == 0L) Some(fa._ $arity) else None
44- - override def exists[A](fa: ${`A0, A(N - 1)&`(" A" )})(p: A => Boolean): Boolean = p(fa._ $arity)
45- - override def forall[A](fa: ${`A0, A(N - 1)&`(" A" )})(p: A => Boolean): Boolean = p(fa._ $arity)
46- - override def isEmpty[A](fa: ${`A0, A(N - 1)&`(" A" )}): Boolean = false
47- - }
21+ | protected type γ[_]
22+ |
23+ | private def instance[F[_] <: Product](
24+ | trav: (F[Any], Applicative[γ], Any => γ[Any]) => γ[F[Any]]
25+ | ): Traverse[F] with Reducible[F] =
26+ | new Traverse[F] with Reducible[F] {
27+ | def traverse[G[_], A, B](fa: F[A])(f: A => G[B])(implicit G: Applicative[G]) =
28+ | trav(fa.asInstanceOf[F[Any]], G.asInstanceOf[Applicative[γ]], f.asInstanceOf[Any => γ[Any]]).asInstanceOf[G[F[B]]]
29+ | @inline private def last[A](fa: F[A]): A =
30+ | fa.productElement(fa.productArity - 1).asInstanceOf[A]
31+ | def foldLeft[A, B](fa: F[A], b: B)(f: (B, A) => B): B = f(b, last(fa))
32+ | def foldRight[A, B](fa: F[A], lb: Eval[B])(f: (A, Eval[B]) => Eval[B]): Eval[B] = f(last(fa), lb)
33+ | override def foldMap[A, B](fa: F[A])(f: A => B)(implicit B: Monoid[B]): B = f(last(fa))
34+ | override def reduce[A](fa: F[A])(implicit A: Semigroup[A]): A = last(fa)
35+ | def reduceLeftTo[A, B](fa: F[A])(f: A => B)(g: (B, A) => B): B = f(last(fa))
36+ | override def reduceLeft[A](fa: F[A])(f: (A, A) => A): A = last(fa)
37+ | override def reduceLeftToOption[A, B](fa: F[A])(f: A => B)(g: (B, A) => B): Option[B] = Some(f(last(fa)))
38+ | override def reduceRight[A](fa: F[A])(f: (A, Eval[A]) => Eval[A]): Eval[A] = Now(last(fa))
39+ | def reduceRightTo[A, B](fa: F[A])(f: A => B)(g: (A, Eval[B]) => Eval[B]): Eval[B] = Now(f(last(fa)))
40+ | override def reduceRightToOption[A, B](fa: F[A])(f: A => B)(g: (A, Eval[B]) => Eval[B]): Eval[Option[B]] = Now(Some(f(last(fa))))
41+ | override def reduceMap[A, B](fa: F[A])(f: A => B)(implicit B: Semigroup[B]): B = f(last(fa))
42+ | override def size[A](fa: F[A]): Long = 1L
43+ | override def get[A](fa: F[A])(idx: Long): Option[A] = if (idx == 0L) Some(last(fa)) else None
44+ | override def exists[A](fa: F[A])(p: A => Boolean): Boolean = p(last(fa))
45+ | override def forall[A](fa: F[A])(p: A => Boolean): Boolean = p(last(fa))
46+ | override def isEmpty[A](fa: F[A]): Boolean = false
47+ | }
48+ -
49+ - implicit final def catsUnorderedFoldableInstancesForTuple $arity${`[A0, A(N - 1)]`}
50+ - : Traverse[ ${`(A..N - 1, *)`}] with Reducible[ ${`(A..N - 1, *)`}]
51+ - = instance((fa, G, f) => G.map(f(fa._ $arity))(x => fa.copy(_ $arity = x)))
4852 |} """
4953 }
5054}
0 commit comments