Skip to content

Commit 8cfb9c0

Browse files
Prefix all cats instances with cats, add Alternative instance for partial.Result and PartialTransformer, change instances name to something which won't change as often
1 parent 9c0fc38 commit 8cfb9c0

File tree

6 files changed

+63
-40
lines changed

6 files changed

+63
-40
lines changed

chimney-cats/src/main/scala/io/scalaland/chimney/cats/CatsPartialResultImplicits.scala

+32-24
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
package io.scalaland.chimney.cats
22

3-
import _root_.cats.{~>, Applicative, CoflatMap, Eval, Monad, MonadError, Parallel, Traverse}
3+
import _root_.cats.{~>, Alternative, Applicative, CoflatMap, Eval, Monad, MonadError, Parallel, Traverse}
44
import _root_.cats.arrow.FunctionK
55
import _root_.cats.data.{Chain, NonEmptyChain, NonEmptyList, Validated, ValidatedNec, ValidatedNel}
66
import _root_.cats.kernel.{Eq, Semigroup}
77
import io.scalaland.chimney.partial
8-
import io.scalaland.chimney.partial.{AsResult, Result}
8+
import io.scalaland.chimney.partial.AsResult
99

1010
import language.implicitConversions
1111

1212
/** @since 1.0.0 */
1313
trait CatsPartialResultImplicits {
1414

1515
/** @since 0.7.0 */
16-
implicit final val monadErrorCoflatMapTraversePartialResult
17-
: MonadError[partial.Result, partial.Result.Errors] & CoflatMap[partial.Result] & Traverse[partial.Result] =
18-
new MonadError[partial.Result, partial.Result.Errors] with CoflatMap[partial.Result] with Traverse[partial.Result] {
16+
implicit final val catsCovariantForPartialResult: MonadError[partial.Result, partial.Result.Errors] &
17+
CoflatMap[partial.Result] &
18+
Traverse[partial.Result] &
19+
Alternative[partial.Result] =
20+
new MonadError[partial.Result, partial.Result.Errors]
21+
with CoflatMap[partial.Result]
22+
with Traverse[partial.Result]
23+
with Alternative[partial.Result] {
1924
override def pure[A](x: A): partial.Result[A] = partial.Result.Value(x)
2025

2126
override def flatMap[A, B](fa: partial.Result[A])(f: A => partial.Result[B]): partial.Result[B] = fa.flatMap(f)
@@ -55,10 +60,14 @@ trait CatsPartialResultImplicits {
5560
case partial.Result.Value(value) => f(value, lb)
5661
case _ => lb
5762
}
63+
64+
override def empty[A]: partial.Result[A] = partial.Result.fromEmpty[A]
65+
66+
override def combineK[A](x: partial.Result[A], y: partial.Result[A]): partial.Result[A] = x.orElse(y)
5867
}
5968

6069
/** @since 1.0.0 */
61-
implicit final val parallelSemigroupalPartialResult: Parallel[partial.Result] {
70+
implicit final val catsParallelForPartialResult: Parallel[partial.Result] {
6271
type F[A] = partial.Result[A]
6372
} = new Parallel[partial.Result] {
6473
override type F[A] = partial.Result[A]
@@ -73,69 +82,68 @@ trait CatsPartialResultImplicits {
7382
partial.Result.map2[A => B, A, B](ff, fa, (f, a) => f(a), failFast = false)
7483
}
7584

76-
override val monad: Monad[partial.Result] = monadErrorCoflatMapTraversePartialResult
85+
override val monad: Monad[partial.Result] = catsCovariantForPartialResult
7786
}
7887

7988
/** @since 0.7.0 */
80-
implicit final val semigroupPartialResultErrors: Semigroup[partial.Result.Errors] =
89+
implicit final val catsSemigroupForPartialResultErrors: Semigroup[partial.Result.Errors] =
8190
Semigroup.instance(partial.Result.Errors.merge)
8291

8392
/** @since 1.0.0 */
84-
implicit final def eqPartialResult[A: Eq]: Eq[partial.Result[A]] = {
85-
case (partial.Result.Value(a1), partial.Result.Value(a2)) => Eq[A].eqv(a1, a2)
86-
case (e1: partial.Result.Errors, e2: partial.Result.Errors) =>
87-
e1.asErrorPathMessages.iterator.sameElements(e2.asErrorPathMessages.iterator)
88-
case _ => false
93+
implicit final def catsEqForPartialResult[A: Eq]: Eq[partial.Result[A]] = {
94+
case (partial.Result.Value(a1), partial.Result.Value(a2)) => Eq[A].eqv(a1, a2)
95+
case (e1: partial.Result.Errors, e2: partial.Result.Errors) => catsEqForPartialResultErrors.eqv(e1, e2)
96+
case _ => false
8997
}
9098

9199
/** @since 1.0.0 */
92-
implicit final def eqPartialResultErrors: Eq[partial.Result.Errors] = (e1, e2) =>
100+
implicit final val catsEqForPartialResultErrors: Eq[partial.Result.Errors] = (e1, e2) =>
93101
e1.asErrorPathMessages.iterator.sameElements(e2.asErrorPathMessages.iterator)
94102

95103
/** @since 0.7.0 */
96104
implicit final def catsPartialTransformerResultOps[A](ptr: partial.Result[A]): CatsPartialTransformerResultOps[A] =
97105
new CatsPartialTransformerResultOps(ptr)
98106

99107
/** @since 1.0.0 */
100-
implicit def validatedPartialResultErrorsAsResult[E <: partial.Result.Errors]: AsResult[Validated[E, *]] =
108+
implicit def catsValidatedPartialResultErrorsAsResult[E <: partial.Result.Errors]: AsResult[Validated[E, *]] =
101109
new AsResult[Validated[E, *]] {
102-
def asResult[A](fa: Validated[E, A]): Result[A] = fa match {
110+
def asResult[A](fa: Validated[E, A]): partial.Result[A] = fa match {
103111
case Validated.Valid(a) => partial.Result.fromValue(a)
104112
case Validated.Invalid(e) => e
105113
}
106114
}
107115

108116
/** @since 1.0.0 */
109-
implicit def validatedNecPartialErrorAsResult[E <: partial.Error]: AsResult[ValidatedNec[E, *]] =
117+
implicit def catsValidatedNecPartialErrorAsResult[E <: partial.Error]: AsResult[ValidatedNec[E, *]] =
110118
new AsResult[ValidatedNec[E, *]] {
111-
def asResult[A](fa: ValidatedNec[E, A]): Result[A] = fa match {
119+
def asResult[A](fa: ValidatedNec[E, A]): partial.Result[A] = fa match {
112120
case Validated.Valid(a) => partial.Result.fromValue(a)
113121
case Validated.Invalid(e) => partial.Result.Errors(e.head, e.tail.toList*)
114122
}
115123
}
116124

117125
/** @since 1.0.0 */
118-
implicit def validatedNelPartialErrorAsResult[E <: partial.Error]: AsResult[ValidatedNel[E, *]] =
126+
implicit def catsValidatedNelPartialErrorAsResult[E <: partial.Error]: AsResult[ValidatedNel[E, *]] =
119127
new AsResult[ValidatedNel[E, *]] {
120-
def asResult[A](fa: ValidatedNel[E, A]): Result[A] = fa match {
128+
def asResult[A](fa: ValidatedNel[E, A]): partial.Result[A] = fa match {
121129
case Validated.Valid(a) => partial.Result.fromValue(a)
122130
case Validated.Invalid(e) => partial.Result.Errors(e.head, e.tail*)
123131
}
124132
}
125133

126134
/** @since 1.0.0 */
127-
implicit def validatedNecStringAsResult[E <: String]: AsResult[ValidatedNec[E, *]] =
135+
implicit def catsValidatedNecStringAsResult[E <: String]: AsResult[ValidatedNec[E, *]] =
128136
new AsResult[ValidatedNec[E, *]] {
129-
def asResult[A](fa: ValidatedNec[E, A]): Result[A] = fa match {
137+
def asResult[A](fa: ValidatedNec[E, A]): partial.Result[A] = fa match {
130138
case Validated.Valid(a) => partial.Result.fromValue(a)
131139
case Validated.Invalid(e) => partial.Result.fromErrorStrings(e.head, e.tail.toList*)
132140
}
133141
}
134142

135143
/** @since 1.0.0 */
136-
implicit def validatedNelStringAsResult[E <: String]: AsResult[ValidatedNel[E, *]] =
144+
implicit def catsValidatedNelStringAsResult[E <: String]: AsResult[ValidatedNel[E, *]] =
137145
new AsResult[ValidatedNel[E, *]] {
138-
def asResult[A](fa: ValidatedNel[E, A]): Result[A] = fa match {
146+
def asResult[A](fa: ValidatedNel[E, A]): partial.Result[A] = fa match {
139147
case Validated.Valid(a) => partial.Result.fromValue(a)
140148
case Validated.Invalid(e) => partial.Result.fromErrorStrings(e.head, e.tail*)
141149
}

chimney-cats/src/main/scala/io/scalaland/chimney/cats/CatsPartialTransformerImplicits.scala

+20-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.scalaland.chimney.cats
22

3-
import _root_.cats.{~>, Applicative, CoflatMap, Contravariant, Monad, MonadError, Parallel}
3+
import _root_.cats.{~>, Alternative, Applicative, CoflatMap, Contravariant, Monad, MonadError, Parallel}
44
import _root_.cats.arrow.{ArrowChoice, CommutativeArrow, FunctionK}
55
import io.scalaland.chimney.partial
66
import io.scalaland.chimney.PartialTransformer
@@ -9,7 +9,7 @@ import io.scalaland.chimney.PartialTransformer
99
trait CatsPartialTransformerImplicits {
1010

1111
/** @since 1.0.0 */
12-
implicit final val commutativeArrowChoiceForPartialTransformer
12+
implicit final val catsCategoryForPartialTransformer
1313
: ArrowChoice[PartialTransformer] & CommutativeArrow[PartialTransformer] =
1414
new ArrowChoice[PartialTransformer] with CommutativeArrow[PartialTransformer] {
1515
override def lift[A, B](f: A => B): PartialTransformer[A, B] = PartialTransformer.fromFunction(f)
@@ -35,9 +35,13 @@ trait CatsPartialTransformerImplicits {
3535
}
3636

3737
/** @since 1.0.0 */
38-
implicit final def monadErrorCoflatMapForPartialTransformer[Source]
39-
: MonadError[PartialTransformer[Source, *], partial.Result.Errors] & CoflatMap[PartialTransformer[Source, *]] =
40-
new MonadError[PartialTransformer[Source, *], partial.Result.Errors] with CoflatMap[PartialTransformer[Source, *]] {
38+
implicit final def catsCovariantForPartialTransformer[Source]
39+
: MonadError[PartialTransformer[Source, *], partial.Result.Errors] &
40+
CoflatMap[PartialTransformer[Source, *]] &
41+
Alternative[PartialTransformer[Source, *]] =
42+
new MonadError[PartialTransformer[Source, *], partial.Result.Errors]
43+
with CoflatMap[PartialTransformer[Source, *]]
44+
with Alternative[PartialTransformer[Source, *]] {
4145
override def pure[A](x: A): PartialTransformer[Source, A] = (_, _) => partial.Result.Value(x)
4246

4347
override def flatMap[A, B](fa: PartialTransformer[Source, A])(
@@ -78,10 +82,18 @@ trait CatsPartialTransformerImplicits {
7882
)(
7983
f: PartialTransformer[Source, A] => B
8084
): PartialTransformer[Source, B] = (src, _) => partial.Result.fromCatching(f(fa))
85+
86+
override def empty[A]: PartialTransformer[Source, A] = (_, _) => partial.Result.fromEmpty[A]
87+
88+
override def combineK[A](
89+
x: PartialTransformer[Source, A],
90+
y: PartialTransformer[Source, A]
91+
): PartialTransformer[Source, A] = (src, failFast) =>
92+
x.transform(src, failFast).orElse(y.transform(src, failFast))
8193
}
8294

8395
/** @since 1.0.0 */
84-
implicit final def parallelForPartialTransformer[Source]: Parallel[PartialTransformer[Source, *]] {
96+
implicit final def catsParallelForPartialTransformer[Source]: Parallel[PartialTransformer[Source, *]] {
8597
type F[A] = PartialTransformer[Source, A]
8698
} =
8799
new Parallel[PartialTransformer[Source, *]] {
@@ -105,11 +117,11 @@ trait CatsPartialTransformerImplicits {
105117
)
106118
}
107119

108-
val monad: Monad[PartialTransformer[Source, *]] = monadErrorCoflatMapForPartialTransformer[Source]
120+
val monad: Monad[PartialTransformer[Source, *]] = catsCovariantForPartialTransformer[Source]
109121
}
110122

111123
/** @since 1.0.0 */
112-
implicit final def contravariantForPartialTransformer[Target]: Contravariant[PartialTransformer[*, Target]] =
124+
implicit final def catsContravariantForPartialTransformer[Target]: Contravariant[PartialTransformer[*, Target]] =
113125
new Contravariant[PartialTransformer[*, Target]] {
114126
def contramap[A, B](fa: PartialTransformer[A, Target])(f: B => A): PartialTransformer[B, Target] =
115127
(b, failFast) => partial.Result.fromCatching(f(b)).flatMap(a => fa.transform(a, failFast))

chimney-cats/src/main/scala/io/scalaland/chimney/cats/CatsTotalTransformerImplicits.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import io.scalaland.chimney.Transformer
77
trait CatsTotalTransformerImplicits {
88

99
/** @since 1.0.0 */
10-
implicit final val commutativeArrowChoiceForTransformer: ArrowChoice[Transformer] & CommutativeArrow[Transformer] =
10+
implicit final val catsCategoryForTransformer: ArrowChoice[Transformer] & CommutativeArrow[Transformer] =
1111
new ArrowChoice[Transformer] with CommutativeArrow[Transformer] {
1212
override def lift[A, B](f: A => B): Transformer[A, B] = f(_)
1313

@@ -28,7 +28,7 @@ trait CatsTotalTransformerImplicits {
2828
}
2929

3030
/** @since 1.0.0 */
31-
implicit final def monadCoflatMapForTransformer[Source]
31+
implicit final def catsCovariantForTransformer[Source]
3232
: Monad[Transformer[Source, *]] & CoflatMap[Transformer[Source, *]] =
3333
new Monad[Transformer[Source, *]] with CoflatMap[Transformer[Source, *]] {
3434
override def pure[A](x: A): Transformer[Source, A] = _ => x
@@ -56,7 +56,7 @@ trait CatsTotalTransformerImplicits {
5656
}
5757

5858
/** @since 1.0.0 */
59-
implicit final def contravariantForTransformer[Target]: Contravariant[Transformer[*, Target]] =
59+
implicit final def catsContravariantForTransformer[Target]: Contravariant[Transformer[*, Target]] =
6060
new Contravariant[Transformer[*, Target]] {
6161
def contramap[A, B](fa: Transformer[A, Target])(f: B => A): Transformer[B, Target] =
6262
b => fa.transform(f(b))

chimney-cats/src/test/scala/io/scalaland/chimney/cats/PartialResultLaws.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class PartialResultLaws extends ChimneySpec with utils.ArbitraryUtils {
1212
}
1313

1414
group(
15-
"MonadError[partial.Result, partial.Result.Errors] & CoflatMap[partial.Result] & Traverse[partial.Result] should follow laws"
15+
"MonadError[partial.Result, partial.Result.Errors] & CoflatMap[partial.Result] & Traverse[partial.Result] & Alternative[partial.Result] should follow laws"
1616
) {
1717
checkLawsAsTests(InvariantTests[partial.Result].invariant[Int, String, Double])
1818
checkLawsAsTests(SemigroupalTests[partial.Result].semigroupal[Int, String, Double])
@@ -29,5 +29,6 @@ class PartialResultLaws extends ChimneySpec with utils.ArbitraryUtils {
2929
UnorderedTraverseTests[partial.Result].unorderedTraverse[Int, Long, Double, Const[Unit, *], Const[Int, *]]
3030
)
3131
checkLawsAsTests(TraverseTests[partial.Result].traverse[Int, Long, Double, Byte, Const[Unit, *], Const[Int, *]])
32+
checkLawsAsTests(AlternativeTests[partial.Result].alternative[Int, String, Double])
3233
}
3334
}

chimney-cats/src/test/scala/io/scalaland/chimney/cats/PartialTransformerLaws.scala

+5-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ class PartialTransformerLaws extends ChimneySpec with utils.ArbitraryUtils {
1717
}
1818

1919
group(
20-
"MonadError[Transformer[Source, *], partial.Result.Errors] & CoflatMap[Transformer[Source, *]] instance should follow laws"
20+
"MonadError[PartialTransformer[Source, *], partial.Result.Errors] & CoflatMap[PartialTransformer[Source, *]] & Alternative[PartialTransformer[Source, *]] instance should follow laws"
2121
) {
2222
checkLawsAsTests(InvariantTests[PartialTransformer[String, *]].invariant[Int, String, Double])
23+
checkLawsAsTests(SemigroupalTests[PartialTransformer[String, *]].semigroupal[Int, String, Double])
2324
checkLawsAsTests(FunctorTests[PartialTransformer[String, *]].functor[Int, String, Double])
2425
checkLawsAsTests(ApplicativeTests[PartialTransformer[String, *]].applicative[Int, String, Double])
2526
checkLawsAsTests(FlatMapTests[PartialTransformer[String, *]].flatMap[Int, String, Double])
@@ -31,14 +32,15 @@ class PartialTransformerLaws extends ChimneySpec with utils.ArbitraryUtils {
3132
MonadErrorTests[PartialTransformer[String, *], partial.Result.Errors].monadError[Int, String, Double]
3233
)
3334
checkLawsAsTests(CoflatMapTests[PartialTransformer[String, *]].coflatMap[Int, String, Double])
35+
checkLawsAsTests(AlternativeTests[PartialTransformer[String, *]].alternative[Int, String, Double])
3436
}
3537

36-
group("Parallel[Transformer[From, *]] instance should follow laws") {
38+
group("Parallel[PartialTransformer[From, *]] instance should follow laws") {
3739
checkLawsAsTests(NonEmptyParallelTests[PartialTransformer[String, *]].nonEmptyParallel[Int, String])
3840
checkLawsAsTests(ParallelTests[PartialTransformer[String, *]].parallel[Int, String])
3941
}
4042

41-
group("Contravariant[Transformer[*, To]] instance should follow laws") {
43+
group("Contravariant[PartialTransformer[*, To]] instance should follow laws") {
4244
checkLawsAsTests(ContravariantTests[PartialTransformer[*, String]].contravariant[Int, String, Double])
4345
}
4446
}

chimney-cats/src/test/scala/io/scalaland/chimney/cats/utils/ArbitraryUtils.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import cats.Eq
44
import cats.data.Const
55
import cats.syntax.eq.*
66
import io.scalaland.chimney.{partial, ChimneySpec, PartialTransformer, Transformer}
7-
import io.scalaland.chimney.cats.eqPartialResult
7+
import io.scalaland.chimney.cats.catsEqForPartialResult
88
import org.scalacheck.{Arbitrary, Cogen}
99
import org.scalacheck.Test.check
1010
import org.scalacheck.Prop.forAll

0 commit comments

Comments
 (0)