Skip to content

Commit

Permalink
Merge pull request #15 from denisrosca/master
Browse files Browse the repository at this point in the history
Migrate to cats 1.0.0-RC1
  • Loading branch information
kailuowang authored Nov 7, 2017
2 parents 83f82d0 + e182c8a commit 64e2577
Show file tree
Hide file tree
Showing 41 changed files with 119 additions and 68 deletions.
55 changes: 41 additions & 14 deletions core/src/main/scala/cats/mtl/instances/empty.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ package instances

import cats.data.{Const, EitherT, Nested, OptionT}

import scala.collection.immutable.SortedMap

object empty extends EmptyInstances

import cats.syntax.functor._
Expand Down Expand Up @@ -198,38 +200,63 @@ trait EmptyInstances extends EmptyInstances1 {
} with NestedTraverseEmpty[F, G]
}

implicit def mapTraverseEmpty[K]: TraverseEmpty[MapC[K]#l] = {
new TraverseEmpty[MapC[K]#l] {
override def traverseFilter[G[_], A, B](fa: Map[K, A])(f: A => G[Option[B]])(implicit G: Applicative[G]): G[Map[K, B]] = {
val gba: Eval[G[Map[K, B]]] = Always(G.pure(Map.empty))
val gbb = Foldable.iterateRight(fa.iterator, gba) { (kv, lbuf) =>
implicit def mapFunctorEmpty[K]: FunctorEmpty[MapC[K]#l] = {
new FunctorEmpty[MapC[K]#l] {

override val functor: Functor[MapC[K]#l] = cats.instances.map.catsStdInstancesForMap[K]

override def mapFilter[A, B](fa: Map[K, A])(f: A => Option[B]) = {
fa.collect(scala.Function.unlift(t => f(t._2).map(t._1 -> _)))
}

override def collect[A, B](fa: Map[K, A])(f: PartialFunction[A, B]) = {
fa.collect(scala.Function.unlift(t => f.lift(t._2).map(t._1 -> _)))
}

override def flattenOption[A](fa: Map[K, Option[A]]) = {
fa.collect(scala.Function.unlift(t => t._2.map(t._1 -> _)))
}

override def filter[A](fa: Map[K, A])(f: A => Boolean) = {
fa.filter { case (_, v) => f(v) }
}
}
}

implicit def sortedMapTraverseEmpty[K: Order]: TraverseEmpty[SortedMapC[K]#l] = {
new TraverseEmpty[SortedMapC[K]#l] {

implicit val ordering: Ordering[K] = Order[K].toOrdering

override def traverseFilter[G[_], A, B](fa: SortedMap[K, A])(f: A => G[Option[B]])(implicit G: Applicative[G]): G[SortedMap[K, B]] = {
val gba: Eval[G[SortedMap[K, B]]] = Always(G.pure(SortedMap.empty))
Foldable.iterateRight(fa, gba) { (kv, lbuf) =>
G.map2Eval(f(kv._2), lbuf)({ (ob, buf) => ob.fold(buf)(b => buf + (kv._1 -> b)) })
}.value
G.map(gbb)(_.toMap)
}

override val traverse: Traverse[MapC[K]#l] = cats.instances.map.catsStdInstancesForMap[K]
override val functorEmpty: FunctorEmpty[MapC[K]#l] = new FunctorEmpty[MapC[K]#l] {
override val functor: Functor[MapC[K]#l] = traverse
override val traverse: Traverse[SortedMapC[K]#l] = cats.instances.sortedMap.catsStdInstancesForSortedMap[K]
override val functorEmpty: FunctorEmpty[SortedMapC[K]#l] = new FunctorEmpty[SortedMapC[K]#l] {
override val functor: Functor[SortedMapC[K]#l] = traverse

override def mapFilter[A, B](fa: Map[K, A])(f: (A) => Option[B]): Map[K, B] = {
override def mapFilter[A, B](fa: SortedMap[K, A])(f: (A) => Option[B]): SortedMap[K, B] = {
fa.collect(scala.Function.unlift(t => f(t._2).map(t._1 -> _)))
}

override def collect[A, B](fa: Map[K, A])(f: PartialFunction[A, B]): Map[K, B] = {
override def collect[A, B](fa: SortedMap[K, A])(f: PartialFunction[A, B]): SortedMap[K, B] = {
fa.collect(scala.Function.unlift(t => f.lift(t._2).map(t._1 -> _)))
}

override def flattenOption[A](fa: Map[K, Option[A]]): Map[K, A] = {
override def flattenOption[A](fa: SortedMap[K, Option[A]]): SortedMap[K, A] = {
fa.collect(scala.Function.unlift(t => t._2.map(t._1 -> _)))
}

override def filter[A](fa: Map[K, A])(f: (A) => Boolean): Map[K, A] = {
override def filter[A](fa: SortedMap[K, A])(f: (A) => Boolean): SortedMap[K, A] = {
fa.filter { case (_, v) => f(v) }
}
}

override def filterA[G[_], A](fa: Map[K, A])(f: (A) => G[Boolean])(implicit G: Applicative[G]): G[Map[K, A]] = {
override def filterA[G[_], A](fa: SortedMap[K, A])(f: (A) => G[Boolean])(implicit G: Applicative[G]): G[SortedMap[K, A]] = {
traverseFilter(fa)(a => G.map(f(a))(if (_) Some(a) else None))
}
}
Expand Down
6 changes: 3 additions & 3 deletions core/src/main/scala/cats/mtl/instances/readert.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ trait ReaderTInstances extends ReaderTInstances1 {
implicit def readerFunctorLayerFunctor[M[_], E]
(implicit M: Functor[M]): FunctorLayerFunctor[ReaderTC[M, E]#l, M] = {
new FunctorLayerFunctor[ReaderTC[M, E]#l, M] {
def layerMapK[A](ma: ReaderT[M, E, A])(trans: M ~> M): ReaderT[M, E, A] = ma.transform(trans)
def layerMapK[A](ma: ReaderT[M, E, A])(trans: M ~> M): ReaderT[M, E, A] = ma.mapK(trans)

val outerInstance: Functor[ReaderTC[M, E]#l] = Kleisli.catsDataFunctorForKleisli(M)
val innerInstance: Functor[M] = M
Expand All @@ -22,7 +22,7 @@ trait ReaderTInstances1 extends ReaderTInstances2 {
implicit def readerApplicativeLayerFunctor[M[_], E]
(implicit M: Applicative[M]): ApplicativeLayerFunctor[ReaderTC[M, E]#l, M] = {
new ApplicativeLayerFunctor[ReaderTC[M, E]#l, M] {
def layerMapK[A](ma: ReaderT[M, E, A])(trans: M ~> M): ReaderT[M, E, A] = ma.transform(trans)
def layerMapK[A](ma: ReaderT[M, E, A])(trans: M ~> M): ReaderT[M, E, A] = ma.mapK(trans)

val outerInstance: Applicative[ReaderTC[M, E]#l] = Kleisli.catsDataApplicativeForKleisli(M)
val innerInstance: Applicative[M] = M
Expand All @@ -43,7 +43,7 @@ trait ReaderTInstances2 {

val innerInstance: Monad[M] = M

def layerMapK[A](ma: ReaderT[M, E, A])(trans: M ~> M): ReaderT[M, E, A] = ma.transform(trans)
def layerMapK[A](ma: ReaderT[M, E, A])(trans: M ~> M): ReaderT[M, E, A] = ma.mapK(trans)

def layer[A](inner: M[A]): ReaderT[M, E, A] = ReaderT.lift(inner)

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

import data.StateT
import data.{IndexedStateT, StateT}

trait StateInstances extends StateInstancesLowPriority1 {
// this dependency on LayerFunctor is required because non-`LayerFunctor`s may not be lawful
Expand Down Expand Up @@ -31,7 +31,7 @@ trait StateInstances extends StateInstancesLowPriority1 {
private[instances] trait StateInstancesLowPriority1 {
implicit final def stateState[M[_], S](implicit M: Monad[M]): MonadState[StateTC[M, S]#l, S] = {
new MonadState[StateTC[M, S]#l, S] {
val monad: Monad[StateTC[M, S]#l] = StateT.catsDataMonadForStateT
val monad: Monad[StateTC[M, S]#l] = IndexedStateT.catsDataMonadForIndexedStateT

def get: StateT[M, S, S] = StateT.get

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

import cats.data.StateT
import cats.data.{IndexedStateT, StateT}
import cats.syntax.functor._

trait StateTInstances {
Expand All @@ -12,7 +12,7 @@ trait StateTInstances {
type State[A] = (S, A)

val outerInstance: Monad[StateTC[M, S]#l] =
StateT.catsDataMonadForStateT
IndexedStateT.catsDataMonadForIndexedStateT

val innerInstance: Monad[M] = M

Expand Down
3 changes: 3 additions & 0 deletions core/src/main/scala/cats/mtl/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package cats

import cats.data._

import scala.collection.immutable.SortedMap

package object mtl {

private[mtl] type CurryT[T[_[_], _], M[_]] = {type l[A] = T[M, A]}
Expand All @@ -25,5 +27,6 @@ package object mtl {
private[mtl] type of[F[_], G[_]] = {type l[A] = F[G[A]]}
private[mtl] type NestedC[F[_], G[_]] = {type l[A] = Nested[F, G, A]}
private[mtl] type MapC[K] = {type l[V] = Map[K, V]}
private[mtl] type SortedMapC[K] = {type l[V] = SortedMap[K, V]}

}
6 changes: 4 additions & 2 deletions laws/src/main/scala/cats/mtl/laws/ApplicativeAskLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package cats
package mtl
package laws

import cats.syntax.cartesian._
import cats.laws.IsEq
import cats.laws.IsEqArrow
import cats.syntax.apply._
import cats.syntax.functor._

trait ApplicativeAskLaws[F[_], E] {
Expand All @@ -12,7 +14,7 @@ trait ApplicativeAskLaws[F[_], E] {

// external law:
def askAddsNoEffects[A](fa: F[A]): IsEq[F[A]] = {
(ask *> fa) <-> fa
ask *> fa <-> fa
}

// internal law:
Expand Down
2 changes: 2 additions & 0 deletions laws/src/main/scala/cats/mtl/laws/ApplicativeLayerLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow
import cats.syntax.applicative._
import cats.syntax.apply._

Expand Down
3 changes: 3 additions & 0 deletions laws/src/main/scala/cats/mtl/laws/ApplicativeLocalLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow

trait ApplicativeLocalLaws[F[_], E] extends ApplicativeAskLaws[F, E] {
implicit val localInstance: ApplicativeLocal[F, E]

Expand Down
3 changes: 3 additions & 0 deletions laws/src/main/scala/cats/mtl/laws/FunctorEmptyLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow

trait FunctorEmptyLaws[F[_]] {
val functorEmptyInstance: FunctorEmpty[F]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow

trait FunctorLayerFunctorLaws[M[_], Inner[_]] extends FunctorLayerLaws[M, Inner] {
val functorLayerFunctorInstance: FunctorLayerFunctor[M, Inner]
import functorLayerFunctorInstance._
Expand Down
3 changes: 3 additions & 0 deletions laws/src/main/scala/cats/mtl/laws/FunctorLayerLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow

trait FunctorLayerLaws[M[_], Inner[_]] {
implicit val functorLayerInstance: FunctorLayer[M, Inner]

Expand Down
4 changes: 3 additions & 1 deletion laws/src/main/scala/cats/mtl/laws/FunctorListenLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow
import cats.syntax.functor._

trait FunctorListenLaws[F[_], L] extends FunctorTellLaws[F, L] {
implicit val listenInstance: FunctorListen[F, L]
import listenInstance.{listen, listens}
import listenInstance.tell._
import listenInstance.{listen, listens}

// external laws:
def listenRespectsTell(l: L): IsEq[F[(Unit, L)]] = {
Expand Down
2 changes: 2 additions & 0 deletions laws/src/main/scala/cats/mtl/laws/FunctorTellLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow
import cats.syntax.functor._

trait FunctorTellLaws[F[_], L] {
Expand Down
5 changes: 0 additions & 5 deletions laws/src/main/scala/cats/mtl/laws/IsEq.scala

This file was deleted.

3 changes: 3 additions & 0 deletions laws/src/main/scala/cats/mtl/laws/MonadLayerControlLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow

trait MonadLayerControlLaws[M[_], Inner[_], State0[_]] extends MonadLayerFunctorLaws[M, Inner] {

implicit val monadLayerControlInstance: MonadLayerControl.Aux[M, Inner, State0]
Expand Down
2 changes: 2 additions & 0 deletions laws/src/main/scala/cats/mtl/laws/MonadLayerLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow
import cats.syntax.flatMap._

trait MonadLayerLaws[M[_], Inner[_]] extends ApplicativeLayerLaws[M, Inner] {
Expand Down
4 changes: 3 additions & 1 deletion laws/src/main/scala/cats/mtl/laws/MonadStateLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package cats
package mtl
package laws

import cats.laws.IsEq
import cats.laws.IsEqArrow
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.cartesian._
import cats.syntax.apply._

trait MonadStateLaws[F[_], S] {
implicit val stateInstance: MonadState[F, S]
Expand Down
2 changes: 2 additions & 0 deletions laws/src/main/scala/cats/mtl/laws/TraverseEmptyLaws.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package mtl
package laws

import cats.data.Nested
import cats.laws.IsEq
import cats.laws.IsEqArrow
import cats.syntax.all._
import cats.mtl.syntax.empty._

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package discipline
import org.scalacheck.Prop.{forAll => }
import org.scalacheck.{Arbitrary, Cogen}
import org.typelevel.discipline.Laws
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait ApplicativeAskTests[F[_], E] extends Laws {
implicit val askInstance: ApplicativeAsk[F, E]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package discipline

import org.scalacheck.Prop.{forAll => }
import org.scalacheck.Arbitrary
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait ApplicativeLayerTests[M[_], Inner[_]] extends FunctorLayerTests[M, Inner] {
implicit val applicativeLayerInstance: ApplicativeLayer[M, Inner]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package discipline

import org.scalacheck.Prop.{forAll => }
import org.scalacheck.{Arbitrary, Cogen}
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait ApplicativeLocalTests[F[_], E] extends ApplicativeAskTests[F, E] {
implicit val localInstance: ApplicativeLocal[F, E]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package discipline
import org.scalacheck.Prop.{forAll => }
import org.scalacheck.Arbitrary
import org.typelevel.discipline.Laws
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait FunctorEmptyTests[F[_]] extends Laws {
implicit val functorEmptyInstance: FunctorEmpty[F]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package discipline
import org.scalacheck.Prop.{forAll => }
import org.scalacheck.Arbitrary
import org.typelevel.discipline.Laws
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait FunctorLayerFunctorTests[M[_], Inner[_]] extends FunctorLayerTests[M, Inner] {
implicit val functorLayerFunctorInstance: FunctorLayerFunctor[M, Inner]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package discipline
import org.scalacheck.Prop.{forAll => }
import org.scalacheck.Arbitrary
import org.typelevel.discipline.Laws
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait FunctorLayerTests[M[_], Inner[_]] extends Laws {
implicit val functorLayer: FunctorLayer[M, Inner]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package discipline
import org.scalacheck.Prop.{forAll => }
import org.scalacheck.{Arbitrary, Cogen}
import org.typelevel.discipline.Laws
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait FunctorListenTests[F[_], L] extends FunctorTellTests[F, L] {
implicit val listenInstance: FunctorListen[F, L]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package discipline
import org.scalacheck.Prop.{forAll => }
import org.scalacheck.{Arbitrary, Cogen}
import org.typelevel.discipline.Laws
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait FunctorTellTests[F[_], L] extends Laws {
implicit val tellInstance: FunctorTell[F, L]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package discipline
import org.scalacheck.Prop.{forAll => }
import org.scalacheck.Arbitrary
import org.typelevel.discipline.Laws
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait MonadLayerControlTests[M[_], Inner[_], State[_]] extends MonadLayerFunctorTests[M, Inner] {
implicit val monadLayerControlInstance: MonadLayerControl.Aux[M, Inner, State]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package discipline

import org.scalacheck.Arbitrary
import org.scalacheck.Prop.{forAll => }
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait MonadLayerFunctorTests[M[_], Inner[_]] extends MonadLayerTests[M, Inner] with ApplicativeLayerFunctorTests[M, Inner] {
implicit val monadLayerFunctorInstance: MonadLayerFunctor[M, Inner]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package discipline

import org.scalacheck.Arbitrary
import org.scalacheck.Prop.{forAll => }
import cats.kernel.laws.discipline.catsLawsIsEqToProp

trait MonadLayerTests[M[_], Inner[_]] extends ApplicativeLayerTests[M, Inner] {
implicit val monadLayerInstance: MonadLayer[M, Inner]
Expand Down
Loading

0 comments on commit 64e2577

Please sign in to comment.