Laws for commutative versions of applicative functors and monads where order of operations doesn't matter.
import cats.laws._
import cats.laws.discipline._
import cats.CommutativeApplicative
import cats.CommutativeMonadtrait CommutativeApplyLaws[F[_]] extends ApplyLaws[F] {
implicit override def F: CommutativeApply[F]
def commutativeApplyCommutativity[A, B, C](fa: F[A], fb: F[B]): IsEq[F[(A, B)]]
}
object CommutativeApplyLaws {
def apply[F[_]](implicit ev: CommutativeApply[F]): CommutativeApplyLaws[F]
}trait CommutativeApplicativeLaws[F[_]] extends CommutativeApplyLaws[F] with ApplicativeLaws[F] {
implicit override def F: CommutativeApplicative[F]
}
object CommutativeApplicativeLaws {
def apply[F[_]](implicit ev: CommutativeApplicative[F]): CommutativeApplicativeLaws[F]
}trait CommutativeApplicativeTests[F[_]] extends ApplicativeTests[F] {
def laws: CommutativeApplicativeLaws[F]
def commutativeApplicative[A: Arbitrary, B: Arbitrary, C: Arbitrary](implicit
ArbFA: Arbitrary[F[A]],
ArbFB: Arbitrary[F[B]],
ArbFC: Arbitrary[F[C]],
ArbFAtoB: Arbitrary[F[A => B]],
ArbFBtoC: Arbitrary[F[B => C]],
CogenA: Cogen[A],
CogenB: Cogen[B],
CogenC: Cogen[C],
EqFA: Eq[F[A]],
EqFB: Eq[F[B]],
EqFC: Eq[F[C]],
EqFABC: Eq[F[((A, B), C)]],
EqFUnit: Eq[F[Unit]],
iso: Isomorphisms[F]
): RuleSet
}
object CommutativeApplicativeTests {
def apply[F[_]: CommutativeApplicative]: CommutativeApplicativeTests[F]
}trait CommutativeMonadLaws[F[_]] extends CommutativeApplicativeLaws[F] with CommutativeFlatMapLaws[F] with MonadLaws[F] {
implicit override def F: CommutativeMonad[F]
}
object CommutativeMonadLaws {
def apply[F[_]](implicit ev: CommutativeMonad[F]): CommutativeMonadLaws[F]
}trait CommutativeMonadTests[F[_]] extends CommutativeApplicativeTests[F] with MonadTests[F] {
def laws: CommutativeMonadLaws[F]
def commutativeMonad[A: Arbitrary, B: Arbitrary, C: Arbitrary](implicit
ArbFA: Arbitrary[F[A]],
ArbFB: Arbitrary[F[B]],
ArbFC: Arbitrary[F[C]],
ArbFAtoB: Arbitrary[F[A => B]],
ArbFBtoC: Arbitrary[F[B => C]],
CogenA: Cogen[A],
CogenB: Cogen[B],
CogenC: Cogen[C],
EqFA: Eq[F[A]],
EqFB: Eq[F[B]],
EqFC: Eq[F[C]],
EqFABC: Eq[F[((A, B), C)]],
EqFInt: Eq[F[Int]],
iso: Isomorphisms[F]
): RuleSet
}
object CommutativeMonadTests {
def apply[F[_]: CommutativeMonad]: CommutativeMonadTests[F]
}