Comonad

@implicitNotFound("Could not find an instance of Comonad for ${F}") @typeclass trait Comonad[F[_]] extends CoflatMap[F]

Comonad

Comonad

Comonad is the dual of Monad. Whereas Monads allow for the composition of effectful functions, Comonads allow for composition of functions that extract the value from their context.

Must obey the laws defined in cats.laws.ComonadLaws.

Companion
object
trait CoflatMap[F]
trait Functor[F]
trait Invariant[F]
trait Serializable
class Object
trait Matchable
class Any
trait Bimonad[F]

Value members

Abstract methods

def extract[A](x: F[A]): A

extract is the dual of pure on Monad (via Applicative) and extracts the value from its context

extract is the dual of pure on Monad (via Applicative) and extracts the value from its context

Example:

scala> import cats.Id
scala> import cats.Comonad
scala> val id: Id[Int] = 3
scala> Comonad[Id].extract(id)
res0: cats.Id[Int] = 3

Inherited methods

def as[A, B](fa: F[A], b: B): F[B]

Replaces the A value in F[A] with the supplied value.

Replaces the A value in F[A] with the supplied value.

Example:

scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForList

scala> Functor[List].as(List(1,2,3), "hello")
res0: List[String] = List(hello, hello, hello)
Inherited from
Functor
def coflatMap[A, B](fa: F[A])(f: F[A] => B): F[B]

coflatMap is the dual of flatMap on FlatMap. It applies a value in a context to a function that takes a value in a context and returns a normal value.

coflatMap is the dual of flatMap on FlatMap. It applies a value in a context to a function that takes a value in a context and returns a normal value.

Example:

scala> import cats.implicits._
scala> import cats.CoflatMap
scala> val fa = Some(3)
scala> def f(a: Option[Int]): Int = a match {
    | case Some(x) => 2 * x
    | case None => 0 }
scala> CoflatMap[Option].coflatMap(fa)(f)
res0: Option[Int] = Some(6)
Inherited from
CoflatMap
def coflatten[A](fa: F[A]): F[F[A]]

coflatten is the dual of flatten on FlatMap. Whereas flatten removes a layer of F, coflatten adds a layer of F

coflatten is the dual of flatten on FlatMap. Whereas flatten removes a layer of F, coflatten adds a layer of F

Example:

scala> import cats.implicits._
scala> import cats.CoflatMap
scala> val fa = Some(3)
fa: Option[Int] = Some(3)
scala> CoflatMap[Option].coflatten(fa)
res0: Option[Option[Int]] = Some(Some(3))
Inherited from
CoflatMap
def compose[G[_]](`evidence$1`: Functor[G]): Functor[[α] =>> F[G[α]]]
Inherited from
Functor
def compose[G[_]](`evidence$1`: Invariant[G]): Invariant[[α] =>> F[G[α]]]

Compose Invariant F[_] and G[_] then produce Invariant[F[G[_]]] using their imap.

Compose Invariant F[_] and G[_] then produce Invariant[F[G[_]]] using their imap.

Example:

scala> import cats.implicits._
scala> import scala.concurrent.duration._

scala> val durSemigroupList: Semigroup[List[FiniteDuration]] =
    | Invariant[Semigroup].compose[List].imap(Semigroup[List[Long]])(Duration.fromNanos)(_.toNanos)
scala> durSemigroupList.combine(List(2.seconds, 3.seconds), List(4.seconds))
res1: List[FiniteDuration] = List(2 seconds, 3 seconds, 4 seconds)
Inherited from
Invariant
override def composeContravariant[G[_]](`evidence$2`: Contravariant[G]): Contravariant[[α] =>> F[G[α]]]
Definition Classes
Inherited from
Functor
def composeFunctor[G[_]](`evidence$2`: Functor[G]): Invariant[[α] =>> F[G[α]]]

Compose Invariant F[_] and Functor G[_] then produce Invariant[F[G[_]]] using F's imap and G's map.

Compose Invariant F[_] and Functor G[_] then produce Invariant[F[G[_]]] using F's imap and G's map.

Example:

scala> import cats.implicits._
scala> import scala.concurrent.duration._

scala> val durSemigroupList: Semigroup[List[FiniteDuration]] =
    | Invariant[Semigroup]
    |   .composeFunctor[List]
    |   .imap(Semigroup[List[Long]])(Duration.fromNanos)(_.toNanos)
scala> durSemigroupList.combine(List(2.seconds, 3.seconds), List(4.seconds))
res1: List[FiniteDuration] = List(2 seconds, 3 seconds, 4 seconds)
Inherited from
Invariant
final def fmap[A, B](fa: F[A])(f: A => B): F[B]

Alias for map, since map can't be injected as syntax if the implementing type already had a built-in .map method.

Alias for map, since map can't be injected as syntax if the implementing type already had a built-in .map method.

Example:

scala> import cats.implicits._

scala> val m: Map[Int, String] = Map(1 -> "hi", 2 -> "there", 3 -> "you")

scala> m.fmap(_ ++ "!")
res0: Map[Int,String] = Map(1 -> hi!, 2 -> there!, 3 -> you!)
Inherited from
Functor
def fproduct[A, B](fa: F[A])(f: A => B): F[(A, B)]

Tuple the values in fa with the result of applying a function with the value

Tuple the values in fa with the result of applying a function with the value

Example:

scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForOption

scala> Functor[Option].fproduct(Option(42))(_.toString)
res0: Option[(Int, String)] = Some((42,42))
Inherited from
Functor
def fproductLeft[A, B](fa: F[A])(f: A => B): F[(B, A)]

Pair the result of function application with A.

Pair the result of function application with A.

Example:

scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForOption

scala> Functor[Option].fproductLeft(Option(42))(_.toString)
res0: Option[(String, Int)] = Some((42,42))
Inherited from
Functor
@noop
def ifF[A](fb: F[Boolean])(ifTrue: => A, ifFalse: => A): F[A]

Lifts if to Functor

Lifts if to Functor

Example:

scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForList

scala> Functor[List].ifF(List(true, false, false))(1, 0)
res0: List[Int] = List(1, 0, 0)
Inherited from
Functor
override def imap[A, B](fa: F[A])(f: A => B)(g: B => A): F[B]
Definition Classes
Inherited from
Functor
def lift[A, B](f: A => B): F[A] => F[B]

Lift a function f to operate on Functors

Lift a function f to operate on Functors

Example:

scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForOption

scala> val o = Option(42)
scala> Functor[Option].lift((x: Int) => x + 10)(o)
res0: Option[Int] = Some(52)
Inherited from
Functor
def map[A, B](fa: F[A])(f: A => B): F[B]
Inherited from
Functor
def tupleLeft[A, B](fa: F[A], b: B): F[(B, A)]

Tuples the A value in F[A] with the supplied B value, with the B value on the left.

Tuples the A value in F[A] with the supplied B value, with the B value on the left.

Example:

scala> import scala.collection.immutable.Queue
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForQueue

scala> Functor[Queue].tupleLeft(Queue("hello", "world"), 42)
res0: scala.collection.immutable.Queue[(Int, String)] = Queue((42,hello), (42,world))
Inherited from
Functor
def tupleRight[A, B](fa: F[A], b: B): F[(A, B)]

Tuples the A value in F[A] with the supplied B value, with the B value on the right.

Tuples the A value in F[A] with the supplied B value, with the B value on the right.

Example:

scala> import scala.collection.immutable.Queue
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForQueue

scala> Functor[Queue].tupleRight(Queue("hello", "world"), 42)
res0: scala.collection.immutable.Queue[(String, Int)] = Queue((hello,42), (world,42))
Inherited from
Functor
@noop
def unzip[A, B](fab: F[(A, B)]): (F[A], F[B])

Un-zips an F[(A, B)] consisting of element pairs or Tuple2 into two separate F's tupled.

Un-zips an F[(A, B)] consisting of element pairs or Tuple2 into two separate F's tupled.

NOTE: Check for effect duplication, possibly memoize before

scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForList

scala> Functor[List].unzip(List((1,2), (3, 4)))
res0: (List[Int], List[Int]) = (List(1, 3),List(2, 4))
Inherited from
Functor
def void[A](fa: F[A]): F[Unit]

Empty the fa of the values, preserving the structure

Empty the fa of the values, preserving the structure

Example:

scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForList

scala> Functor[List].void(List(1,2,3))
res0: List[Unit] = List((), (), ())
Inherited from
Functor
def widen[A, B >: A](fa: F[A]): F[B]

Lifts natural subtyping covariance of covariant Functors.

Lifts natural subtyping covariance of covariant Functors.

NOTE: In certain (perhaps contrived) situations that rely on universal equality this can result in a ClassCastException, because it is implemented as a type cast. It could be implemented as map(identity), but according to the functor laws, that should be equal to fa, and a type cast is often much more performant. See this example of widen creating a ClassCastException.

Example:

scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForOption

scala> val s = Some(42)
scala> Functor[Option].widen(s)
res0: Option[Int] = Some(42)
Inherited from
Functor