From 5b228b38e686159686e640de6614cda6072205bd Mon Sep 17 00:00:00 2001 From: danicheg Date: Mon, 26 Aug 2024 08:49:52 +0000 Subject: [PATCH] deploy: 4e976f97bba875419854c4ad4e3f87630b7d362c --- 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 0c2129ed36..976d395804 100644 --- a/datatypes/contt.html +++ b/datatypes/contt.html @@ -286,7 +286,7 @@

ContT

Succeeded(user.id) } } -// eval: Eval[UserUpdateResult] = cats.Later@17a242b8 +// eval: Eval[UserUpdateResult] = cats.Later@30bc485b

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$11634/0x00007fc13ffd2908@128c0bb2, +// f = cats.data.ContT$$Lambda$14346/0x00007f8030665158@1e6394fd, // index = 0 // ) // ) @@ -319,7 +319,7 @@

Succeeded(userFields("id").toInt) } } -// anotherEval: Eval[UserUpdateResult] = cats.Eval$$anon$5@3918cda0 +// anotherEval: Eval[UserUpdateResult] = cats.Eval$$anon$5@387fbe04 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$11634/0x00007fc13ffd2908@22c5045b, +// f = cats.data.ContT$$Lambda$14346/0x00007f8030665158@17998bd3, // index = 0 // ) // ) @@ -370,7 +370,7 @@

updateUserModel flatMap persistToDb flatMap publishEvent // chainOfContinuations: ContT[Eval, UserUpdateResult, UserUpdateResult] = FromFn( // runAndThen = Single( -// f = cats.data.ContT$$Lambda$11638/0x00007fc13ffd3290@719b293a, +// f = cats.data.ContT$$Lambda$14350/0x00007f8030665ae0@c632f45, // index = 0 // ) // ) @@ -381,7 +381,7 @@

finalResult } } -// eval: Eval[UserUpdateResult] = cats.Eval$$anon$5@2051fca2 +// eval: Eval[UserUpdateResult] = cats.Eval$$anon$5@7838d37d eval.value // Updated user model diff --git a/datatypes/eval.html b/datatypes/eval.html index a2c50ab1ba..0aecfefc5b 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@26df33cb +// lazyEval: Eval[Int] = cats.Later@263853e lazyEval.value // Running expensive calculation... @@ -276,7 +276,7 @@

println("Running expensive calculation...") 1 + 2 * 3 } -// always: Eval[Int] = cats.Always@5274e805 +// always: Eval[Int] = cats.Always@76ecda75 always.value // Running expensive calculation... diff --git a/datatypes/freeapplicative.html b/datatypes/freeapplicative.html index 9a121b5872..3325f822a1 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$11796/0x00007fc13fd3a880@5c6f5d91
+// validator: FromString[Boolean] = cats.instances.Function1Instances$$anon$7$$Lambda$14508/0x00007f80306e71d0@7547705c
 validator("1234")
 // res0: Boolean = false
 validator("12345")
diff --git a/datatypes/freemonad.html b/datatypes/freemonad.html
index 05020e34b9..d7707fd6c2 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@31004a3 +// state: TeletypeState[Unit] = cats.data.IndexedStateT@2b351dd3 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 b8137082ed..8d336bba8a 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@78e9f426

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

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@45bdc9de

+// res6: Eval[(Open.type, Unit)] = cats.Eval$$anon$1@13adbdd1 diff --git a/typeclasses/bifoldable.html b/typeclasses/bifoldable.html index 3fd905653a..d38a0a984f 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@1ae1c791 +// right: Eval[String] = cats.Eval$$anon$1@23b7e4e 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@35346cd2 +// reversedRight: Eval[String] = cats.Eval$$anon$1@1ab3d73a reversedRight.value === expected // res4: Boolean = false diff --git a/typeclasses/bifunctor.html b/typeclasses/bifunctor.html index 88f3481d33..389ea2cd6b 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 = 1724661263L) +// res0: Either[DomainError, Long] = Right(value = 1724662164L)

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 bacd05442e..9226edd635 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@46ba1853 +// nelBimonad: Bimonad[NonEmptyList] = repl.MdocSession$MdocApp$$anon$1@618c5ad8

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 b910ca76c8..0209c8e317 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$12586/0x00007fc140294478@18716f97 +// showSalary: Show[Salary] = cats.Show$$anon$2$$Lambda$15298/0x00007f8030998978@55f67546 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@7d2aaa3a +// moneyOrdering: Ordering[Money] = scala.math.Ordering$$anon$5@4dd6721b 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@31179833 +// b: B = repl.MdocSession$MdocApp$B@16dfa8e1 val a: A = b -// a: A = repl.MdocSession$MdocApp$B@31179833 +// a: A = repl.MdocSession$MdocApp$B@16dfa8e1 val showA: Show[A] = Show.show(a => "a!") -// showA: Show[A] = cats.Show$$$Lambda$12585/0x00007fc140294000@1215c04 +// showA: Show[A] = cats.Show$$$Lambda$15297/0x00007f8030998500@2fe48c39 val showB1: Show[B] = showA.contramap(b => b: A) -// showB1: Show[B] = cats.Show$$anon$2$$Lambda$12586/0x00007fc140294478@1298af23 +// showB1: Show[B] = cats.Show$$anon$2$$Lambda$15298/0x00007f8030998978@56a164bb val showB2: Show[B] = showA.contramap(identity[A]) -// showB2: Show[B] = cats.Show$$anon$2$$Lambda$12586/0x00007fc140294478@29145832 +// showB2: Show[B] = cats.Show$$anon$2$$Lambda$15298/0x00007f8030998978@47211530 val showB3: Show[B] = Contravariant[Show].narrow[A, B](showA) -// showB3: Show[B] = cats.Show$$$Lambda$12585/0x00007fc140294000@1215c04 +// showB3: Show[B] = cats.Show$$$Lambda$15297/0x00007f8030998500@2fe48c39

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 c46345b0f8..24ac4b01ff 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@38fa382c +// eqFoo: Eq[Foo] = cats.kernel.Eq$$anonfun$fromUniversalEquals$2@7f57d2b0 Foo(10, "") === Foo(10, "") diff --git a/typeclasses/semigroup.html b/typeclasses/semigroup.html index 4694e7333d..55ca70498d 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@192c54d7
+// res8: Semigroup[Int] = cats.kernel.instances.IntGroup@71409384
 Semigroup[String]
-// res9: Semigroup[String] = cats.kernel.instances.StringMonoid@129b0d01
+// res9: Semigroup[String] = cats.kernel.instances.StringMonoid@370dde10

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@4861a287
+// res10: Semigroup[List[Byte]] = cats.kernel.instances.ListMonoid@20e509e6
 Semigroup[Set[Int]]
-// res11: Semigroup[Set[Int]] = cats.kernel.instances.SetSemilattice@38576f30
+// res11: Semigroup[Set[Int]] = cats.kernel.instances.SetSemilattice@841130
 
 trait Foo
 Semigroup[List[Foo]]
-// res12: Semigroup[List[Foo]] = cats.kernel.instances.ListMonoid@4861a287
+// res12: Semigroup[List[Foo]] = cats.kernel.instances.ListMonoid@20e509e6

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@43260e01
+// res13: Semigroup[(List[Foo], Int)] = cats.kernel.Monoid$$anon$2@752d7e17

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 60c04dd3fe..b8bd687b3b 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@19507e3c"
+// res0: String = "repl.MdocSession$MdocApp$$anon$1@26abd3a3"

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$12585/0x00007fc140294000@f838fc1 +// showPerson: Show[Person] = cats.Show$$$Lambda$15297/0x00007f8030998500@520de094 case class Department(id: Int, name: String) implicit val showDep: Show[Department] = Show.fromToString -// showDep: Show[Department] = cats.Show$$$Lambda$11629/0x00007fc13ff979b8@6d448ac9 +// showDep: Show[Department] = cats.Show$$$Lambda$14341/0x00007f803062e4a8@5280fce7

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.