Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Compose/Category.algebraK for endomorphic SemigroupK/MonoidK #1496

Merged
merged 1 commit into from
Dec 22, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 3 additions & 15 deletions core/src/main/scala/cats/data/Cokleisli.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cats
package data

import cats.arrow.{Arrow, Split}
import cats.arrow.{Arrow, Category, Compose, Split}
import cats.functor.{Contravariant, Profunctor}
import cats.{CoflatMap, Comonad, Functor, Monad}
import scala.annotation.tailrec
Expand Down Expand Up @@ -70,7 +70,7 @@ private[data] sealed abstract class CokleisliInstances extends CokleisliInstance
}

implicit def catsDataMonoidKForCokleisli[F[_]](implicit ev: Comonad[F]): MonoidK[λ[α => Cokleisli[F, α, α]]] =
new CokleisliMonoidK[F] { def F: Comonad[F] = ev }
Category[Cokleisli[F, ?, ?]].algebraK
}

private[data] sealed abstract class CokleisliInstances0 {
Expand All @@ -81,7 +81,7 @@ private[data] sealed abstract class CokleisliInstances0 {
new CokleisliProfunctor[F] { def F: Functor[F] = ev }

implicit def catsDataSemigroupKForCokleisli[F[_]](implicit ev: CoflatMap[F]): SemigroupK[λ[α => Cokleisli[F, α, α]]] =
new CokleisliSemigroupK[F] { def F: CoflatMap[F] = ev }
Compose[Cokleisli[F, ?, ?]].algebraK

implicit def catsDataContravariantForCokleisli[F[_]: Functor, A]: Contravariant[Cokleisli[F, ?, A]] =
new Contravariant[Cokleisli[F, ?, A]] {
Expand Down Expand Up @@ -133,15 +133,3 @@ private trait CokleisliProfunctor[F[_]] extends Profunctor[Cokleisli[F, ?, ?]] {
override def rmap[A, B, C](fab: Cokleisli[F, A, B])(f: B => C): Cokleisli[F, A, C] =
fab.map(f)
}

private trait CokleisliSemigroupK[F[_]] extends SemigroupK[λ[α => Cokleisli[F, α, α]]] {
implicit def F: CoflatMap[F]

def combineK[A](a: Cokleisli[F, A, A], b: Cokleisli[F, A, A]): Cokleisli[F, A, A] = a compose b
}

private trait CokleisliMonoidK[F[_]] extends MonoidK[λ[α => Cokleisli[F, α, α]]] with CokleisliSemigroupK[F] {
implicit def F: Comonad[F]

def empty[A]: Cokleisli[F, A, A] = Cokleisli(F.extract[A])
}
49 changes: 17 additions & 32 deletions core/src/main/scala/cats/data/Kleisli.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cats
package data

import cats.arrow.{Arrow, Choice, Split, FunctionK}
import cats.arrow.{Arrow, Category, Choice, Compose, Split, FunctionK}
import cats.functor.{Contravariant, Strong}

/**
Expand Down Expand Up @@ -86,7 +86,7 @@ private[data] sealed abstract class KleisliInstances extends KleisliInstances0 {
new KleisliMonoid[F, A, B] { def FB: Monoid[F[B]] = M }

implicit def catsDataMonoidKForKleisli[F[_]](implicit M: Monad[F]): MonoidK[λ[α => Kleisli[F, α, α]]] =
new KleisliMonoidK[F] { def F: Monad[F] = M }
Category[Kleisli[F, ?, ?]].algebraK

implicit val catsDataMonoidKForKleisliId: MonoidK[λ[α => Kleisli[Id, α, α]]] =
catsDataMonoidKForKleisli[Id]
Expand All @@ -97,20 +97,6 @@ private[data] sealed abstract class KleisliInstances extends KleisliInstances0 {
implicit val catsDataArrowForKleisliId: Arrow[Kleisli[Id, ?, ?]] =
catsDataArrowForKleisli[Id]

implicit def catsDataChoiceForKleisli[F[_]](implicit ev: Monad[F]): Choice[Kleisli[F, ?, ?]] =
new Choice[Kleisli[F, ?, ?]] {
def id[A]: Kleisli[F, A, A] = Kleisli(ev.pure)

def choice[A, B, C](f: Kleisli[F, A, C], g: Kleisli[F, B, C]): Kleisli[F, Either[A, B], C] =
Kleisli(_.fold(f.run, g.run))

def compose[A, B, C](f: Kleisli[F, B, C], g: Kleisli[F, A, B]): Kleisli[F, A, C] =
f.compose(g)
}

implicit val catsDataChoiceForKleisliId: Choice[Kleisli[Id, ?, ?]] =
catsDataChoiceForKleisli[Id]

implicit def catsDataMonadReaderForKleisliId[A]: MonadReader[Kleisli[Id, A, ?], A] =
catsDataMonadReaderForKleisli[Id, A]

Expand All @@ -132,6 +118,20 @@ private[data] sealed abstract class KleisliInstances extends KleisliInstances0 {
}

private[data] sealed abstract class KleisliInstances0 extends KleisliInstances1 {
implicit def catsDataChoiceForKleisli[F[_]](implicit ev: Monad[F]): Choice[Kleisli[F, ?, ?]] =
new Choice[Kleisli[F, ?, ?]] {
def id[A]: Kleisli[F, A, A] = Kleisli(ev.pure)

def choice[A, B, C](f: Kleisli[F, A, C], g: Kleisli[F, B, C]): Kleisli[F, Either[A, B], C] =
Kleisli(_.fold(f.run, g.run))

def compose[A, B, C](f: Kleisli[F, B, C], g: Kleisli[F, A, B]): Kleisli[F, A, C] =
f.compose(g)
}

implicit val catsDataChoiceForKleisliId: Choice[Kleisli[Id, ?, ?]] =
catsDataChoiceForKleisli[Id]

implicit def catsDataSplitForKleisli[F[_]](implicit ev: FlatMap[F]): Split[Kleisli[F, ?, ?]] =
new KleisliSplit[F] { def F: FlatMap[F] = ev }

Expand All @@ -153,8 +153,7 @@ private[data] sealed abstract class KleisliInstances0 extends KleisliInstances1
new KleisliSemigroup[F, A, B] { def FB: Semigroup[F[B]] = M }

implicit def catsDataSemigroupKForKleisli[F[_]](implicit ev: FlatMap[F]): SemigroupK[λ[α => Kleisli[F, α, α]]] =
new KleisliSemigroupK[F] { def F: FlatMap[F] = ev }

Compose[Kleisli[F, ?, ?]].algebraK
}

private[data] sealed abstract class KleisliInstances1 extends KleisliInstances2 {
Expand Down Expand Up @@ -261,19 +260,6 @@ private trait KleisliMonoid[F[_], A, B] extends Monoid[Kleisli[F, A, B]] with Kl
override def empty: Kleisli[F, A, B] = Kleisli[F, A, B](a => FB.empty)
}

private trait KleisliSemigroupK[F[_]] extends SemigroupK[λ[α => Kleisli[F, α, α]]] {
implicit def F: FlatMap[F]

override def combineK[A](a: Kleisli[F, A, A], b: Kleisli[F, A, A]): Kleisli[F, A, A] = a compose b
}

private trait KleisliMonoidK[F[_]] extends MonoidK[λ[α => Kleisli[F, α, α]]] with KleisliSemigroupK[F] {
implicit def F: Monad[F]

override def empty[A]: Kleisli[F, A, A] = Kleisli(F.pure[A])
}


private trait KleisliApplicativeError[F[_], A, E] extends KleisliApplicative[F, A] with ApplicativeError[Kleisli[F, A, ?], E] {
type K[T] = Kleisli[F, A, T]

Expand All @@ -289,7 +275,6 @@ private trait KleisliApplicativeError[F[_], A, E] extends KleisliApplicative[F,

}


private trait KleisliApplicative[F[_], A] extends Applicative[Kleisli[F, A, ?]] {
implicit def F: Applicative[F]

Expand Down
7 changes: 2 additions & 5 deletions core/src/main/scala/cats/instances/function.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cats
package instances

import cats.arrow.{Arrow, Choice}
import cats.arrow.{Arrow, Category, Choice}
import cats.functor.Contravariant
import annotation.tailrec

Expand Down Expand Up @@ -90,8 +90,5 @@ private[instances] sealed trait Function1Instances {
}

implicit val catsStdMonoidKForFunction1: MonoidK[λ[α => Function1[α, α]]] =
new MonoidK[λ[α => Function1[α, α]]] {
def empty[A]: A => A = identity[A]
def combineK[A](x: A => A, y: A => A): A => A = x compose y
}
Category[Function1].algebraK
}