Skip to content

Commit

Permalink
add Functor[TheseT]
Browse files Browse the repository at this point in the history
(cherry picked from commit d3efbe9)
  • Loading branch information
xuwei-k committed Apr 5, 2017
1 parent 1eb7dc1 commit 5bf9082
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
19 changes: 16 additions & 3 deletions core/src/main/scala/scalaz/TheseT.scala
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ final case class TheseT[F[_], A, B](run: F[A \&/ B]) {

sealed abstract class TheseTInstances1 {
implicit def TheseTInstance1[F[_]: Traverse, L]: Traverse[TheseT[F, L, ?]]
= new Traverse[TheseT[F, L, ?]] {
= new Traverse[TheseT[F, L, ?]] with TheseTFunctor[F, L] {
override def F = implicitly
override def traverseImpl[G[_], A, B](fa: TheseT[F, L, A])(f: (A) => G[B])(implicit A: Applicative[G]) =
fa.traverse(f)

Expand All @@ -111,7 +112,8 @@ sealed abstract class TheseTInstances1 {

sealed abstract class TheseTInstances0 extends TheseTInstances1 {
implicit def theseTMonad[F[_]: Monad, L: Semigroup]: Monad[TheseT[F, L, ?]]
= new Monad[TheseT[F, L, ?]] {
= new Monad[TheseT[F, L, ?]] with TheseTFunctor[F, L] {
override def F = implicitly

override def bind[A, B](fa: TheseT[F, L, A])(f: (A) => TheseT[F, L, B]) = fa.flatMap(f)

Expand All @@ -132,7 +134,12 @@ sealed abstract class TheseTInstances0 extends TheseTInstances1 {
F0.contramap((_: TheseT[F, A, B]).run)

}
sealed abstract class TheseTInstances extends TheseTInstances0
sealed abstract class TheseTInstances extends TheseTInstances0 {
implicit def theseTFunctor[F[_]: Functor, L]: Functor[TheseT[F, L, ?]] =
new TheseTFunctor[F, L] {
override def F = implicitly
}
}

object TheseT extends TheseTInstances {
def theseT[F[_], A, B](a: F[A \&/ B]): TheseT[F, A, B] = TheseT(a)
Expand All @@ -143,3 +150,9 @@ object TheseT extends TheseTInstances {

}

private trait TheseTFunctor[F[_], L] extends Functor[TheseT[F, L, ?]] {
protected implicit def F: Functor[F]

override final def map[A, B](fa: TheseT[F, L, A])(f: A => B) =
fa map f
}
7 changes: 7 additions & 0 deletions tests/src/test/scala/scalaz/TheseTTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,11 @@ object TheseTTest extends SpecLite {
checkAll(traverse.laws[TheseTListInt])
checkAll(bitraverse.laws[TheseTList])

object instances {
def functor[F[_]: Functor, L] = Functor[TheseT[F, L, ?]]

// checking absence of ambiguity
def functor[F[_]: Traverse, L] = Functor[TheseT[F, L, ?]]
def functor[F[_]: Monad, L: Semigroup] = Functor[TheseT[F, L, ?]]
}
}

0 comments on commit 5bf9082

Please sign in to comment.