Skip to content

Commit

Permalink
Add TraverseFilter instance for Queue.
Browse files Browse the repository at this point in the history
  • Loading branch information
takayahilton committed Oct 9, 2019
1 parent dc44c3b commit a7f0097
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 3 deletions.
3 changes: 3 additions & 0 deletions core/src/main/scala-2.12/cats/instances/all.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ abstract class AllInstancesBinCompat
with AllInstancesBinCompat4
with AllInstancesBinCompat5
with AllInstancesBinCompat6
with AllInstancesBinCompat7

trait AllInstances
extends AnyValInstances
Expand Down Expand Up @@ -62,3 +63,5 @@ trait AllInstancesBinCompat4 extends SortedMapInstancesBinCompat1 with MapInstan
trait AllInstancesBinCompat5 extends SortedSetInstancesBinCompat0

trait AllInstancesBinCompat6 extends SortedSetInstancesBinCompat1 with SortedMapInstancesBinCompat2

trait AllInstancesBinCompat7 extends QueueInstancesBinCompat0
2 changes: 1 addition & 1 deletion core/src/main/scala-2.12/cats/instances/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ package object instances {
object parallel extends ParallelInstances
object partialOrder extends PartialOrderInstances
object partialOrdering extends PartialOrderingInstances
object queue extends QueueInstances
object queue extends QueueInstances with QueueInstancesBinCompat0
object set extends SetInstances
object short extends ShortInstances
object sortedMap
Expand Down
3 changes: 3 additions & 0 deletions core/src/main/scala-2.13+/cats/instances/all.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ abstract class AllInstancesBinCompat
with AllInstancesBinCompat4
with AllInstancesBinCompat5
with AllInstancesBinCompat6
with AllInstancesBinCompat7

trait AllInstances
extends AnyValInstances
Expand Down Expand Up @@ -63,3 +64,5 @@ trait AllInstancesBinCompat4 extends SortedMapInstancesBinCompat1 with MapInstan
trait AllInstancesBinCompat5 extends SortedSetInstancesBinCompat0

trait AllInstancesBinCompat6 extends SortedSetInstancesBinCompat1 with SortedMapInstancesBinCompat2

trait AllInstancesBinCompat7 extends QueueInstancesBinCompat0
2 changes: 1 addition & 1 deletion core/src/main/scala-2.13+/cats/instances/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ package object instances {
object parallel extends ParallelInstances
object partialOrder extends PartialOrderInstances
object partialOrdering extends PartialOrderingInstances
object queue extends QueueInstances
object queue extends QueueInstances with QueueInstancesBinCompat0
object set extends SetInstances
object short extends ShortInstances
object sortedMap
Expand Down
27 changes: 27 additions & 0 deletions core/src/main/scala/cats/instances/queue.scala
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,30 @@ trait QueueInstances extends cats.kernel.instances.QueueInstances {
fa.iterator.map(_.show).mkString("Queue(", ", ", ")")
}
}

private[instances] trait QueueInstancesBinCompat0 {
implicit val catsStdTraverseFilterForQueue: TraverseFilter[Queue] = new TraverseFilter[Queue] {
val traverse: Traverse[Queue] = cats.instances.queue.catsStdInstancesForQueue

override def mapFilter[A, B](fa: Queue[A])(f: (A) => Option[B]): Queue[B] =
fa.collect(Function.unlift(f))

override def filter[A](fa: Queue[A])(f: (A) => Boolean): Queue[A] = fa.filter(f)

override def collect[A, B](fa: Queue[A])(f: PartialFunction[A, B]): Queue[B] = fa.collect(f)

override def flattenOption[A](fa: Queue[Option[A]]): Queue[A] = fa.flatten

def traverseFilter[G[_], A, B](fa: Queue[A])(f: (A) => G[Option[B]])(implicit G: Applicative[G]): G[Queue[B]] =
fa.foldRight(Eval.now(G.pure(Queue.empty[B])))(
(x, xse) => G.map2Eval(f(x), xse)((i, o) => i.fold(o)(_ +: o))
)
.value

override def filterA[G[_], A](fa: Queue[A])(f: (A) => G[Boolean])(implicit G: Applicative[G]): G[Queue[A]] =
fa.foldRight(Eval.now(G.pure(Queue.empty[A])))(
(x, xse) => G.map2Eval(f(x), xse)((b, vec) => if (b) x +: vec else vec)
)
.value
}
}
1 change: 1 addition & 0 deletions tests/src/test/scala/cats/tests/CatsSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ trait CatsSuite
with AllInstancesBinCompat4
with AllInstancesBinCompat5
with AllInstancesBinCompat6
with AllInstancesBinCompat7
with AllSyntax
with AllSyntaxBinCompat0
with AllSyntaxBinCompat1
Expand Down
5 changes: 4 additions & 1 deletion tests/src/test/scala/cats/tests/QueueSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ package cats
package tests

import scala.collection.immutable.Queue

import cats.laws.discipline.{
AlternativeTests,
CoflatMapTests,
MonadTests,
SemigroupalTests,
SerializableTests,
TraverseFilterTests,
TraverseTests
}

Expand All @@ -28,6 +28,9 @@ class QueueSuite extends CatsSuite {
checkAll("Queue[Int] with Option", TraverseTests[Queue].traverse[Int, Int, Int, Set[Int], Option, Option])
checkAll("Traverse[Queue]", SerializableTests.serializable(Traverse[Queue]))

checkAll("Queue[Int]", TraverseFilterTests[Queue].traverseFilter[Int, Int, Int])
checkAll("TraverseFilter[Queue]", SerializableTests.serializable(TraverseFilter[Queue]))

test("show") {
Queue(1, 2, 3).show should ===("Queue(1, 2, 3)")
Queue.empty[Int].show should ===("Queue()")
Expand Down

0 comments on commit a7f0097

Please sign in to comment.