or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

alternative-laws.mdbifunctor-laws.mdcategory-laws.mdcommutative-laws.mdcomonad-laws.mdcore-laws.mderror-laws.mdindex.mdparallel-laws.mdtesting-utilities.mdtraversal-laws.md
tile.json

commutative-laws.mddocs/

Commutative Laws

Laws for commutative versions of applicative functors and monads where order of operations doesn't matter.

Imports

import cats.laws._
import cats.laws.discipline._
import cats.CommutativeApplicative
import cats.CommutativeMonad

CommutativeApply Laws

trait 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]
}

CommutativeApplicative Laws

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]
}

CommutativeApplicativeTests

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]
}

CommutativeMonad Laws

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]
}

CommutativeMonadTests

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]
}