Laws for testing type class instances in the Cats functional programming library for Scala
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]
}Install with Tessl CLI
npx tessl i tessl/maven-org-typelevel--cats-laws-native0-5-2-13