diff --git a/core/src/main/scala/cats/mtl/instances/empty.scala b/core/src/main/scala/cats/mtl/instances/empty.scala index abcd7440..ff435558 100644 --- a/core/src/main/scala/cats/mtl/instances/empty.scala +++ b/core/src/main/scala/cats/mtl/instances/empty.scala @@ -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._ @@ -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)) } } diff --git a/core/src/main/scala/cats/mtl/instances/readert.scala b/core/src/main/scala/cats/mtl/instances/readert.scala index c31761df..9a32cbe0 100644 --- a/core/src/main/scala/cats/mtl/instances/readert.scala +++ b/core/src/main/scala/cats/mtl/instances/readert.scala @@ -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 @@ -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 @@ -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) diff --git a/core/src/main/scala/cats/mtl/instances/state.scala b/core/src/main/scala/cats/mtl/instances/state.scala index b4089cba..8b0f6a9b 100644 --- a/core/src/main/scala/cats/mtl/instances/state.scala +++ b/core/src/main/scala/cats/mtl/instances/state.scala @@ -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 @@ -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 diff --git a/core/src/main/scala/cats/mtl/instances/statet.scala b/core/src/main/scala/cats/mtl/instances/statet.scala index 511f0739..6c3b7899 100644 --- a/core/src/main/scala/cats/mtl/instances/statet.scala +++ b/core/src/main/scala/cats/mtl/instances/statet.scala @@ -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 { @@ -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 diff --git a/core/src/main/scala/cats/mtl/package.scala b/core/src/main/scala/cats/mtl/package.scala index 4e47f485..a9f080d8 100644 --- a/core/src/main/scala/cats/mtl/package.scala +++ b/core/src/main/scala/cats/mtl/package.scala @@ -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]} @@ -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]} } diff --git a/laws/src/main/scala/cats/mtl/laws/ApplicativeAskLaws.scala b/laws/src/main/scala/cats/mtl/laws/ApplicativeAskLaws.scala index 6c32afbe..8ebd21e0 100644 --- a/laws/src/main/scala/cats/mtl/laws/ApplicativeAskLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/ApplicativeAskLaws.scala @@ -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] { @@ -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: diff --git a/laws/src/main/scala/cats/mtl/laws/ApplicativeLayerLaws.scala b/laws/src/main/scala/cats/mtl/laws/ApplicativeLayerLaws.scala index ea2cbc7f..d6f145af 100644 --- a/laws/src/main/scala/cats/mtl/laws/ApplicativeLayerLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/ApplicativeLayerLaws.scala @@ -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._ diff --git a/laws/src/main/scala/cats/mtl/laws/ApplicativeLocalLaws.scala b/laws/src/main/scala/cats/mtl/laws/ApplicativeLocalLaws.scala index e01e266a..a7cb97aa 100644 --- a/laws/src/main/scala/cats/mtl/laws/ApplicativeLocalLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/ApplicativeLocalLaws.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/FunctorEmptyLaws.scala b/laws/src/main/scala/cats/mtl/laws/FunctorEmptyLaws.scala index ff512554..d9c6f496 100644 --- a/laws/src/main/scala/cats/mtl/laws/FunctorEmptyLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/FunctorEmptyLaws.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/FunctorLayerFunctorLaws.scala b/laws/src/main/scala/cats/mtl/laws/FunctorLayerFunctorLaws.scala index 75bf59a3..150e1f84 100644 --- a/laws/src/main/scala/cats/mtl/laws/FunctorLayerFunctorLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/FunctorLayerFunctorLaws.scala @@ -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._ diff --git a/laws/src/main/scala/cats/mtl/laws/FunctorLayerLaws.scala b/laws/src/main/scala/cats/mtl/laws/FunctorLayerLaws.scala index 26e05635..54e8bbc8 100644 --- a/laws/src/main/scala/cats/mtl/laws/FunctorLayerLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/FunctorLayerLaws.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/FunctorListenLaws.scala b/laws/src/main/scala/cats/mtl/laws/FunctorListenLaws.scala index 46ddcb65..0af51928 100644 --- a/laws/src/main/scala/cats/mtl/laws/FunctorListenLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/FunctorListenLaws.scala @@ -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)]] = { diff --git a/laws/src/main/scala/cats/mtl/laws/FunctorTellLaws.scala b/laws/src/main/scala/cats/mtl/laws/FunctorTellLaws.scala index 376594d3..80b7678a 100644 --- a/laws/src/main/scala/cats/mtl/laws/FunctorTellLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/FunctorTellLaws.scala @@ -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] { diff --git a/laws/src/main/scala/cats/mtl/laws/IsEq.scala b/laws/src/main/scala/cats/mtl/laws/IsEq.scala deleted file mode 100644 index d39d09a6..00000000 --- a/laws/src/main/scala/cats/mtl/laws/IsEq.scala +++ /dev/null @@ -1,5 +0,0 @@ -package cats -package mtl -package laws - -final case class IsEq[A](lhs: A, rhs: A) diff --git a/laws/src/main/scala/cats/mtl/laws/MonadLayerControlLaws.scala b/laws/src/main/scala/cats/mtl/laws/MonadLayerControlLaws.scala index decaf768..f94d0f91 100644 --- a/laws/src/main/scala/cats/mtl/laws/MonadLayerControlLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/MonadLayerControlLaws.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/MonadLayerLaws.scala b/laws/src/main/scala/cats/mtl/laws/MonadLayerLaws.scala index b56f4ce7..7398454b 100644 --- a/laws/src/main/scala/cats/mtl/laws/MonadLayerLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/MonadLayerLaws.scala @@ -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] { diff --git a/laws/src/main/scala/cats/mtl/laws/MonadStateLaws.scala b/laws/src/main/scala/cats/mtl/laws/MonadStateLaws.scala index db62db12..50dd2901 100644 --- a/laws/src/main/scala/cats/mtl/laws/MonadStateLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/MonadStateLaws.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/TraverseEmptyLaws.scala b/laws/src/main/scala/cats/mtl/laws/TraverseEmptyLaws.scala index 50b28128..6164e73b 100644 --- a/laws/src/main/scala/cats/mtl/laws/TraverseEmptyLaws.scala +++ b/laws/src/main/scala/cats/mtl/laws/TraverseEmptyLaws.scala @@ -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._ diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeAskTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeAskTests.scala index 9e56ca42..ba61113f 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeAskTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeAskTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeLayerTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeLayerTests.scala index eb12aaff..b1c39f10 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeLayerTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeLayerTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeLocalTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeLocalTests.scala index dbf02932..a09e890d 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeLocalTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/ApplicativeLocalTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorEmptyTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorEmptyTests.scala index d206c8ba..5ee2aa17 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorEmptyTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorEmptyTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorLayerFunctorTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorLayerFunctorTests.scala index 154dc6f7..c0da49e7 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorLayerFunctorTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorLayerFunctorTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorLayerTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorLayerTests.scala index 2d85e787..828042ff 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorLayerTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorLayerTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorListenTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorListenTests.scala index af75b3b7..86f6f792 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorListenTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorListenTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorTellTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorTellTests.scala index 5c2c13e4..1c968ba8 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/FunctorTellTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/FunctorTellTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerControlTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerControlTests.scala index ed103aa7..35eebe31 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerControlTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerControlTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerFunctorTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerFunctorTests.scala index 51f0ab37..773b6de9 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerFunctorTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerFunctorTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerTests.scala index 7f2aec9b..5d35b8b8 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/MonadLayerTests.scala @@ -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] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/MonadStateTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/MonadStateTests.scala index aea4201f..b22a3880 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/MonadStateTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/MonadStateTests.scala @@ -6,6 +6,7 @@ package discipline import org.scalacheck.{Arbitrary, Cogen} import org.scalacheck.Prop.{forAll => ∀} import org.typelevel.discipline.Laws +import cats.kernel.laws.discipline.catsLawsIsEqToProp trait MonadStateTests[F[_], S] extends Laws { implicit val stateInstance: MonadState[F, S] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/TraverseEmptyTests.scala b/laws/src/main/scala/cats/mtl/laws/discipline/TraverseEmptyTests.scala index 0a5c246f..0e1561d8 100644 --- a/laws/src/main/scala/cats/mtl/laws/discipline/TraverseEmptyTests.scala +++ b/laws/src/main/scala/cats/mtl/laws/discipline/TraverseEmptyTests.scala @@ -7,6 +7,7 @@ import cats.data.Nested import org.scalacheck.Prop.{forAll => ∀} import org.scalacheck.Arbitrary import cats.instances.option._ +import cats.kernel.laws.discipline.catsLawsIsEqToProp trait TraverseEmptyTests[F[_]] extends FunctorEmptyTests[F] { implicit val traverseEmptyInstance: TraverseEmpty[F] diff --git a/laws/src/main/scala/cats/mtl/laws/discipline/package.scala b/laws/src/main/scala/cats/mtl/laws/discipline/package.scala deleted file mode 100644 index ad4084e3..00000000 --- a/laws/src/main/scala/cats/mtl/laws/discipline/package.scala +++ /dev/null @@ -1,12 +0,0 @@ -package cats -package mtl -package laws - -import org.scalacheck.Prop -import cats.kernel.laws._ - -package object discipline { - implicit def catsLawsIsEqToProp[A: Eq](isEq: IsEq[A]): Prop = { - isEq.lhs ?== isEq.rhs - } -} diff --git a/laws/src/main/scala/cats/mtl/laws/package.scala b/laws/src/main/scala/cats/mtl/laws/package.scala deleted file mode 100644 index a77fe6fc..00000000 --- a/laws/src/main/scala/cats/mtl/laws/package.scala +++ /dev/null @@ -1,10 +0,0 @@ -package cats -package mtl - -package object laws { - - implicit final class IsEqArrow[A](val lhs: A) extends AnyVal { - def <->(rhs: A): IsEq[A] = IsEq(lhs, rhs) - } - -} diff --git a/project/Dependencies.scala b/project/Dependencies.scala index fe21f703..0d27d0ae 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -8,12 +8,12 @@ object Dependencies { object Versions { val scalaCheck = "1.13.4" val scalaTest = "3.0.0" - val discipline = "0.7.2" + val discipline = "0.8" val macroParadise = "2.1.0" val kindProjector = "0.9.3" val simulacrum = "0.10.0" val machinist = "0.6.1" - val cats = "1.0.0-MF" + val cats = "1.0.0-RC1" val shapeless = "2.3.2" } @@ -71,4 +71,4 @@ object Dependencies { resolvers += "bintray/non" at "http://dl.bintray.com/non/maven" ) -} \ No newline at end of file +} diff --git a/project/Settings.scala b/project/Settings.scala index f793acd6..9d331ef5 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -56,8 +56,7 @@ object Settings { }, scalaJSStage in Global := FastOptStage, parallelExecution := false, - requiresDOM := false, - jsEnv := NodeJSEnv().value, + jsEnv := new org.scalajs.jsenv.nodejs.NodeJSEnv(), // Only used for scala.js for now Publishing.botBuild := scala.sys.env.get("TRAVIS").isDefined, // batch mode decreases the amount of memory needed to compile scala.js code diff --git a/project/build.properties b/project/build.properties index 64317fda..c091b86c 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.13.15 +sbt.version=0.13.16 diff --git a/project/plugins.sbt b/project/plugins.sbt index 0cfb06fd..52500dbd 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -9,7 +9,7 @@ addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.2.16") addSbtPlugin("org.scalastyle" % "scalastyle-sbt-plugin" % "0.8.0") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.0") addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "0.8.5") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.16") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.20") addSbtPlugin("com.github.tkawachi" % "sbt-doctest" % "0.5.0") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1") addSbtPlugin("com.fortysevendeg" % "sbt-microsites" % "0.3.2") diff --git a/scripts/travis-publish.sh b/scripts/travis-publish.sh index 5f4683f4..56d1bce3 100755 --- a/scripts/travis-publish.sh +++ b/scripts/travis-publish.sh @@ -17,7 +17,7 @@ # export TRAVIS_SCALA_VERSION=2.10.5;export TRAVIS_PULL_REQUEST="false";export TRAVIS_BRANCH="master" mkdir -p ~/.sbt/0.13/plugins -echo "addSbtPlugin(\"io.get-coursier\" % \"sbt-coursier\" % \"1.0.0-RC5\")" >> ~/.sbt/0.13/plugins/build.sbt +echo "addSbtPlugin(\"io.get-coursier\" % \"sbt-coursier\" % \"1.0.0-RC10\")" >> ~/.sbt/0.13/plugins/build.sbt export publish_cmd="publishLocal" diff --git a/tests/src/test/scala/cats/mtl/tests/EmptyTests.scala b/tests/src/test/scala/cats/mtl/tests/EmptyTests.scala index 8f7cfae6..3fc0fcb1 100644 --- a/tests/src/test/scala/cats/mtl/tests/EmptyTests.scala +++ b/tests/src/test/scala/cats/mtl/tests/EmptyTests.scala @@ -25,10 +25,16 @@ class EmptyTests extends BaseSuite { SerializableTests.serializable(mtl.instances.empty.listTraverseEmpty)) checkAll("Map[Int, ?]", - TraverseEmptyTests[MapC[Int]#l](mtl.instances.empty.mapTraverseEmpty[Int]) + FunctorEmptyTests[MapC[Int]#l](mtl.instances.empty.mapFunctorEmpty[Int]) + .functorEmpty[String, String, String]) + checkAll("FunctorEmpty[Map[Int, ?]]", + SerializableTests.serializable(mtl.instances.empty.mapFunctorEmpty[Int])) + + checkAll("SortedMap[Int, ?]", + TraverseEmptyTests[SortedMapC[Int]#l](mtl.instances.empty.sortedMapTraverseEmpty[Int]) .traverseEmpty[String, String, String]) - checkAll("TraverseEmpty[Map[Int, ?]]", - SerializableTests.serializable(mtl.instances.empty.mapTraverseEmpty[Int])) + checkAll("TraverseEmpty[SortedMap[Int, ?]]", + SerializableTests.serializable(mtl.instances.empty.sortedMapTraverseEmpty[Int])) checkAll("Vector", TraverseEmptyTests[Vector](mtl.instances.empty.vectorTraverseEmpty) diff --git a/tests/src/test/scala/cats/mtl/tests/ReaderTTests.scala b/tests/src/test/scala/cats/mtl/tests/ReaderTTests.scala index dd422c6e..ca49d459 100644 --- a/tests/src/test/scala/cats/mtl/tests/ReaderTTests.scala +++ b/tests/src/test/scala/cats/mtl/tests/ReaderTTests.scala @@ -26,10 +26,6 @@ class ReaderTTests extends BaseSuite { eqKleisli[Id, A, B] } - implicit def catsLawArbitraryForStateT[F[_], S, A](implicit F: Arbitrary[F[S => F[(S, A)]]]): Arbitrary[StateT[F, S, A]] = { - Arbitrary(F.arbitrary.map(StateT.applyF)) - } - implicit def stateTEq[F[_], S, A](implicit S: Arbitrary[S], FSA: Eq[F[(S, A)]], F: FlatMap[F]): Eq[StateT[F, S, A]] = { Eq.by[StateT[F, S, A], S => F[(S, A)]](state => s => state.run(s)) diff --git a/tests/src/test/scala/cats/mtl/tests/Syntax.scala b/tests/src/test/scala/cats/mtl/tests/Syntax.scala index cbea11da..dcbb7379 100644 --- a/tests/src/test/scala/cats/mtl/tests/Syntax.scala +++ b/tests/src/test/scala/cats/mtl/tests/Syntax.scala @@ -2,11 +2,13 @@ package cats package mtl package tests + final class Syntax extends BaseSuite { // test instances.all._ //noinspection ScalaUnusedSymbol { + import scala.collection.immutable.SortedMap import cats.instances.all._ import cats.mtl.implicits._ import cats.data._ @@ -48,6 +50,9 @@ final class Syntax extends BaseSuite { } val fa: Map[Int, Int] = Map(1 -> 1, 2 -> 3) operateFunctorEmpty(fa) + + val sortedFa: SortedMap[Int, Int] = SortedMap(1 -> 1, 2 -> 3) + operateFunctorEmpty(sortedFa) } test("TraverseEmpty") { def operateTraverseEmpty[F[_]: TraverseEmpty](fi: F[Int]): Unit = { @@ -55,7 +60,7 @@ final class Syntax extends BaseSuite { val _2 = fi.traverseFilter[Option, Int] { i => Some(Some(i).filter(_ < 2)) } () } - val fa: Map[Int, Int] = Map(1 -> 1, 2 -> 3) + val fa: SortedMap[Int, Int] = SortedMap(1 -> 1, 2 -> 3) operateTraverseEmpty(fa) } test("MonadState") {