diff --git a/core/src/main/scala/cats/Applicative.scala b/core/src/main/scala/cats/Applicative.scala index 70bdbf40d64..9acdb26e3cf 100644 --- a/core/src/main/scala/cats/Applicative.scala +++ b/core/src/main/scala/cats/Applicative.scala @@ -12,7 +12,7 @@ import simulacrum.typeclass * * Must obey the laws defined in cats.laws.ApplicativeLaws. */ -@typeclass trait Applicative[F[_]] extends Apply[F] { self => +@typeclass trait Applicative[F[_]] extends Apply[F] with Monoidal[F] { self => /** * `pure` lifts any value into the Applicative Functor. @@ -26,7 +26,7 @@ import simulacrum.typeclass * * This variant supports optional laziness. */ - def pureEval[A](x: Eval[A]): F[A] = pure(x.value) + override def pureEval[A](x: Eval[A]): F[A] = pure(x.value) /** * Two sequentially dependent Applicatives can be composed. diff --git a/core/src/main/scala/cats/Apply.scala b/core/src/main/scala/cats/Apply.scala index 153bd68c271..68eacbe0222 100644 --- a/core/src/main/scala/cats/Apply.scala +++ b/core/src/main/scala/cats/Apply.scala @@ -8,7 +8,7 @@ import simulacrum.typeclass * Must obey the laws defined in cats.laws.ApplyLaws. */ @typeclass(excludeParents=List("ApplyArityFunctions")) -trait Apply[F[_]] extends Functor[F] with Monoidal[F] with ApplyArityFunctions[F] { self => +trait Apply[F[_]] extends Functor[F] with Semigroupal[F] with ApplyArityFunctions[F] { self => /** * Given a value and a function in the Apply context, applies the diff --git a/core/src/main/scala/cats/Monoidal.scala b/core/src/main/scala/cats/Monoidal.scala index 3b56bce1502..f864265ac2f 100644 --- a/core/src/main/scala/cats/Monoidal.scala +++ b/core/src/main/scala/cats/Monoidal.scala @@ -8,8 +8,16 @@ import simulacrum.typeclass * * It is worth noting that the couple Monoidal and [[Functor]] is interdefinable with [[Apply]]. */ -@typeclass trait Monoidal[F[_]] { - def product[A, B](fa: F[A], fb: F[B]): F[(A, B)] -} +@typeclass trait Monoidal[F[_]] extends Semigroupal[F] { + /** + * `pure` lifts any value into the lax monoidal functor. + */ + def pure[A](x: A): F[A] -object Monoidal extends MonoidalArityFunctions \ No newline at end of file + /** + * `pureEval` lifts any value into the lax monoidal functor. + * + * This variant supports optional laziness. + */ + def pureEval[A](x: Eval[A]): F[A] = pure(x.value) +} diff --git a/core/src/main/scala/cats/Semigroupal.scala b/core/src/main/scala/cats/Semigroupal.scala new file mode 100644 index 00000000000..4d1c3f640e1 --- /dev/null +++ b/core/src/main/scala/cats/Semigroupal.scala @@ -0,0 +1,16 @@ +package cats + +import simulacrum.typeclass + +/** + * [[Semigroupal]] generalizes [[Functor]] by allowing functions of any + * arity to be applied to an effectful value. It encodes this by pairing + * together two effectful values (which can then be extended to be three + * or more) within a context, which can then be mapped over via the [[Functor]] + * instance. + */ +@typeclass trait Semigroupal[F[_]] extends Functor[F] { + def product[A, B](fa: F[A], fb: F[B]): F[(A, B)] +} + +object Semigroupal extends SemigroupalArityFunctions diff --git a/core/src/main/scala/cats/data/XorT.scala b/core/src/main/scala/cats/data/XorT.scala index b50282cfe32..86e9587e1c1 100644 --- a/core/src/main/scala/cats/data/XorT.scala +++ b/core/src/main/scala/cats/data/XorT.scala @@ -120,7 +120,7 @@ final case class XorT[F[_], A, B](value: F[A Xor B]) { * {{{ * scala> import cats.std.option._ * scala> import cats.std.list._ - * scala> import cats.syntax.monoidal._ + * scala> import cats.syntax.semigroupal._ * scala> type Error = String * scala> val v1: Validated[NonEmptyList[Error], Int] = Validated.Invalid(NonEmptyList("error 1")) * scala> val v2: Validated[NonEmptyList[Error], Int] = Validated.Invalid(NonEmptyList("error 2")) diff --git a/core/src/main/scala/cats/syntax/all.scala b/core/src/main/scala/cats/syntax/all.scala index dfe5cb667b3..fd6bb3f00bb 100644 --- a/core/src/main/scala/cats/syntax/all.scala +++ b/core/src/main/scala/cats/syntax/all.scala @@ -3,7 +3,6 @@ package syntax trait AllSyntax extends ApplySyntax - with MonoidalSyntax with BifunctorSyntax with CoflatMapSyntax with ComonadSyntax @@ -25,6 +24,7 @@ trait AllSyntax with ProfunctorSyntax with ReducibleSyntax with SemigroupSyntax + with SemigroupalSyntax with SemigroupKSyntax with Show.ToShowOps with SplitSyntax diff --git a/core/src/main/scala/cats/syntax/monoidal.scala b/core/src/main/scala/cats/syntax/monoidal.scala index b4126200b53..8859c5d6d03 100644 --- a/core/src/main/scala/cats/syntax/monoidal.scala +++ b/core/src/main/scala/cats/syntax/monoidal.scala @@ -1,25 +1,25 @@ package cats package syntax -trait MonoidalSyntax1 { - implicit def monoidalSyntaxU[FA](fa: FA)(implicit U: Unapply[Monoidal, FA]): MonoidalOps[U.M, U.A] = - new MonoidalOps[U.M, U.A] { +trait SemigroupalSyntax1 { + implicit def monoidalSyntaxU[FA](fa: FA)(implicit U: Unapply[Semigroupal, FA]): SemigroupalOps[U.M, U.A] = + new SemigroupalOps[U.M, U.A] { val self = U.subst(fa) val typeClassInstance = U.TC } } -trait MonoidalSyntax extends MonoidalSyntax1 { - implicit def monoidalSyntax[F[_], A](fa: F[A])(implicit F: Monoidal[F]): MonoidalOps[F, A] = - new MonoidalOps[F, A] { +trait SemigroupalSyntax extends SemigroupalSyntax1 { + implicit def monoidalSyntax[F[_], A](fa: F[A])(implicit F: Semigroupal[F]): SemigroupalOps[F, A] = + new SemigroupalOps[F, A] { val self = fa val typeClassInstance = F } } -abstract class MonoidalOps[F[_], A] extends Monoidal.Ops[F, A] { - def |@|[B](fb: F[B]): MonoidalBuilder[F]#MonoidalBuilder2[A, B] = - new MonoidalBuilder[F] |@| self |@| fb +abstract class SemigroupalOps[F[_], A] extends Semigroupal.Ops[F, A] { + def |@|[B](fb: F[B]): SemigroupalBuilder[F]#SemigroupalBuilder2[A, B] = + new SemigroupalBuilder[F] |@| self |@| fb def *>[B](fb: F[B])(implicit F: Functor[F]): F[B] = F.map(typeClassInstance.product(self, fb)) { case (a, b) => b } diff --git a/core/src/main/scala/cats/syntax/package.scala b/core/src/main/scala/cats/syntax/package.scala index c61f8df9fe7..6b48f3dd124 100644 --- a/core/src/main/scala/cats/syntax/package.scala +++ b/core/src/main/scala/cats/syntax/package.scala @@ -3,7 +3,6 @@ package cats package object syntax { object all extends AllSyntax object apply extends ApplySyntax - object monoidal extends MonoidalSyntax object bifunctor extends BifunctorSyntax object coflatMap extends CoflatMapSyntax object comonad extends ComonadSyntax @@ -23,6 +22,7 @@ package object syntax { object partialOrder extends PartialOrderSyntax object profunctor extends ProfunctorSyntax object semigroup extends SemigroupSyntax + object semigroupal extends SemigroupalSyntax object semigroupk extends SemigroupKSyntax object show extends Show.ToShowOps object split extends SplitSyntax diff --git a/docs/src/main/tut/apply.md b/docs/src/main/tut/apply.md index 6607ab928e6..c3c27c42497 100644 --- a/docs/src/main/tut/apply.md +++ b/docs/src/main/tut/apply.md @@ -125,7 +125,7 @@ In order to use it, first import `cats.syntax.all._` or `cats.syntax.apply._`. Here we see that the following two functions, `f1` and `f2`, are equivalent: ```tut -import cats.syntax.monoidal._ +import cats.syntax.semigroupal._ def f1(a: Option[Int], b: Option[Int], c: Option[Int]) = (a |@| b |@| c) map { _ * _ * _ } diff --git a/docs/src/main/tut/freeapplicative.md b/docs/src/main/tut/freeapplicative.md index 57a48fb14d8..613c791b68a 100644 --- a/docs/src/main/tut/freeapplicative.md +++ b/docs/src/main/tut/freeapplicative.md @@ -39,7 +39,7 @@ Because a `FreeApplicative` only supports the operations of `Applicative`, we do of a for-comprehension. We can however still use `Applicative` syntax provided by Cats. ```tut:silent -import cats.syntax.monoidal._ +import cats.syntax.semigroupal._ val prog: Validation[Boolean] = (size(5) |@| hasNumber).map { case (l, r) => l && r} ``` diff --git a/laws/src/main/scala/cats/laws/ApplicativeLaws.scala b/laws/src/main/scala/cats/laws/ApplicativeLaws.scala index e963d17f634..1ce45fb2dc7 100644 --- a/laws/src/main/scala/cats/laws/ApplicativeLaws.scala +++ b/laws/src/main/scala/cats/laws/ApplicativeLaws.scala @@ -7,7 +7,7 @@ import cats.syntax.functor._ /** * Laws that must be obeyed by any `Applicative`. */ -trait ApplicativeLaws[F[_]] extends ApplyLaws[F] { +trait ApplicativeLaws[F[_]] extends ApplyLaws[F] with MonoidalLaws[F] { implicit override def F: Applicative[F] def applicativeIdentity[A](fa: F[A]): IsEq[F[A]] = diff --git a/laws/src/main/scala/cats/laws/ApplyLaws.scala b/laws/src/main/scala/cats/laws/ApplyLaws.scala index c6c2a768598..db2919b2fbf 100644 --- a/laws/src/main/scala/cats/laws/ApplyLaws.scala +++ b/laws/src/main/scala/cats/laws/ApplyLaws.scala @@ -7,7 +7,7 @@ import cats.syntax.functor._ /** * Laws that must be obeyed by any `Apply`. */ -trait ApplyLaws[F[_]] extends FunctorLaws[F] with MonoidalLaws[F] { +trait ApplyLaws[F[_]] extends FunctorLaws[F] with SemigroupalLaws[F] { implicit override def F: Apply[F] def applyComposition[A, B, C](fa: F[A], fab: F[A => B], fbc: F[B => C]): IsEq[F[C]] = { diff --git a/laws/src/main/scala/cats/laws/MonoidalLaws.scala b/laws/src/main/scala/cats/laws/MonoidalLaws.scala index 402e1cd9bf1..67acdd77361 100644 --- a/laws/src/main/scala/cats/laws/MonoidalLaws.scala +++ b/laws/src/main/scala/cats/laws/MonoidalLaws.scala @@ -1,13 +1,15 @@ package cats package laws -trait MonoidalLaws[F[_]] { +trait MonoidalLaws[F[_]] extends SemigroupalLaws[F] { implicit def F: Monoidal[F] - def monoidalAssociativity[A, B, C](fa: F[A], fb: F[B], fc: F[C]): (F[(A, (B, C))], F[((A, B), C)]) = - (F.product(fa, F.product(fb, fc)), F.product(F.product(fa, fb), fc)) + def leftIdentity[A](fa: F[A]): IsEq[F[A]] = + F.map(F.product(F.pure(()), fa))(_._2) <-> fa + def rightIdentity[A](fa: F[A]): IsEq[F[A]] = + F.map(F.product(fa, F.pure(())))(_._1) <-> fa } object MonoidalLaws { @@ -15,4 +17,4 @@ object MonoidalLaws { def apply[F[_]](implicit ev: Monoidal[F]): MonoidalLaws[F] = new MonoidalLaws[F] { val F = ev } -} \ No newline at end of file +} diff --git a/laws/src/main/scala/cats/laws/SemigroupalLaws.scala b/laws/src/main/scala/cats/laws/SemigroupalLaws.scala new file mode 100644 index 00000000000..7b73fad5e01 --- /dev/null +++ b/laws/src/main/scala/cats/laws/SemigroupalLaws.scala @@ -0,0 +1,18 @@ +package cats +package laws + +trait SemigroupalLaws[F[_]] { + + implicit def F: Semigroupal[F] + + def semigroupalAssociativity[A, B, C](fa: F[A], fb: F[B], fc: F[C]): (F[(A, (B, C))], F[((A, B), C)]) = + (F.product(fa, F.product(fb, fc)), F.product(F.product(fa, fb), fc)) + +} + +object SemigroupalLaws { + + def apply[F[_]](implicit ev: Semigroupal[F]): SemigroupalLaws[F] = + new SemigroupalLaws[F] { val F = ev } + +} diff --git a/laws/src/main/scala/cats/laws/discipline/AlternativeTests.scala b/laws/src/main/scala/cats/laws/discipline/AlternativeTests.scala index e2f35ab31c9..b93173197f1 100644 --- a/laws/src/main/scala/cats/laws/discipline/AlternativeTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/AlternativeTests.scala @@ -2,7 +2,7 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.Arbitrary import org.scalacheck.Prop import Prop._ diff --git a/laws/src/main/scala/cats/laws/discipline/ApplicativeTests.scala b/laws/src/main/scala/cats/laws/discipline/ApplicativeTests.scala index 49117c8dea9..c2c3090f014 100644 --- a/laws/src/main/scala/cats/laws/discipline/ApplicativeTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/ApplicativeTests.scala @@ -2,12 +2,12 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.Arbitrary import org.scalacheck.Prop import Prop._ -trait ApplicativeTests[F[_]] extends ApplyTests[F] { +trait ApplicativeTests[F[_]] extends ApplyTests[F] with MonoidalTests[F] { def laws: ApplicativeLaws[F] def applicative[A: Arbitrary, B: Arbitrary, C: Arbitrary](implicit @@ -22,13 +22,17 @@ trait ApplicativeTests[F[_]] extends ApplyTests[F] { EqFABC: Eq[F[(A, B, C)]], iso: Isomorphisms[F] ): RuleSet = { - new DefaultRuleSet( - name = "applicative", - parent = Some(apply[A, B, C]), - "applicative identity" -> forAll(laws.applicativeIdentity[A] _), - "applicative homomorphism" -> forAll(laws.applicativeHomomorphism[A, B] _), - "applicative interchange" -> forAll(laws.applicativeInterchange[A, B] _), - "applicative map" -> forAll(laws.applicativeMap[A, B] _)) + new RuleSet { + def name: String = "applicative" + def bases: Seq[(String, RuleSet)] = Nil + def parents: Seq[RuleSet] = Seq(apply[A, B, C], monoidal[A, B, C]) + def props: Seq[(String, Prop)] = Seq( + "applicative identity" -> forAll(laws.applicativeIdentity[A] _), + "applicative homomorphism" -> forAll(laws.applicativeHomomorphism[A, B] _), + "applicative interchange" -> forAll(laws.applicativeInterchange[A, B] _), + "applicative map" -> forAll(laws.applicativeMap[A, B] _) + ) + } } } diff --git a/laws/src/main/scala/cats/laws/discipline/ApplyTests.scala b/laws/src/main/scala/cats/laws/discipline/ApplyTests.scala index d6ca9f88337..a179986aca3 100644 --- a/laws/src/main/scala/cats/laws/discipline/ApplyTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/ApplyTests.scala @@ -2,12 +2,12 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.Arbitrary import org.scalacheck.Prop import Prop._ -trait ApplyTests[F[_]] extends FunctorTests[F] with MonoidalTests[F] { +trait ApplyTests[F[_]] extends FunctorTests[F] with SemigroupalTests[F] { def laws: ApplyLaws[F] def apply[A: Arbitrary, B: Arbitrary, C: Arbitrary](implicit @@ -22,7 +22,7 @@ trait ApplyTests[F[_]] extends FunctorTests[F] with MonoidalTests[F] { iso: Isomorphisms[F] ): RuleSet = new RuleSet { val name = "apply" - val parents = Seq(functor[A, B, C], monoidal[A, B, C]) + val parents = Seq(functor[A, B, C], semigroupal[A, B, C]) val bases = Seq.empty val props = Seq("apply composition" -> forAll(laws.applyComposition[A, B, C] _)) } diff --git a/laws/src/main/scala/cats/laws/discipline/BimonadTests.scala b/laws/src/main/scala/cats/laws/discipline/BimonadTests.scala index a5a7fee0473..04854e96b29 100644 --- a/laws/src/main/scala/cats/laws/discipline/BimonadTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/BimonadTests.scala @@ -2,7 +2,7 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.Arbitrary import org.scalacheck.Prop import Prop._ diff --git a/laws/src/main/scala/cats/laws/discipline/FlatMapTests.scala b/laws/src/main/scala/cats/laws/discipline/FlatMapTests.scala index c4aebf3a56c..d013777da8d 100644 --- a/laws/src/main/scala/cats/laws/discipline/FlatMapTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/FlatMapTests.scala @@ -2,7 +2,7 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.Arbitrary import org.scalacheck.Prop import Prop._ diff --git a/laws/src/main/scala/cats/laws/discipline/MonadCombineTests.scala b/laws/src/main/scala/cats/laws/discipline/MonadCombineTests.scala index 7f3cbea2ad2..2d1b6e91107 100644 --- a/laws/src/main/scala/cats/laws/discipline/MonadCombineTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/MonadCombineTests.scala @@ -2,7 +2,7 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.Arbitrary import org.scalacheck.Prop import Prop._ diff --git a/laws/src/main/scala/cats/laws/discipline/MonadErrorTests.scala b/laws/src/main/scala/cats/laws/discipline/MonadErrorTests.scala index 2b7ee10dfb5..1d09ed6b924 100644 --- a/laws/src/main/scala/cats/laws/discipline/MonadErrorTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/MonadErrorTests.scala @@ -3,7 +3,7 @@ package laws package discipline import cats.data.{ Xor, XorT } -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import cats.laws.discipline.arbitrary._ import cats.laws.discipline.eq.unitEq import org.scalacheck.{Arbitrary, Prop} diff --git a/laws/src/main/scala/cats/laws/discipline/MonadFilterTests.scala b/laws/src/main/scala/cats/laws/discipline/MonadFilterTests.scala index e56b7fe427e..df229d4e623 100644 --- a/laws/src/main/scala/cats/laws/discipline/MonadFilterTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/MonadFilterTests.scala @@ -2,7 +2,7 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.Arbitrary import org.scalacheck.Prop import Prop._ diff --git a/laws/src/main/scala/cats/laws/discipline/MonadReaderTests.scala b/laws/src/main/scala/cats/laws/discipline/MonadReaderTests.scala index e3fcdd0fc24..8ca248fb0e5 100644 --- a/laws/src/main/scala/cats/laws/discipline/MonadReaderTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/MonadReaderTests.scala @@ -2,7 +2,7 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.{Arbitrary, Prop} import org.scalacheck.Prop.forAll diff --git a/laws/src/main/scala/cats/laws/discipline/MonadStateTests.scala b/laws/src/main/scala/cats/laws/discipline/MonadStateTests.scala index c9d5015c089..a85f8578504 100644 --- a/laws/src/main/scala/cats/laws/discipline/MonadStateTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/MonadStateTests.scala @@ -2,7 +2,7 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import eq.unitEq import org.scalacheck.{Arbitrary, Prop} import org.scalacheck.Prop.forAll diff --git a/laws/src/main/scala/cats/laws/discipline/MonadTests.scala b/laws/src/main/scala/cats/laws/discipline/MonadTests.scala index 5c676bec78c..15624b5b801 100644 --- a/laws/src/main/scala/cats/laws/discipline/MonadTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/MonadTests.scala @@ -2,7 +2,7 @@ package cats package laws package discipline -import cats.laws.discipline.MonoidalTests.Isomorphisms +import cats.laws.discipline.SemigroupalTests.Isomorphisms import org.scalacheck.Arbitrary import org.scalacheck.Prop import Prop._ diff --git a/laws/src/main/scala/cats/laws/discipline/MonoidalTests.scala b/laws/src/main/scala/cats/laws/discipline/MonoidalTests.scala index 9c836c64f22..c39b7522fdc 100644 --- a/laws/src/main/scala/cats/laws/discipline/MonoidalTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/MonoidalTests.scala @@ -7,40 +7,27 @@ import org.scalacheck.Prop import Prop._ import org.typelevel.discipline.Laws -trait MonoidalTests[F[_]] extends Laws { +trait MonoidalTests[F[_]] extends SemigroupalTests[F] { def laws: MonoidalLaws[F] def monoidal[A : Arbitrary, B : Arbitrary, C : Arbitrary](implicit - iso: MonoidalTests.Isomorphisms[F], + iso: SemigroupalTests.Isomorphisms[F], ArbFA: Arbitrary[F[A]], ArbFB: Arbitrary[F[B]], ArbFC: Arbitrary[F[C]], + EqFA: Eq[F[A]], EqFABC: Eq[F[(A, B, C)]] ): RuleSet = { new DefaultRuleSet( name = "monoidal", - parent = None, - "monoidal associativity" -> forAll((fa: F[A], fb: F[B], fc: F[C]) => iso.associativity(laws.monoidalAssociativity(fa, fb, fc))) + parent = Some(semigroupal[A, B, C]), + "monoidal left identity" -> forAll(laws.leftIdentity[A] _), + "monoidal right identity" -> forAll(laws.rightIdentity[A] _) ) } } object MonoidalTests { - def apply[F[_] : Monoidal](implicit ev: Isomorphisms[F]): MonoidalTests[F] = + def apply[F[_] : Monoidal](implicit ev: SemigroupalTests.Isomorphisms[F]): MonoidalTests[F] = new MonoidalTests[F] { val laws: MonoidalLaws[F] = MonoidalLaws[F] } - - trait Isomorphisms[F[_]] { - def associativity[A, B, C](fs: (F[(A, (B, C))], F[((A, B), C)]))(implicit EqFABC: Eq[F[(A, B, C)]]): Prop - } - - object Isomorphisms { - import algebra.laws._ - implicit def invariant[F[_]](implicit F: functor.Invariant[F]): Isomorphisms[F] = - new Isomorphisms[F] { - def associativity[A, B, C](fs: (F[(A, (B, C))], F[((A, B), C)]))(implicit EqFABC: Eq[F[(A, B, C)]]) = - F.imap(fs._1) { case (a, (b, c)) => (a, b, c) } { case (a, b, c) => (a, (b, c)) } ?== - F.imap(fs._2) { case ((a, b), c) => (a, b, c) } { case (a, b, c) => ((a, b), c) } - } - } - -} \ No newline at end of file +} diff --git a/laws/src/main/scala/cats/laws/discipline/SemigroupalTests.scala b/laws/src/main/scala/cats/laws/discipline/SemigroupalTests.scala new file mode 100644 index 00000000000..9091d6efbc0 --- /dev/null +++ b/laws/src/main/scala/cats/laws/discipline/SemigroupalTests.scala @@ -0,0 +1,46 @@ +package cats +package laws +package discipline + +import org.scalacheck.Arbitrary +import org.scalacheck.Prop +import Prop._ +import org.typelevel.discipline.Laws + +trait SemigroupalTests[F[_]] extends Laws { + def laws: SemigroupalLaws[F] + + def semigroupal[A : Arbitrary, B : Arbitrary, C : Arbitrary](implicit + iso: SemigroupalTests.Isomorphisms[F], + ArbFA: Arbitrary[F[A]], + ArbFB: Arbitrary[F[B]], + ArbFC: Arbitrary[F[C]], + EqFABC: Eq[F[(A, B, C)]] + ): RuleSet = { + new DefaultRuleSet( + name = "semigroupal", + parent = None, + "semigroupal associativity" -> forAll((fa: F[A], fb: F[B], fc: F[C]) => iso.associativity(laws.semigroupalAssociativity(fa, fb, fc))) + ) + } +} + +object SemigroupalTests { + def apply[F[_] : Semigroupal](implicit ev: Isomorphisms[F]): SemigroupalTests[F] = + new SemigroupalTests[F] { val laws: SemigroupalLaws[F] = SemigroupalLaws[F] } + + trait Isomorphisms[F[_]] { + def associativity[A, B, C](fs: (F[(A, (B, C))], F[((A, B), C)]))(implicit EqFABC: Eq[F[(A, B, C)]]): Prop + } + + object Isomorphisms { + import algebra.laws._ + implicit def invariant[F[_]](implicit F: functor.Invariant[F]): Isomorphisms[F] = + new Isomorphisms[F] { + def associativity[A, B, C](fs: (F[(A, (B, C))], F[((A, B), C)]))(implicit EqFABC: Eq[F[(A, B, C)]]) = + F.imap(fs._1) { case (a, (b, c)) => (a, b, c) } { case (a, b, c) => (a, (b, c)) } ?== + F.imap(fs._2) { case ((a, b), c) => (a, b, c) } { case (a, b, c) => ((a, b), c) } + } + } + +} diff --git a/project/Boilerplate.scala b/project/Boilerplate.scala index 9c542460c9b..a2a7bf60454 100644 --- a/project/Boilerplate.scala +++ b/project/Boilerplate.scala @@ -25,8 +25,8 @@ object Boilerplate { val templates: Seq[Template] = Seq( - GenMonoidalBuilders, - GenMonoidalArityFunctions, + GenSemigroupalBuilders, + GenSemigroupalArityFunctions, GenApplyArityFunctions ) @@ -85,8 +85,8 @@ object Boilerplate { The block otherwise behaves as a standard interpolated string with regards to variable substitution. */ - object GenMonoidalBuilders extends Template { - def filename(root: File) = root / "cats" / "syntax" / "MonoidalBuilder.scala" + object GenSemigroupalBuilders extends Template { + def filename(root: File) = root / "cats" / "syntax" / "SemigroupalBuilder.scala" def content(tv: TemplateVals) = { import tv._ @@ -95,7 +95,7 @@ object Boilerplate { val tpesString = synTypes mkString ", " val params = (synVals zip tpes) map { case (v,t) => s"$v:$t"} mkString ", " val next = if (arity + 1 <= maxArity) { - s"def |@|[Z](z: F[Z]) = new MonoidalBuilder${arity + 1}(${`a..n`}, z)" + s"def |@|[Z](z: F[Z]) = new SemigroupalBuilder${arity + 1}(${`a..n`}, z)" } else { "" } @@ -104,18 +104,18 @@ object Boilerplate { val map = if (arity == 1) s"def map[Z](f: (${`A..N`}) => Z)(implicit functor: Functor[F]): F[Z] = functor.map(${`a..n`})(f)" - else s"def map[Z](f: (${`A..N`}) => Z)(implicit functor: Functor[F], monoidal: Monoidal[F]): F[Z] = Monoidal.map$n(${`a..n`})(f)" + else s"def map[Z](f: (${`A..N`}) => Z)(implicit functor: Functor[F], semigroupal: Semigroupal[F]): F[Z] = Semigroupal.map$n(${`a..n`})(f)" val contramap = if (arity == 1) s"def contramap[Z](f: Z => (${`A..N`}))(implicit contravariant: Contravariant[F]): F[Z] = contravariant.contramap(${`a..n`})(f)" - else s"def contramap[Z](f: Z => (${`A..N`}))(implicit contravariant: Contravariant[F], monoidal: Monoidal[F]): F[Z] = Monoidal.contramap$n(${`a..n`})(f)" + else s"def contramap[Z](f: Z => (${`A..N`}))(implicit contravariant: Contravariant[F], semigroupal: Semigroupal[F]): F[Z] = Semigroupal.contramap$n(${`a..n`})(f)" val imap = if (arity == 1) s"def imap[Z](f: (${`A..N`}) => Z)(g: Z => (${`A..N`}))(implicit invariant: Invariant[F]): F[Z] = invariant.imap(${`a..n`})(f)(g)" - else s"def imap[Z](f: (${`A..N`}) => Z)(g: Z => (${`A..N`}))(implicit invariant: Invariant[F], monoidal: Monoidal[F]): F[Z] = Monoidal.imap$n(${`a..n`})(f)(g)" + else s"def imap[Z](f: (${`A..N`}) => Z)(g: Z => (${`A..N`}))(implicit invariant: Invariant[F], semigroupal: Semigroupal[F]): F[Z] = Semigroupal.imap$n(${`a..n`})(f)(g)" val tupled = if (arity != 1) { - s"def tupled(implicit invariant: Invariant[F], monoidal: Monoidal[F]): F[(${`A..N`})] = Monoidal.tuple$n(${`a..n`})" + s"def tupled(implicit invariant: Invariant[F], semigroupal: Semigroupal[F]): F[(${`A..N`})] = Semigroupal.tuple$n(${`a..n`})" } else { "" } @@ -126,10 +126,10 @@ object Boilerplate { | |import cats.functor.{Contravariant, Invariant} | - |private[syntax] final class MonoidalBuilder[F[_]] { - | def |@|[A](a: F[A]) = new MonoidalBuilder1(a) + |private[syntax] final class SemigroupalBuilder[F[_]] { + | def |@|[A](a: F[A]) = new SemigroupalBuilder1(a) | - - private[syntax] final class MonoidalBuilder$arity[${`A..N`}]($params) { + - private[syntax] final class SemigroupalBuilder$arity[${`A..N`}]($params) { - $next - def ap[Z](f: F[(${`A..N`}) => Z])(implicit apply: Apply[F]): F[Z] = apply.ap$n(${`a..n`})(f) - $map @@ -172,17 +172,17 @@ object Boilerplate { block""" |package cats |trait ApplyArityFunctions[F[_]] { self: Apply[F] => - | def tuple2[A, B](f1: F[A], f2: F[B]): F[(A, B)] = Monoidal.tuple2(f1, f2)(self, self) + | def tuple2[A, B](f1: F[A], f2: F[B]): F[(A, B)] = Semigroupal.tuple2(f1, f2)(self, self) - def ap$arity[${`A..N`}, Z]($fparams)(f: F[(${`A..N`}) => Z]):F[Z] = $apply - - def map$arity[${`A..N`}, Z]($fparams)(f: (${`A..N`}) => Z): F[Z] = Monoidal.map$arity($fparams)(f)(self, self) - - def tuple$arity[${`A..N`}, Z]($fparams): F[(${`A..N`})] = Monoidal.tuple$arity($fparams)(self, self) + - def map$arity[${`A..N`}, Z]($fparams)(f: (${`A..N`}) => Z): F[Z] = Semigroupal.map$arity($fparams)(f)(self, self) + - def tuple$arity[${`A..N`}, Z]($fparams): F[(${`A..N`})] = Semigroupal.tuple$arity($fparams)(self, self) |} """ } } - object GenMonoidalArityFunctions extends Template { - def filename(root: File) = root / "cats" / "MonoidalArityFunctions.scala" + object GenSemigroupalArityFunctions extends Template { + def filename(root: File) = root / "cats" / "SemigroupalArityFunctions.scala" override def range = 2 to maxArity def content(tv: TemplateVals) = { import tv._ @@ -192,19 +192,19 @@ object Boilerplate { val fparams = (fargs zip tpes) map { case (v,t) => s"$v:$t"} mkString ", " val fargsS = fargs mkString ", " - val nestedProducts = (0 until (arity - 2)).foldRight(s"monoidal.product(f${arity - 2}, f${arity - 1})")((i, acc) => s"monoidal.product(f$i, $acc)") + val nestedProducts = (0 until (arity - 2)).foldRight(s"semigroupal.product(f${arity - 2}, f${arity - 1})")((i, acc) => s"semigroupal.product(f$i, $acc)") val `nested (a..n)` = (0 until (arity - 2)).foldRight(s"(a${arity - 2}, a${arity - 1})")((i, acc) => s"(a$i, $acc)") block""" |package cats - |trait MonoidalArityFunctions { - - def map$arity[F[_], ${`A..N`}, Z]($fparams)(f: (${`A..N`}) => Z)(implicit monoidal: Monoidal[F], functor: Functor[F]): F[Z] = + |trait SemigroupalArityFunctions { + - def map$arity[F[_], ${`A..N`}, Z]($fparams)(f: (${`A..N`}) => Z)(implicit semigroupal: Semigroupal[F], functor: Functor[F]): F[Z] = - functor.map($nestedProducts) { case ${`nested (a..n)`} => f(${`a..n`}) } - - def contramap$arity[F[_], ${`A..N`}, Z]($fparams)(f: Z => (${`A..N`}))(implicit monoidal: Monoidal[F], contravariant: functor.Contravariant[F]):F[Z] = + - def contramap$arity[F[_], ${`A..N`}, Z]($fparams)(f: Z => (${`A..N`}))(implicit semigroupal: Semigroupal[F], contravariant: functor.Contravariant[F]):F[Z] = - contravariant.contramap($nestedProducts) { z => val ${`(a..n)`} = f(z); ${`nested (a..n)`} } - - def imap$arity[F[_], ${`A..N`}, Z]($fparams)(f: (${`A..N`}) => Z)(g: Z => (${`A..N`}))(implicit monoidal: Monoidal[F], invariant: functor.Invariant[F]):F[Z] = + - def imap$arity[F[_], ${`A..N`}, Z]($fparams)(f: (${`A..N`}) => Z)(g: Z => (${`A..N`}))(implicit semigroupal: Semigroupal[F], invariant: functor.Invariant[F]):F[Z] = - invariant.imap($nestedProducts) { case ${`nested (a..n)`} => f(${`a..n`}) } { z => val ${`(a..n)`} = g(z); ${`nested (a..n)`} } - - def tuple$arity[F[_], ${`A..N`}]($fparams)(implicit monoidal: Monoidal[F], invariant: functor.Invariant[F]):F[(${`A..N`})] = + - def tuple$arity[F[_], ${`A..N`}]($fparams)(implicit semigroupal: Semigroupal[F], invariant: functor.Invariant[F]):F[(${`A..N`})] = - imap$arity($fargsS)((${`_.._`}))(identity) |} """ diff --git a/tests/src/test/scala/cats/tests/CokleisliTests.scala b/tests/src/test/scala/cats/tests/CokleisliTests.scala index a635e9b13e0..e9f7ce65527 100644 --- a/tests/src/test/scala/cats/tests/CokleisliTests.scala +++ b/tests/src/test/scala/cats/tests/CokleisliTests.scala @@ -18,10 +18,10 @@ class CokleisliTests extends SlowCatsSuite { def cokleisliEqE[F[_], A](implicit A: Arbitrary[F[A]], FA: Eq[A]): Eq[Cokleisli[F, A, A]] = Eq.by[Cokleisli[F, A, A], F[A] => A](_.run) - implicit val iso = MonoidalTests.Isomorphisms.invariant[Cokleisli[Option, Int, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Cokleisli[Option, Int, ?]] - checkAll("Cokleisli[Option, Int, Int]", MonoidalTests[Cokleisli[Option, Int, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Cokleisli[Option, Int, ?]", SerializableTests.serializable(Monoidal[Cokleisli[Option, Int, ?]])) + checkAll("Cokleisli[Option, Int, Int]", SemigroupalTests[Cokleisli[Option, Int, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Cokleisli[Option, Int, ?]", SerializableTests.serializable(Semigroupal[Cokleisli[Option, Int, ?]])) checkAll("Cokleisli[Option, Int, Int]", ApplicativeTests[Cokleisli[Option, Int, ?]].applicative[Int, Int, Int]) checkAll("Applicative[Cokleisli[Option, Int, ?]", SerializableTests.serializable(Applicative[Cokleisli[Option, Int, ?]])) diff --git a/tests/src/test/scala/cats/tests/ComposeTests.scala b/tests/src/test/scala/cats/tests/ComposeTests.scala index 5aca2b5628c..132b5c82db3 100644 --- a/tests/src/test/scala/cats/tests/ComposeTests.scala +++ b/tests/src/test/scala/cats/tests/ComposeTests.scala @@ -2,7 +2,7 @@ package cats package tests import cats.data.{ NonEmptyList, NonEmptyVector, OneAnd } -import cats.laws.discipline.{ ApplicativeTests, FoldableTests, MonoidalTests, SemigroupKTests, arbitrary, eq }, arbitrary._, eq._ +import cats.laws.discipline.{ ApplicativeTests, FoldableTests, SemigroupalTests, SemigroupKTests, arbitrary, eq }, arbitrary._, eq._ import org.scalacheck.Arbitrary class ComposeTests extends CatsSuite { @@ -16,7 +16,7 @@ class ComposeTests extends CatsSuite { // Applicative composition implicit val applicativeListVector: Applicative[Lambda[A => List[Vector[A]]]] = Applicative[List] compose Applicative[Vector] - implicit val iso = MonoidalTests.Isomorphisms.invariant[Lambda[A => List[Vector[A]]]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Lambda[A => List[Vector[A]]]] checkAll("Applicative[Lambda[A => List[Vector[A]]]]", ApplicativeTests[Lambda[A => List[Vector[A]]]].applicative[Int, Int, Int]) } diff --git a/tests/src/test/scala/cats/tests/ConstTests.scala b/tests/src/test/scala/cats/tests/ConstTests.scala index c52482425a4..59be7cf94d3 100644 --- a/tests/src/test/scala/cats/tests/ConstTests.scala +++ b/tests/src/test/scala/cats/tests/ConstTests.scala @@ -10,10 +10,10 @@ import cats.laws.discipline.arbitrary.{constArbitrary, oneAndArbitrary} class ConstTests extends CatsSuite { - implicit val iso = MonoidalTests.Isomorphisms.invariant[Const[String, ?]](Const.constTraverse) + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Const[String, ?]](Const.constTraverse) - checkAll("Const[String, Int]", MonoidalTests[Const[String, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Const[String, ?]]", SerializableTests.serializable(Monoidal[Const[String, ?]])) + checkAll("Const[String, Int]", SemigroupalTests[Const[String, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Const[String, ?]]", SerializableTests.serializable(Semigroupal[Const[String, ?]])) checkAll("Const[String, Int]", ApplicativeTests[Const[String, ?]].applicative[Int, Int, Int]) checkAll("Applicative[Const[String, ?]]", SerializableTests.serializable(Applicative[Const[String, ?]])) @@ -24,7 +24,7 @@ class ConstTests extends CatsSuite { // Get Apply[Const[C : Semigroup, ?]], not Applicative[Const[C : Monoid, ?]] { implicit def nonEmptyListSemigroup[A]: Semigroup[NonEmptyList[A]] = SemigroupK[NonEmptyList].algebra - implicit val iso = MonoidalTests.Isomorphisms.invariant[Const[NonEmptyList[String], ?]](Const.constContravariant) + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Const[NonEmptyList[String], ?]](Const.constContravariant) checkAll("Apply[Const[NonEmptyList[String], Int]]", ApplyTests[Const[NonEmptyList[String], ?]].apply[Int, Int, Int]) checkAll("Apply[Const[NonEmptyList[String], ?]]", SerializableTests.serializable(Apply[Const[NonEmptyList[String], ?]])) } diff --git a/tests/src/test/scala/cats/tests/EitherTests.scala b/tests/src/test/scala/cats/tests/EitherTests.scala index 5c4a015968e..8dca767d8a1 100644 --- a/tests/src/test/scala/cats/tests/EitherTests.scala +++ b/tests/src/test/scala/cats/tests/EitherTests.scala @@ -1,16 +1,16 @@ package cats package tests -import cats.laws.discipline.{TraverseTests, MonadTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{TraverseTests, MonadTests, SerializableTests, SemigroupalTests} import cats.laws.discipline.eq._ import algebra.laws.OrderLaws class EitherTests extends CatsSuite { - implicit val iso = MonoidalTests.Isomorphisms.invariant[Either[Int, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Either[Int, ?]] - checkAll("Either[Int, Int]", MonoidalTests[Either[Int, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Either[Int, ?]]", SerializableTests.serializable(Monoidal[Either[Int, ?]])) + checkAll("Either[Int, Int]", SemigroupalTests[Either[Int, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Either[Int, ?]]", SerializableTests.serializable(Semigroupal[Either[Int, ?]])) checkAll("Either[Int, Int]", MonadTests[Either[Int, ?]].monad[Int, Int, Int]) checkAll("Monad[Either[Int, ?]]", SerializableTests.serializable(Monad[Either[Int, ?]])) diff --git a/tests/src/test/scala/cats/tests/EvalTests.scala b/tests/src/test/scala/cats/tests/EvalTests.scala index 7c40556908c..a02a5522802 100644 --- a/tests/src/test/scala/cats/tests/EvalTests.scala +++ b/tests/src/test/scala/cats/tests/EvalTests.scala @@ -3,7 +3,7 @@ package tests import scala.math.min import cats.laws.ComonadLaws -import cats.laws.discipline.{MonoidalTests, BimonadTests, SerializableTests} +import cats.laws.discipline.{SemigroupalTests, BimonadTests, SerializableTests} import cats.laws.discipline.arbitrary._ import cats.laws.discipline.eq._ import algebra.laws.{GroupLaws, OrderLaws} @@ -92,7 +92,7 @@ class EvalTests extends CatsSuite { } { - implicit val iso = MonoidalTests.Isomorphisms.invariant[Eval] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Eval] checkAll("Eval[Int]", BimonadTests[Eval].bimonad[Int, Int, Int]) } checkAll("Bimonad[Eval]", SerializableTests.serializable(Bimonad[Eval])) diff --git a/tests/src/test/scala/cats/tests/FreeApplicativeTests.scala b/tests/src/test/scala/cats/tests/FreeApplicativeTests.scala index aae6fdf5ca0..c594eb6b4f9 100644 --- a/tests/src/test/scala/cats/tests/FreeApplicativeTests.scala +++ b/tests/src/test/scala/cats/tests/FreeApplicativeTests.scala @@ -3,7 +3,7 @@ package tests import cats.arrow.NaturalTransformation import cats.free.FreeApplicative -import cats.laws.discipline.{MonoidalTests, ApplicativeTests, SerializableTests} +import cats.laws.discipline.{SemigroupalTests, ApplicativeTests, SerializableTests} import cats.laws.discipline.eq.tuple3Eq import cats.data.Const @@ -24,7 +24,7 @@ class FreeApplicativeTests extends CatsSuite { } } - implicit val iso = MonoidalTests.Isomorphisms.invariant[FreeApplicative[Option, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[FreeApplicative[Option, ?]] checkAll("FreeApplicative[Option, ?]", ApplicativeTests[FreeApplicative[Option, ?]].applicative[Int, Int, Int]) checkAll("Monad[FreeApplicative[Option, ?]]", SerializableTests.serializable(Applicative[FreeApplicative[Option, ?]])) diff --git a/tests/src/test/scala/cats/tests/FreeTests.scala b/tests/src/test/scala/cats/tests/FreeTests.scala index 96d58866f00..66d73a926d0 100644 --- a/tests/src/test/scala/cats/tests/FreeTests.scala +++ b/tests/src/test/scala/cats/tests/FreeTests.scala @@ -3,7 +3,7 @@ package tests import cats.arrow.NaturalTransformation import cats.free.{Free, Trampoline} -import cats.laws.discipline.{MonoidalTests, MonadTests, SerializableTests} +import cats.laws.discipline.{SemigroupalTests, MonadTests, SerializableTests} import cats.laws.discipline.eq._ import cats.laws.discipline.arbitrary.function0Arbitrary import org.scalacheck.{Arbitrary, Gen} @@ -12,7 +12,7 @@ import Arbitrary.{arbitrary, arbFunction1} class FreeTests extends CatsSuite { import FreeTests._ - implicit val iso = MonoidalTests.Isomorphisms.invariant[Free[Option, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Free[Option, ?]] checkAll("Free[Option, ?]", MonadTests[Free[Option, ?]].monad[Int, Int, Int]) checkAll("Monad[Free[Option, ?]]", SerializableTests.serializable(Monad[Free[Option, ?]])) diff --git a/tests/src/test/scala/cats/tests/FuncTests.scala b/tests/src/test/scala/cats/tests/FuncTests.scala index 65651965828..ff9afdff452 100644 --- a/tests/src/test/scala/cats/tests/FuncTests.scala +++ b/tests/src/test/scala/cats/tests/FuncTests.scala @@ -14,10 +14,10 @@ class FuncTests extends CatsSuite { implicit def appFuncEq[F[_], A, B](implicit A: Arbitrary[A], FB: Eq[F[B]]): Eq[AppFunc[F, A, B]] = Eq.by[AppFunc[F, A, B], A => F[B]](_.run) - implicit val iso = MonoidalTests.Isomorphisms.invariant[Func[Option, Int, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Func[Option, Int, ?]] - checkAll("Func[Option, Int, Int]", MonoidalTests[Func[Option, Int, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Func[Option, Int, ?]]", SerializableTests.serializable(Monoidal[Func[Option, Int, ?]])) + checkAll("Func[Option, Int, Int]", SemigroupalTests[Func[Option, Int, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Func[Option, Int, ?]]", SerializableTests.serializable(Semigroupal[Func[Option, Int, ?]])) { implicit val funcApp = Func.funcApplicative[Option, Int] @@ -39,7 +39,7 @@ class FuncTests extends CatsSuite { { implicit val appFuncApp = AppFunc.appFuncApplicative[Option, Int] - implicit val iso = MonoidalTests.Isomorphisms.invariant[AppFunc[Option, Int, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[AppFunc[Option, Int, ?]] checkAll("AppFunc[Option, Int, Int]", ApplicativeTests[AppFunc[Option, Int, ?]].applicative[Int, Int, Int]) checkAll("Applicative[AppFunc[Option, Int, ?]]", SerializableTests.serializable(Applicative[AppFunc[Option, Int, ?]])) } diff --git a/tests/src/test/scala/cats/tests/FunctionTests.scala b/tests/src/test/scala/cats/tests/FunctionTests.scala index 185dc8eaab0..2a137fd1729 100644 --- a/tests/src/test/scala/cats/tests/FunctionTests.scala +++ b/tests/src/test/scala/cats/tests/FunctionTests.scala @@ -12,15 +12,15 @@ import algebra.laws.GroupLaws class FunctionTests extends CatsSuite { - checkAll("Function0[Int]", MonoidalTests[Function0].monoidal[Int, Int, Int]) - checkAll("Monoidal[Function0]", SerializableTests.serializable(Monoidal[Function0])) + checkAll("Function0[Int]", SemigroupalTests[Function0].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Function0]", SerializableTests.serializable(Semigroupal[Function0])) checkAll("Function0[Int]", BimonadTests[Function0].bimonad[Int, Int, Int]) checkAll("Bimonad[Function0]", SerializableTests.serializable(Bimonad[Function0])) - implicit val iso = MonoidalTests.Isomorphisms.invariant[Function1[Int, ?]] - checkAll("Function1[Int, Int]", MonoidalTests[Function1[Int, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Function1[Int, ?]]", SerializableTests.serializable(Monoidal[Function1[Int, ?]])) + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Function1[Int, ?]] + checkAll("Function1[Int, Int]", SemigroupalTests[Function1[Int, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Function1[Int, ?]]", SerializableTests.serializable(Semigroupal[Function1[Int, ?]])) checkAll("Function1[Int, Int]", MonadReaderTests[Int => ?, Int].monadReader[Int, Int, Int]) checkAll("MonadReader[Int => ?, Int]", SerializableTests.serializable(MonadReader[Int => ?, Int])) diff --git a/tests/src/test/scala/cats/tests/IdTests.scala b/tests/src/test/scala/cats/tests/IdTests.scala index 572f6d66996..0874f3fee68 100644 --- a/tests/src/test/scala/cats/tests/IdTests.scala +++ b/tests/src/test/scala/cats/tests/IdTests.scala @@ -6,7 +6,7 @@ import cats.laws.discipline._ import cats.laws.discipline.eq.tuple3Eq class IdTests extends CatsSuite { - implicit val iso = MonoidalTests.Isomorphisms.invariant[Id] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Id] checkAll("Id[Int]", BimonadTests[Id].bimonad[Int, Int, Int]) checkAll("Bimonad[Id]", SerializableTests.serializable(Bimonad[Id])) diff --git a/tests/src/test/scala/cats/tests/IorTests.scala b/tests/src/test/scala/cats/tests/IorTests.scala index d1c12437b1b..b4667885a9e 100644 --- a/tests/src/test/scala/cats/tests/IorTests.scala +++ b/tests/src/test/scala/cats/tests/IorTests.scala @@ -2,7 +2,7 @@ package cats package tests import cats.data.{Xor, Ior} -import cats.laws.discipline.{BifunctorTests, TraverseTests, MonadTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{BifunctorTests, TraverseTests, MonadTests, SerializableTests, SemigroupalTests} import cats.laws.discipline.arbitrary._ import cats.laws.discipline.eq._ import org.scalacheck.Arbitrary @@ -10,10 +10,10 @@ import org.scalacheck.Arbitrary._ class IorTests extends CatsSuite { - implicit val iso = MonoidalTests.Isomorphisms.invariant[Ior[String, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Ior[String, ?]] - checkAll("Ior[String, Int]", MonoidalTests[Ior[String, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[String Ior ?]]", SerializableTests.serializable(Monoidal[String Ior ?])) + checkAll("Ior[String, Int]", SemigroupalTests[Ior[String, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[String Ior ?]]", SerializableTests.serializable(Semigroupal[String Ior ?])) checkAll("Ior[String, Int]", MonadTests[String Ior ?].monad[Int, Int, Int]) checkAll("Monad[String Ior ?]]", SerializableTests.serializable(Monad[String Ior ?])) diff --git a/tests/src/test/scala/cats/tests/KleisliTests.scala b/tests/src/test/scala/cats/tests/KleisliTests.scala index 9c5f6cea221..6d09efda7fb 100644 --- a/tests/src/test/scala/cats/tests/KleisliTests.scala +++ b/tests/src/test/scala/cats/tests/KleisliTests.scala @@ -15,10 +15,10 @@ class KleisliTests extends CatsSuite { implicit def kleisliEq[F[_], A, B](implicit A: Arbitrary[A], FB: Eq[F[B]]): Eq[Kleisli[F, A, B]] = Eq.by[Kleisli[F, A, B], A => F[B]](_.run) - implicit val iso = MonoidalTests.Isomorphisms.invariant[Kleisli[Option, Int, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Kleisli[Option, Int, ?]] - checkAll("Kleisli[Option, Int, Int]", MonoidalTests[Kleisli[Option, Int, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Kleisli[Option, Int, ?]]", SerializableTests.serializable(Monoidal[Kleisli[Option, Int, ?]])) + checkAll("Kleisli[Option, Int, Int]", SemigroupalTests[Kleisli[Option, Int, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Kleisli[Option, Int, ?]]", SerializableTests.serializable(Semigroupal[Kleisli[Option, Int, ?]])) { implicit val kleisliArrow = Kleisli.kleisliArrow[Option] diff --git a/tests/src/test/scala/cats/tests/ListTests.scala b/tests/src/test/scala/cats/tests/ListTests.scala index 9f780005428..899781c162b 100644 --- a/tests/src/test/scala/cats/tests/ListTests.scala +++ b/tests/src/test/scala/cats/tests/ListTests.scala @@ -2,14 +2,14 @@ package cats package tests import cats.data.NonEmptyList -import cats.laws.discipline.{TraverseTests, CoflatMapTests, MonadCombineTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{TraverseTests, CoflatMapTests, MonadCombineTests, SerializableTests, SemigroupalTests} import cats.laws.discipline.arbitrary._ import cats.laws.discipline.eq._ class ListTests extends CatsSuite { - checkAll("List[Int]", MonoidalTests[List].monoidal[Int, Int, Int]) - checkAll("Monoidal[List]", SerializableTests.serializable(Monoidal[List])) + checkAll("List[Int]", SemigroupalTests[List].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[List]", SerializableTests.serializable(Semigroupal[List])) checkAll("List[Int]", CoflatMapTests[List].coflatMap[Int, Int, Int]) checkAll("CoflatMap[List]", SerializableTests.serializable(CoflatMap[List])) diff --git a/tests/src/test/scala/cats/tests/MapTests.scala b/tests/src/test/scala/cats/tests/MapTests.scala index ba6d77240bb..0b1a026f8ed 100644 --- a/tests/src/test/scala/cats/tests/MapTests.scala +++ b/tests/src/test/scala/cats/tests/MapTests.scala @@ -1,14 +1,14 @@ package cats package tests -import cats.laws.discipline.{TraverseTests, FlatMapTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{TraverseTests, FlatMapTests, SerializableTests, SemigroupalTests} import cats.laws.discipline.eq._ class MapTests extends CatsSuite { - implicit val iso = MonoidalTests.Isomorphisms.invariant[Map[Int, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Map[Int, ?]] - checkAll("Map[Int, Int]", MonoidalTests[Map[Int, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Map[Int, ?]]", SerializableTests.serializable(Monoidal[Map[Int, ?]])) + checkAll("Map[Int, Int]", SemigroupalTests[Map[Int, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Map[Int, ?]]", SerializableTests.serializable(Semigroupal[Map[Int, ?]])) checkAll("Map[Int, Int]", FlatMapTests[Map[Int, ?]].flatMap[Int, Int, Int]) checkAll("FlatMap[Map[Int, ?]]", SerializableTests.serializable(FlatMap[Map[Int, ?]])) diff --git a/tests/src/test/scala/cats/tests/OneAndTests.scala b/tests/src/test/scala/cats/tests/OneAndTests.scala index 0b6f5c3ea0d..f14c1bd2610 100644 --- a/tests/src/test/scala/cats/tests/OneAndTests.scala +++ b/tests/src/test/scala/cats/tests/OneAndTests.scala @@ -4,7 +4,7 @@ package tests import algebra.laws.{GroupLaws, OrderLaws} import cats.data.{NonEmptyList, OneAnd} -import cats.laws.discipline.{ComonadTests, FunctorTests, SemigroupKTests, FoldableTests, MonadTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{ComonadTests, FunctorTests, SemigroupKTests, FoldableTests, MonadTests, SerializableTests, SemigroupalTests} import cats.laws.discipline.arbitrary.{evalArbitrary, oneAndArbitrary} import cats.laws.discipline.eq._ @@ -13,13 +13,13 @@ import scala.util.Random class OneAndTests extends CatsSuite { checkAll("OneAnd[List, Int]", OrderLaws[OneAnd[List, Int]].eqv) - implicit val iso = MonoidalTests.Isomorphisms.invariant[OneAnd[ListWrapper, ?]](OneAnd.oneAndFunctor(ListWrapper.functor)) + implicit val iso = SemigroupalTests.Isomorphisms.invariant[OneAnd[ListWrapper, ?]](OneAnd.oneAndFunctor(ListWrapper.functor)) // Test instances that have more general constraints { implicit val monadCombine = ListWrapper.monadCombine - checkAll("OneAnd[ListWrapper, Int]", MonoidalTests[OneAnd[ListWrapper, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[OneAnd[ListWrapper, A]]", SerializableTests.serializable(Monoidal[OneAnd[ListWrapper, ?]])) + checkAll("OneAnd[ListWrapper, Int]", SemigroupalTests[OneAnd[ListWrapper, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[OneAnd[ListWrapper, A]]", SerializableTests.serializable(Semigroupal[OneAnd[ListWrapper, ?]])) } { @@ -49,7 +49,7 @@ class OneAndTests extends CatsSuite { implicitly[Comonad[NonEmptyList]] } - implicit val iso2 = MonoidalTests.Isomorphisms.invariant[OneAnd[List, ?]] + implicit val iso2 = SemigroupalTests.Isomorphisms.invariant[OneAnd[List, ?]] checkAll("NonEmptyList[Int]", MonadTests[NonEmptyList].monad[Int, Int, Int]) checkAll("Monad[NonEmptyList[A]]", SerializableTests.serializable(Monad[NonEmptyList])) diff --git a/tests/src/test/scala/cats/tests/OptionTTests.scala b/tests/src/test/scala/cats/tests/OptionTTests.scala index 12f50c1ec0c..c82c284741b 100644 --- a/tests/src/test/scala/cats/tests/OptionTTests.scala +++ b/tests/src/test/scala/cats/tests/OptionTTests.scala @@ -1,8 +1,8 @@ package cats.tests -import cats.{Applicative, Id, Monad, Monoidal, Show} +import cats.{Applicative, Id, Monad, Semigroupal, Show} import cats.data.{OptionT, Validated, Xor} -import cats.laws.discipline.{ApplicativeTests, FunctorTests, MonadCombineTests, SerializableTests, MonoidalTests, MonadTests} +import cats.laws.discipline.{ApplicativeTests, FunctorTests, MonadCombineTests, SerializableTests, SemigroupalTests, MonadTests} import cats.laws.discipline.arbitrary._ import cats.laws.discipline.eq._ import org.scalacheck.{Arbitrary, Gen} @@ -118,10 +118,10 @@ class OptionTTests extends CatsSuite { } } - implicit val iso = MonoidalTests.Isomorphisms.invariant[OptionT[List, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[OptionT[List, ?]] - checkAll("OptionT[List, Int]", MonoidalTests[OptionT[List, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[OptionT[List, ?]]", SerializableTests.serializable(Monoidal[OptionT[List, ?]])) + checkAll("OptionT[List, Int]", SemigroupalTests[OptionT[List, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[OptionT[List, ?]]", SerializableTests.serializable(Semigroupal[OptionT[List, ?]])) test("liftF") { forAll { (xs: List[Int]) => diff --git a/tests/src/test/scala/cats/tests/OptionTests.scala b/tests/src/test/scala/cats/tests/OptionTests.scala index 77864b6d251..0f4945ba8c1 100644 --- a/tests/src/test/scala/cats/tests/OptionTests.scala +++ b/tests/src/test/scala/cats/tests/OptionTests.scala @@ -2,12 +2,12 @@ package cats package tests import cats.laws.{ApplicativeLaws, CoflatMapLaws, FlatMapLaws, MonadLaws} -import cats.laws.discipline.{TraverseTests, CoflatMapTests, MonadCombineTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{TraverseTests, CoflatMapTests, MonadCombineTests, SerializableTests, SemigroupalTests} import cats.laws.discipline.eq._ class OptionTests extends CatsSuite { - checkAll("Option[Int]", MonoidalTests[Option].monoidal[Int, Int, Int]) - checkAll("Monoidal[Option]", SerializableTests.serializable(Monoidal[Option])) + checkAll("Option[Int]", SemigroupalTests[Option].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Option]", SerializableTests.serializable(Semigroupal[Option])) checkAll("Option[Int]", CoflatMapTests[Option].coflatMap[Int, Int, Int]) checkAll("CoflatMap[Option]", SerializableTests.serializable(CoflatMap[Option])) diff --git a/tests/src/test/scala/cats/tests/ProdTests.scala b/tests/src/test/scala/cats/tests/ProdTests.scala index 28d40f8a622..2abb98c7644 100644 --- a/tests/src/test/scala/cats/tests/ProdTests.scala +++ b/tests/src/test/scala/cats/tests/ProdTests.scala @@ -8,9 +8,9 @@ import cats.laws.discipline.eq._ import org.scalacheck.Arbitrary class ProdTests extends CatsSuite { - implicit val iso = MonoidalTests.Isomorphisms.invariant[Prod[Option, List, ?]] - checkAll("Prod[Option, List, Int]", MonoidalTests[Lambda[X => Prod[Option, List, X]]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Prod[Option, List, Int]]", SerializableTests.serializable(Monoidal[Lambda[X => Prod[Option, List, X]]])) + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Prod[Option, List, ?]] + checkAll("Prod[Option, List, Int]", SemigroupalTests[Lambda[X => Prod[Option, List, X]]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Prod[Option, List, Int]]", SerializableTests.serializable(Semigroupal[Lambda[X => Prod[Option, List, X]]])) checkAll("Prod[Option, List, Int]", AlternativeTests[Lambda[X => Prod[Option, List, X]]].alternative[Int, Int, Int]) checkAll("Alternative[Prod[Option, List, Int]]", SerializableTests.serializable(Alternative[Lambda[X => Prod[Option, List, X]]])) diff --git a/tests/src/test/scala/cats/tests/StateTTests.scala b/tests/src/test/scala/cats/tests/StateTTests.scala index 257f89e46e4..1798851cb2e 100644 --- a/tests/src/test/scala/cats/tests/StateTTests.scala +++ b/tests/src/test/scala/cats/tests/StateTTests.scala @@ -1,7 +1,7 @@ package cats package tests -import cats.laws.discipline.{MonoidalTests, MonadStateTests, MonoidKTests, SerializableTests} +import cats.laws.discipline.{SemigroupalTests, MonadStateTests, MonoidKTests, SerializableTests} import cats.state.{State, StateT} import cats.laws.discipline.eq._ import cats.laws.discipline.arbitrary._ @@ -28,7 +28,7 @@ class StateTTests extends CatsSuite { } } - test("Monoidal syntax is usable on State") { + test("Semigroupal syntax is usable on State") { val x = add1 *> add1 x.runS(0).value should === (2) } @@ -95,13 +95,13 @@ class StateTTests extends CatsSuite { } { - implicit val iso = MonoidalTests.Isomorphisms.invariant[StateT[Option, Int, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[StateT[Option, Int, ?]] checkAll("StateT[Option, Int, Int]", MonadStateTests[StateT[Option, Int, ?], Int].monadState[Int, Int, Int]) checkAll("MonadState[StateT[Option, ?, ?], Int]", SerializableTests.serializable(MonadState[StateT[Option, Int, ?], Int])) } { - implicit val iso = MonoidalTests.Isomorphisms.invariant[State[Long, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[State[Long, ?]] checkAll("State[Long, ?]", MonadStateTests[State[Long, ?], Long].monadState[Int, Int, Int]) checkAll("MonadState[State[Long, ?], Long]", SerializableTests.serializable(MonadState[State[Long, ?], Long])) } diff --git a/tests/src/test/scala/cats/tests/StreamTests.scala b/tests/src/test/scala/cats/tests/StreamTests.scala index 828fed2ddbb..57a3e652c5d 100644 --- a/tests/src/test/scala/cats/tests/StreamTests.scala +++ b/tests/src/test/scala/cats/tests/StreamTests.scala @@ -1,12 +1,12 @@ package cats package tests -import cats.laws.discipline.{CoflatMapTests, MonadCombineTests, SerializableTests, TraverseTests, MonoidalTests} +import cats.laws.discipline.{CoflatMapTests, MonadCombineTests, SerializableTests, TraverseTests, SemigroupalTests} import cats.laws.discipline.eq.tuple3Eq class StreamTests extends CatsSuite { - checkAll("Stream[Int]", MonoidalTests[Stream].monoidal[Int, Int, Int]) - checkAll("Monoidal[Stream]", SerializableTests.serializable(Monoidal[Stream])) + checkAll("Stream[Int]", SemigroupalTests[Stream].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Stream]", SerializableTests.serializable(Semigroupal[Stream])) checkAll("Stream[Int]", CoflatMapTests[Stream].coflatMap[Int, Int, Int]) checkAll("CoflatMap[Stream]", SerializableTests.serializable(CoflatMap[Stream])) diff --git a/tests/src/test/scala/cats/tests/StreamingTTests.scala b/tests/src/test/scala/cats/tests/StreamingTTests.scala index 753bdae8289..3fc1a42c2c4 100644 --- a/tests/src/test/scala/cats/tests/StreamingTTests.scala +++ b/tests/src/test/scala/cats/tests/StreamingTTests.scala @@ -4,14 +4,14 @@ package tests import algebra.laws.OrderLaws import cats.data.{Streaming, StreamingT} -import cats.laws.discipline.{MonoidalTests, CoflatMapTests, MonadCombineTests, SerializableTests} +import cats.laws.discipline.{SemigroupalTests, CoflatMapTests, MonadCombineTests, SerializableTests} import cats.laws.discipline.arbitrary._ import cats.laws.discipline.eq._ class StreamingTTests extends CatsSuite { { - implicit val iso = MonoidalTests.Isomorphisms.invariant[StreamingT[Eval, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[StreamingT[Eval, ?]] checkAll("StreamingT[Eval, ?]", MonadCombineTests[StreamingT[Eval, ?]].monadCombine[Int, Int, Int]) checkAll("StreamingT[Eval, ?]", CoflatMapTests[StreamingT[Eval, ?]].coflatMap[Int, Int, Int]) checkAll("StreamingT[Eval, Int]", OrderLaws[StreamingT[Eval, Int]].order) @@ -19,7 +19,7 @@ class StreamingTTests extends CatsSuite { } { - implicit val iso = MonoidalTests.Isomorphisms.invariant[StreamingT[Option, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[StreamingT[Option, ?]] checkAll("StreamingT[Option, ?]", MonadCombineTests[StreamingT[Option, ?]].monadCombine[Int, Int, Int]) checkAll("StreamingT[Option, ?]", CoflatMapTests[StreamingT[Option, ?]].coflatMap[Int, Int, Int]) checkAll("StreamingT[Option, Int]", OrderLaws[StreamingT[Option, Int]].order) @@ -27,7 +27,7 @@ class StreamingTTests extends CatsSuite { } { - implicit val iso = MonoidalTests.Isomorphisms.invariant[StreamingT[List, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[StreamingT[List, ?]] checkAll("StreamingT[List, ?]", MonadCombineTests[StreamingT[List, ?]].monadCombine[Int, Int, Int]) checkAll("StreamingT[List, ?]", CoflatMapTests[StreamingT[List, ?]].coflatMap[Int, Int, Int]) checkAll("StreamingT[List, Int]", OrderLaws[StreamingT[List, Int]].order) diff --git a/tests/src/test/scala/cats/tests/StreamingTests.scala b/tests/src/test/scala/cats/tests/StreamingTests.scala index 3097c5ce355..d93edf234e9 100644 --- a/tests/src/test/scala/cats/tests/StreamingTests.scala +++ b/tests/src/test/scala/cats/tests/StreamingTests.scala @@ -6,12 +6,12 @@ import algebra.laws.OrderLaws import cats.data.Streaming import cats.laws.discipline.arbitrary._ import cats.laws.discipline.eq._ -import cats.laws.discipline.{TraverseTests, CoflatMapTests, MonadCombineTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{TraverseTests, CoflatMapTests, MonadCombineTests, SerializableTests, SemigroupalTests} import org.scalacheck.{Arbitrary, Gen} class StreamingTests extends CatsSuite { - checkAll("Streaming[Int]", MonoidalTests[Streaming].monoidal[Int, Int, Int]) - checkAll("Monoidal[Streaming]", SerializableTests.serializable(Monoidal[Streaming])) + checkAll("Streaming[Int]", SemigroupalTests[Streaming].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Streaming]", SerializableTests.serializable(Semigroupal[Streaming])) checkAll("Streaming[Int]", CoflatMapTests[Streaming].coflatMap[Int, Int, Int]) checkAll("CoflatMap[Streaming]", SerializableTests.serializable(CoflatMap[Streaming])) diff --git a/tests/src/test/scala/cats/tests/ValidatedTests.scala b/tests/src/test/scala/cats/tests/ValidatedTests.scala index ea575a8d860..3e42ca6e087 100644 --- a/tests/src/test/scala/cats/tests/ValidatedTests.scala +++ b/tests/src/test/scala/cats/tests/ValidatedTests.scala @@ -3,7 +3,7 @@ package tests import cats.data.{NonEmptyList, Validated, ValidatedNel, Xor} import cats.data.Validated.{Valid, Invalid} -import cats.laws.discipline.{BifunctorTests, TraverseTests, ApplicativeTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{BifunctorTests, TraverseTests, ApplicativeTests, SerializableTests, SemigroupalTests} import org.scalacheck.{Gen, Arbitrary} import org.scalacheck.Arbitrary._ import cats.laws.discipline.arbitrary._ @@ -13,9 +13,9 @@ import algebra.laws.{OrderLaws, GroupLaws} import scala.util.Try class ValidatedTests extends CatsSuite { - implicit val iso = MonoidalTests.Isomorphisms.invariant[Validated[String, ?]] - checkAll("Validated[String, Int]", MonoidalTests[Validated[String,?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Validated[String,?]]", SerializableTests.serializable(Monoidal[Validated[String,?]])) + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Validated[String, ?]] + checkAll("Validated[String, Int]", SemigroupalTests[Validated[String,?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Validated[String,?]]", SerializableTests.serializable(Semigroupal[Validated[String,?]])) checkAll("Validated[String, Int]", ApplicativeTests[Validated[String,?]].applicative[Int, Int, Int]) checkAll("Validated[?, ?]", BifunctorTests[Validated].bifunctor[Int, Int, Int, Int, Int, Int]) diff --git a/tests/src/test/scala/cats/tests/VectorTests.scala b/tests/src/test/scala/cats/tests/VectorTests.scala index 423e101a155..05acd0a87a4 100644 --- a/tests/src/test/scala/cats/tests/VectorTests.scala +++ b/tests/src/test/scala/cats/tests/VectorTests.scala @@ -1,12 +1,12 @@ package cats package tests -import cats.laws.discipline.{MonadCombineTests, SerializableTests, TraverseTests, MonoidalTests} +import cats.laws.discipline.{MonadCombineTests, SerializableTests, TraverseTests, SemigroupalTests} import cats.laws.discipline.eq.tuple3Eq class VectorTests extends CatsSuite { - checkAll("Vector[Int]", MonoidalTests[Vector].monoidal[Int, Int, Int]) - checkAll("Monoidal[Vector]", SerializableTests.serializable(Monoidal[Vector])) + checkAll("Vector[Int]", SemigroupalTests[Vector].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Vector]", SerializableTests.serializable(Semigroupal[Vector])) checkAll("Vector[Int]", MonadCombineTests[Vector].monadCombine[Int, Int, Int]) checkAll("MonadCombine[Vector]", SerializableTests.serializable(MonadCombine[Vector])) diff --git a/tests/src/test/scala/cats/tests/WordCountTest.scala b/tests/src/test/scala/cats/tests/WordCountTest.scala index 8324349a380..15b2b19b249 100644 --- a/tests/src/test/scala/cats/tests/WordCountTest.scala +++ b/tests/src/test/scala/cats/tests/WordCountTest.scala @@ -12,7 +12,7 @@ class WordCountTest extends CatsSuite { test("wordcount") { import cats.state.State.{ get, set } val text = "Faith, I must leave thee, love, and shortly too.\nMy operant powers their functions leave to do.\n".toList - // A type alias to treat Int as monoidal applicative + // A type alias to treat Int as semigroupal applicative type Count[A] = Const[Int, A] // Tye type parameter to Count is ceremonial, so hardcode it to Unit def liftInt(i: Int): Count[Unit] = Const(i) diff --git a/tests/src/test/scala/cats/tests/WriterTTests.scala b/tests/src/test/scala/cats/tests/WriterTTests.scala index d214a08899d..ec1c5f05bf2 100644 --- a/tests/src/test/scala/cats/tests/WriterTTests.scala +++ b/tests/src/test/scala/cats/tests/WriterTTests.scala @@ -80,7 +80,7 @@ class WriterTTests extends CatsSuite { checkAll("Bifunctor[WriterT[ListWrapper, ?, ?]]", SerializableTests.serializable(Bifunctor[WriterT[ListWrapper, ?, ?]])) } - implicit val iso = MonoidalTests.Isomorphisms.invariant[WriterT[ListWrapper, ListWrapper[Int], ?]](WriterT.writerTFunctor(ListWrapper.functor)) + implicit val iso = SemigroupalTests.Isomorphisms.invariant[WriterT[ListWrapper, ListWrapper[Int], ?]](WriterT.writerTFunctor(ListWrapper.functor)) // We have varying instances available depending on `F` and `L`. // We also battle some inference issues with `Id`. diff --git a/tests/src/test/scala/cats/tests/XorTTests.scala b/tests/src/test/scala/cats/tests/XorTTests.scala index c24f1561ff0..b5548a15b99 100644 --- a/tests/src/test/scala/cats/tests/XorTTests.scala +++ b/tests/src/test/scala/cats/tests/XorTTests.scala @@ -11,7 +11,7 @@ import algebra.laws.OrderLaws class XorTTests extends CatsSuite { implicit val eq0 = XorT.xorTEq[List, String, String Xor Int] implicit val eq1 = XorT.xorTEq[XorT[List, String, ?], String, Int](eq0) - implicit val iso = MonoidalTests.Isomorphisms.invariant[XorT[List, String, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[XorT[List, String, ?]] checkAll("XorT[List, String, Int]", MonadErrorTests[XorT[List, String, ?], String].monadError[Int, Int, Int]) checkAll("MonadError[XorT[List, ?, ?]]", SerializableTests.serializable(MonadError[XorT[List, String, ?], String])) checkAll("XorT[List, String, Int]", MonoidKTests[XorT[List, String, ?]].monoidK[Int]) diff --git a/tests/src/test/scala/cats/tests/XorTests.scala b/tests/src/test/scala/cats/tests/XorTests.scala index e8aec6c09b6..853fb20b4bc 100644 --- a/tests/src/test/scala/cats/tests/XorTests.scala +++ b/tests/src/test/scala/cats/tests/XorTests.scala @@ -4,7 +4,7 @@ package tests import cats.data.{NonEmptyList, Xor, XorT} import cats.data.Xor._ import cats.laws.discipline.arbitrary._ -import cats.laws.discipline.{BifunctorTests, TraverseTests, MonadErrorTests, SerializableTests, MonoidalTests} +import cats.laws.discipline.{BifunctorTests, TraverseTests, MonadErrorTests, SerializableTests, SemigroupalTests} import cats.laws.discipline.eq.tuple3Eq import algebra.laws.{GroupLaws, OrderLaws} import org.scalacheck.{Arbitrary, Gen} @@ -15,10 +15,10 @@ import scala.util.Try class XorTests extends CatsSuite { checkAll("Xor[String, Int]", GroupLaws[Xor[String, Int]].monoid) - implicit val iso = MonoidalTests.Isomorphisms.invariant[Xor[String, ?]] + implicit val iso = SemigroupalTests.Isomorphisms.invariant[Xor[String, ?]] - checkAll("Xor[String, Int]", MonoidalTests[Xor[String, ?]].monoidal[Int, Int, Int]) - checkAll("Monoidal[Xor, ?]", SerializableTests.serializable(Monoidal[Xor[String, ?]])) + checkAll("Xor[String, Int]", SemigroupalTests[Xor[String, ?]].semigroupal[Int, Int, Int]) + checkAll("Semigroupal[Xor, ?]", SerializableTests.serializable(Semigroupal[Xor[String, ?]])) checkAll("Xor[String, NonEmptyList[Int]]", GroupLaws[Xor[String, NonEmptyList[Int]]].semigroup)