From 320e60ed8efc9bde5ab90876fdc34f346dce5b8c Mon Sep 17 00:00:00 2001 From: satorg Date: Wed, 29 Jan 2025 19:43:55 +0000 Subject: [PATCH] deploy: f5549aa4a865027922e78320cc201e0c3351d59a --- datatypes/contt.html | 12 ++++++------ datatypes/eval.html | 4 ++-- datatypes/freeapplicative.html | 2 +- datatypes/freemonad.html | 4 ++-- datatypes/state.html | 4 ++-- typeclasses/bifoldable.html | 4 ++-- typeclasses/bifunctor.html | 2 +- typeclasses/bimonad.html | 2 +- typeclasses/contravariant.html | 16 ++++++++-------- typeclasses/eq.html | 2 +- typeclasses/semigroup.html | 12 ++++++------ typeclasses/show.html | 6 +++--- 12 files changed, 35 insertions(+), 35 deletions(-) diff --git a/datatypes/contt.html b/datatypes/contt.html index 8de1bc2c61..868906edc2 100644 --- a/datatypes/contt.html +++ b/datatypes/contt.html @@ -286,7 +286,7 @@

ContT

Succeeded(user.id) } } -// eval: Eval[UserUpdateResult] = cats.Later@efa3e45 +// eval: Eval[UserUpdateResult] = cats.Later@4834a712

Finally we can run the resulting Eval to actually execute the computation:

eval.value
 // Persisting updated user to the DB: User(100,Bob,150)
@@ -308,7 +308,7 @@ 

// anotherComputation: ContT[Eval, UserUpdateResult, Map[String, String]] = FromFn( // runAndThen = Single( -// f = cats.data.ContT$$Lambda$11783/0x00007fb69600a298@257923f4, +// f = cats.data.ContT$$Lambda$11612/0x00007f0ceffd2298@10a3bdb7, // index = 0 // ) // ) @@ -319,7 +319,7 @@

Succeeded(userFields("id").toInt) } } -// anotherEval: Eval[UserUpdateResult] = cats.Eval$$anon$5@31942c14 +// anotherEval: Eval[UserUpdateResult] = cats.Eval$$anon$5@2f42687a anotherEval.value // Persisting these fields to the DB: Map(id -> 100, name -> Bob, age -> 150) @@ -336,7 +336,7 @@

// updateUserModel: ContT[Eval, UserUpdateResult, User] = FromFn( // runAndThen = Single( -// f = cats.data.ContT$$Lambda$11783/0x00007fb69600a298@6ed4d7a1, +// f = cats.data.ContT$$Lambda$11612/0x00007f0ceffd2298@432a03b8, // index = 0 // ) // ) @@ -370,7 +370,7 @@

updateUserModel flatMap persistToDb flatMap publishEvent // chainOfContinuations: ContT[Eval, UserUpdateResult, UserUpdateResult] = FromFn( // runAndThen = Single( -// f = cats.data.ContT$$Lambda$11787/0x00007fb69600ac20@639d7465, +// f = cats.data.ContT$$Lambda$11616/0x00007f0ceffd2c20@1a57a65c, // index = 0 // ) // ) @@ -381,7 +381,7 @@

finalResult } } -// eval: Eval[UserUpdateResult] = cats.Eval$$anon$5@376cdc98 +// eval: Eval[UserUpdateResult] = cats.Eval$$anon$5@7202885e eval.value // Updated user model diff --git a/datatypes/eval.html b/datatypes/eval.html index 97697f4c84..f6983dac96 100644 --- a/datatypes/eval.html +++ b/datatypes/eval.html @@ -257,7 +257,7 @@

println("Running expensive calculation...") 1 + 2 * 3 } -// lazyEval: Eval[Int] = cats.Later@a5e4e47 +// lazyEval: Eval[Int] = cats.Later@734c6604 lazyEval.value // Running expensive calculation... @@ -276,7 +276,7 @@

println("Running expensive calculation...") 1 + 2 * 3 } -// always: Eval[Int] = cats.Always@7ed93de5 +// always: Eval[Int] = cats.Always@732f1ae always.value // Running expensive calculation... diff --git a/datatypes/freeapplicative.html b/datatypes/freeapplicative.html index 2091bb52cf..b864199112 100644 --- a/datatypes/freeapplicative.html +++ b/datatypes/freeapplicative.html @@ -275,7 +275,7 @@

val validator = prog.foldMap[FromString](compiler)
-// validator: FromString[Boolean] = cats.instances.Function1Instances$$anon$7$$Lambda$11954/0x00007fb69586a0e8@1389adae
+// validator: FromString[Boolean] = cats.instances.Function1Instances$$anon$7$$Lambda$11783/0x00007f0cef7a0000@6f1b8ea8
 validator("1234")
 // res0: Boolean = false
 validator("12345")
diff --git a/datatypes/freemonad.html b/datatypes/freemonad.html
index 86fd2bf8bc..9ead491c3e 100644
--- a/datatypes/freemonad.html
+++ b/datatypes/freemonad.html
@@ -718,7 +718,7 @@ 

import TeletypeOps._ val state = program.foldMap(interpreter) -// state: TeletypeState[Unit] = cats.data.IndexedStateT@23d1ac94 +// state: TeletypeState[Unit] = cats.data.IndexedStateT@fa22cdb val initialState = Nil // initialState: Nil.type = List() val (stored, _) = state.run(initialState).value @@ -789,7 +789,7 @@

val evaluated = hoisted.foldMap(tryInterpreter) // evaluated: OptTry[Int] = OptionT(value = Success(value = Some(value = 12))) diff --git a/datatypes/state.html b/datatypes/state.html index e689a53f6d..503b02d43f 100644 --- a/datatypes/state.html +++ b/datatypes/state.html @@ -474,7 +474,7 @@

_ <- close _ <- open } yield () -// valid: IndexedStateT[Eval, Closed.type, Open.type, Unit] = cats.data.IndexedStateT@7608f30c

+// valid: IndexedStateT[Eval, Closed.type, Open.type, Unit] = cats.data.IndexedStateT@48631b81

Note that the inferred type of valid correctly models that this computation can be executed only with an initial Closed state.

valid.run(Open)
 // error: type mismatch;
@@ -483,7 +483,7 @@ 

valid.run(Closed) -// res6: Eval[(Open.type, Unit)] = cats.Eval$$anon$1@36773e65

+// res6: Eval[(Open.type, Unit)] = cats.Eval$$anon$1@5532741b diff --git a/typeclasses/bifoldable.html b/typeclasses/bifoldable.html index 73f0fb1c03..90272ac0b3 100644 --- a/typeclasses/bifoldable.html +++ b/typeclasses/bifoldable.html @@ -338,7 +338,7 @@

s, acc) => acc.map(_ |+| s), (s, acc) => acc.map(_ |+| s) ) -// right: Eval[String] = cats.Eval$$anon$1@986cb84 +// right: Eval[String] = cats.Eval$$anon$1@61dc1073 left === expected // res2: Boolean = true @@ -354,7 +354,7 @@

s, acc) => acc.map(_ |+| s), (s, acc) => acc.map(_ |+| s) ) -// reversedRight: Eval[String] = cats.Eval$$anon$1@1f96ee38 +// reversedRight: Eval[String] = cats.Eval$$anon$1@4c879eba reversedRight.value === expected // res4: Boolean = false diff --git a/typeclasses/bifunctor.html b/typeclasses/bifunctor.html index 30a0decd4e..82d40e96cb 100644 --- a/typeclasses/bifunctor.html +++ b/typeclasses/bifunctor.html @@ -246,7 +246,7 @@

error => DomainError(error.getMessage), dateTime => dateTime.toEpochSecond ) -// res0: Either[DomainError, Long] = Right(value = 1737837505L) +// res0: Either[DomainError, Long] = Right(value = 1738179807L)

Bifunctor also defines a convenience function called leftMap, which is defined as follows:

def leftMap[A, B, C](fab: F[A, B])(f: A => C): F[C, B] = bimap(fab)(f, identity)

There is no rightMap however - use map instead. The reasoning behind this is that in Cats, the instances of diff --git a/typeclasses/bimonad.html b/typeclasses/bimonad.html index b1180805dd..abe573f790 100644 --- a/typeclasses/bimonad.html +++ b/typeclasses/bimonad.html @@ -263,7 +263,7 @@

override def tailRecM[A, B](a: A)(fn: A => NonEmptyList[Either[A, B]]): NonEmptyList[B] = ??? } -// nelBimonad: Bimonad[NonEmptyList] = repl.MdocSession$MdocApp$$anon$1@77cf1cba +// nelBimonad: Bimonad[NonEmptyList] = repl.MdocSession$MdocApp$$anon$1@472d57cc

Note the equivalence:

nelBimonad.pure(true).extract === NonEmptyList.one(true).head
 // res0: Boolean = true
diff --git a/typeclasses/contravariant.html b/typeclasses/contravariant.html index db815a6b2e..2d7f20a63d 100644 --- a/typeclasses/contravariant.html +++ b/typeclasses/contravariant.html @@ -246,7 +246,7 @@

implicit val showSalary: Show[Salary] = showMoney.contramap(_.size) -// showSalary: Show[Salary] = cats.Show$$anon$2$$Lambda$12766/0x00007fb6962e76b8@7e5212a7 +// showSalary: Show[Salary] = cats.Show$$anon$2$$Lambda$12595/0x00007f0cf02b70b0@2f97b692 Salary(Money(1000)).show // res0: String = "$1000" @@ -266,7 +266,7 @@

import scala.math.Ordered._ implicit val moneyOrdering: Ordering[Money] = Ordering.by(_.amount) -// moneyOrdering: Ordering[Money] = scala.math.Ordering$$anon$5@293b5584 +// moneyOrdering: Ordering[Money] = scala.math.Ordering$$anon$5@6fe85743 Money(100) < Money(200) // res3: Boolean = true @@ -276,17 +276,17 @@

class A class B extends A val b: B = new B -// b: B = repl.MdocSession$MdocApp$B@2628c9f2 +// b: B = repl.MdocSession$MdocApp$B@60316712 val a: A = b -// a: A = repl.MdocSession$MdocApp$B@2628c9f2 +// a: A = repl.MdocSession$MdocApp$B@60316712 val showA: Show[A] = Show.show(a => "a!") -// showA: Show[A] = cats.Show$$$Lambda$12765/0x00007fb6962e7240@72fc0499 +// showA: Show[A] = cats.Show$$$Lambda$12594/0x00007f0cf02b6c38@352f9666 val showB1: Show[B] = showA.contramap(b => b: A) -// showB1: Show[B] = cats.Show$$anon$2$$Lambda$12766/0x00007fb6962e76b8@4d7623ad +// showB1: Show[B] = cats.Show$$anon$2$$Lambda$12595/0x00007f0cf02b70b0@269b6c5d val showB2: Show[B] = showA.contramap(identity[A]) -// showB2: Show[B] = cats.Show$$anon$2$$Lambda$12766/0x00007fb6962e76b8@71fac13d +// showB2: Show[B] = cats.Show$$anon$2$$Lambda$12595/0x00007f0cf02b70b0@7a155ae2 val showB3: Show[B] = Contravariant[Show].narrow[A, B](showA) -// showB3: Show[B] = cats.Show$$$Lambda$12765/0x00007fb6962e7240@72fc0499 +// showB3: Show[B] = cats.Show$$$Lambda$12594/0x00007f0cf02b6c38@352f9666

Subtyping relationships are "lifted backwards" by contravariant functors, such that if F is a lawful contravariant functor and B <: A then F[A] <: F[B], which is expressed by Contravariant.narrow.

diff --git a/typeclasses/eq.html b/typeclasses/eq.html index a1fe43ed0e..d00f1f51c2 100644 --- a/typeclasses/eq.html +++ b/typeclasses/eq.html @@ -257,7 +257,7 @@

Eq

implicit val eqFoo: Eq[Foo] = Eq.fromUniversalEquals -// eqFoo: Eq[Foo] = cats.kernel.Eq$$anonfun$fromUniversalEquals$2@13eacfd2 +// eqFoo: Eq[Foo] = cats.kernel.Eq$$anonfun$fromUniversalEquals$2@479826f0 Foo(10, "") === Foo(10, "") diff --git a/typeclasses/semigroup.html b/typeclasses/semigroup.html index f29d322d65..af16b4376c 100644 --- a/typeclasses/semigroup.html +++ b/typeclasses/semigroup.html @@ -269,23 +269,23 @@

import cats.Semigroup import cats.syntax.all._
Semigroup[Int]
-// res8: Semigroup[Int] = cats.kernel.instances.IntGroup@170dc252
+// res8: Semigroup[Int] = cats.kernel.instances.IntGroup@29a8b011
 Semigroup[String]
-// res9: Semigroup[String] = cats.kernel.instances.StringMonoid@6f94317f
+// res9: Semigroup[String] = cats.kernel.instances.StringMonoid@310c8923

Instances for type constructors regardless of their type parameter such as List (++) and Set (union)...

Semigroup[List[Byte]]
-// res10: Semigroup[List[Byte]] = cats.kernel.instances.ListMonoid@46ce1d0b
+// res10: Semigroup[List[Byte]] = cats.kernel.instances.ListMonoid@7855d203
 Semigroup[Set[Int]]
-// res11: Semigroup[Set[Int]] = cats.kernel.instances.SetSemilattice@43a7ce2a
+// res11: Semigroup[Set[Int]] = cats.kernel.instances.SetSemilattice@135c0d64
 
 trait Foo
 Semigroup[List[Foo]]
-// res12: Semigroup[List[Foo]] = cats.kernel.instances.ListMonoid@46ce1d0b
+// res12: Semigroup[List[Foo]] = cats.kernel.instances.ListMonoid@7855d203

And instances for type constructors that depend on (one of) their type parameters having instances such as tuples (pointwise combine).

Semigroup[(List[Foo], Int)]
-// res13: Semigroup[(List[Foo], Int)] = cats.kernel.Monoid$$anon$2@3ac19b5e
+// res13: Semigroup[(List[Foo], Int)] = cats.kernel.Monoid$$anon$2@7f181f26

Example usage: Merging maps

Consider a function that merges two Maps that combines values if they share diff --git a/typeclasses/show.html b/typeclasses/show.html index b6800b97cd..f8670a6229 100644 --- a/typeclasses/show.html +++ b/typeclasses/show.html @@ -229,7 +229,7 @@

Show

Most often, this is unwanted behaviour, as the standard implementation of toString on non case classes is mostly gibberish. Consider the following example:

(new {}).toString
-// res0: String = "repl.MdocSession$MdocApp$$anon$1@4de1aaa1"
+// res0: String = "repl.MdocSession$MdocApp$$anon$1@55b5aef0"

The fact that this code compiles is a design flaw of the Java API. We want to make things like this impossible, by offering the toString equivalent as a type class, instead of the root of the class hierarchy. In short, Show allows us to only have String-conversions defined for the data types we actually want.

@@ -245,12 +245,12 @@

Show

case class Person(name: String, age: Int) implicit val showPerson: Show[Person] = Show.show(person => person.name) -// showPerson: Show[Person] = cats.Show$$$Lambda$12765/0x00007fb6962e7240@1fd72fd +// showPerson: Show[Person] = cats.Show$$$Lambda$12594/0x00007f0cf02b6c38@21678c71 case class Department(id: Int, name: String) implicit val showDep: Show[Department] = Show.fromToString -// showDep: Show[Department] = cats.Show$$$Lambda$11778/0x00007fb695fd32a8@39a1a1b7 +// showDep: Show[Department] = cats.Show$$$Lambda$11607/0x00007f0ceff9b2a8@21edfaac

This still may not seem useful to you, because case classes already automatically implement toString, while show would have to be implemented manually for each case class. Thankfully with the help of a small library called kittens a lot of type class instances including Show can be derived automatically!

Cats also offers Show syntax to make working with it easier.