Skip to content

Commit cc0ba4b

Browse files
authored
Merge pull request #3158 from gagandeepkalra/functorFilter/addFilterNotFunction
add `filterNot` to FunctorFilter
2 parents b3bc539 + bd9e60b commit cc0ba4b

File tree

15 files changed

+40
-1
lines changed

15 files changed

+40
-1
lines changed

core/src/main/scala-2.12/cats/instances/stream.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ private[instances] trait StreamInstancesBinCompat0 {
192192

193193
override def filter[A](fa: Stream[A])(f: (A) => Boolean): Stream[A] = fa.filter(f)
194194

195+
override def filterNot[A](fa: Stream[A])(f: A => Boolean): Stream[A] = fa.filterNot(f)
196+
195197
override def collect[A, B](fa: Stream[A])(f: PartialFunction[A, B]): Stream[B] = fa.collect(f)
196198

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

core/src/main/scala-2.13+/cats/instances/lazyList.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ trait LazyListInstances extends cats.kernel.instances.LazyListInstances {
154154

155155
override def filter[A](fa: LazyList[A])(f: (A) => Boolean): LazyList[A] = fa.filter(f)
156156

157+
override def filterNot[A](fa: LazyList[A])(f: (A) => Boolean): LazyList[A] = fa.filterNot(f)
158+
157159
override def collect[A, B](fa: LazyList[A])(f: PartialFunction[A, B]): LazyList[B] = fa.collect(f)
158160

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

core/src/main/scala/cats/FunctorFilter.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,11 @@ trait FunctorFilter[F[_]] extends Serializable {
6666
*/
6767
def filter[A](fa: F[A])(f: A => Boolean): F[A] =
6868
mapFilter(fa)(a => if (f(a)) Some(a) else None)
69+
70+
/**
71+
* Apply a filter to a structure such that the output structure contains all
72+
* `A` elements in the input structure that do not satisfy the predicate `f`.
73+
*/
74+
def filterNot[A](fa: F[A])(f: A => Boolean): F[A] =
75+
mapFilter(fa)(Some(_).filterNot(f))
6976
}

core/src/main/scala/cats/data/Chain.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,8 @@ sealed abstract private[data] class ChainInstances extends ChainInstances1 {
799799

800800
override def filter[A](fa: Chain[A])(f: A => Boolean): Chain[A] = fa.filter(f)
801801

802+
override def filterNot[A](fa: Chain[A])(f: A => Boolean): Chain[A] = fa.filterNot(f)
803+
802804
override def collect[A, B](fa: Chain[A])(f: PartialFunction[A, B]): Chain[B] = fa.collect(f)
803805

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

core/src/main/scala/cats/data/Const.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ sealed abstract private[data] class ConstInstances extends ConstInstances0 {
107107

108108
override def filter[A](fa: Const[C, A])(f: (A) => Boolean): Const[C, A] = fa.retag
109109

110+
override def filterNot[A](fa: Const[C, A])(f: A => Boolean): Const[C, A] = fa.retag
111+
110112
def traverseFilter[G[_], A, B](
111113
fa: Const[C, A]
112114
)(f: (A) => G[Option[B]])(implicit G: Applicative[G]): G[Const[C, B]] =

core/src/main/scala/cats/data/Nested.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,10 @@ abstract private[data] class NestedFunctorFilter[F[_], G[_]] extends FunctorFilt
369369

370370
override def filter[A](fa: Nested[F, G, A])(f: (A) => Boolean): Nested[F, G, A] =
371371
Nested[F, G, A](F.map(fa.value)(G.filter(_)(f)))
372+
373+
override def filterNot[A](fa: Nested[F, G, A])(f: A => Boolean): Nested[F, G, A] =
374+
Nested[F, G, A](F.map(fa.value)(G.filterNot(_)(f)))
375+
372376
}
373377

374378
abstract private[data] class NestedTraverseFilter[F[_], G[_]]

core/src/main/scala/cats/data/OptionT.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,8 @@ sealed private[data] trait OptionTFunctorFilter[F[_]] extends FunctorFilter[Opti
497497
override def flattenOption[A](fa: OptionT[F, Option[A]]): OptionT[F, A] = fa.subflatMap(identity)
498498

499499
override def filter[A](fa: OptionT[F, A])(f: (A) => Boolean): OptionT[F, A] = fa.filter(f)
500+
501+
override def filterNot[A](fa: OptionT[F, A])(f: A => Boolean): OptionT[F, A] = fa.filterNot(f)
500502
}
501503

502504
sealed private[data] trait OptionTOrder[F[_], A] extends Order[OptionT[F, A]] with OptionTPartialOrder[F, A] {

core/src/main/scala/cats/instances/list.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ private[instances] trait ListInstancesBinCompat0 {
193193

194194
override def filter[A](fa: List[A])(f: (A) => Boolean): List[A] = fa.filter(f)
195195

196+
override def filterNot[A](fa: List[A])(f: A => Boolean): List[A] = fa.filterNot(f)
197+
196198
override def collect[A, B](fa: List[A])(f: PartialFunction[A, B]): List[B] = fa.collect(f)
197199

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

core/src/main/scala/cats/instances/map.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,9 @@ private[instances] trait MapInstancesBinCompat0 {
157157
override def filter[A](fa: Map[K, A])(f: A => Boolean) =
158158
fa.filter { case (_, v) => f(v) }
159159

160+
override def filterNot[A](fa: Map[K, A])(f: A => Boolean): Map[K, A] =
161+
fa.filterNot { case (_, v) => f(v) }
162+
160163
}
161164

162165
}

core/src/main/scala/cats/instances/option.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ private[instances] trait OptionInstancesBinCompat0 {
168168

169169
override def filter[A](fa: Option[A])(f: (A) => Boolean): Option[A] = fa.filter(f)
170170

171+
override def filterNot[A](fa: Option[A])(f: A => Boolean): Option[A] = fa.filterNot(f)
172+
171173
override def collect[A, B](fa: Option[A])(f: PartialFunction[A, B]): Option[B] = fa.collect(f)
172174

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

core/src/main/scala/cats/instances/queue.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ private object QueueInstances {
165165

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

168+
override def filterNot[A](fa: Queue[A])(f: A => Boolean): Queue[A] = fa.filterNot(f)
169+
168170
override def collect[A, B](fa: Queue[A])(f: PartialFunction[A, B]): Queue[B] = fa.collect(f)
169171

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

core/src/main/scala/cats/instances/sortedMap.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ private[instances] trait SortedMapInstancesBinCompat0 {
205205
override def filter[A](fa: SortedMap[K, A])(f: (A) => Boolean): SortedMap[K, A] =
206206
fa.filter { case (_, v) => f(v) }
207207

208+
override def filterNot[A](fa: SortedMap[K, A])(f: A => Boolean): SortedMap[K, A] =
209+
fa.filterNot { case (_, v) => f(v) }
210+
208211
override def filterA[G[_], A](
209212
fa: SortedMap[K, A]
210213
)(f: (A) => G[Boolean])(implicit G: Applicative[G]): G[SortedMap[K, A]] =

core/src/main/scala/cats/instances/vector.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ private[instances] trait VectorInstancesBinCompat0 {
158158

159159
override def filter[A](fa: Vector[A])(f: (A) => Boolean): Vector[A] = fa.filter(f)
160160

161+
override def filterNot[A](fa: Vector[A])(f: A => Boolean): Vector[A] = fa.filterNot(f)
162+
161163
override def collect[A, B](fa: Vector[A])(f: PartialFunction[A, B]): Vector[B] = fa.collect(f)
162164

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

laws/src/main/scala/cats/laws/FunctorFilterLaws.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ trait FunctorFilterLaws[F[_]] {
2424
def filterConsistentWithMapFilter[A](fa: F[A], f: A => Boolean): IsEq[F[A]] =
2525
F.filter(fa)(f) <->
2626
F.mapFilter(fa)(a => if (f(a)) Some(a) else None)
27+
28+
def filterNotConsistentWithFilter[A](fa: F[A], f: A => Boolean): IsEq[F[A]] =
29+
F.filterNot(fa)(f) <-> F.filter(fa)(!f(_))
2730
}
2831

2932
object FunctorFilterLaws {

laws/src/main/scala/cats/laws/discipline/FunctorFilterTests.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ trait FunctorFilterTests[F[_]] extends Laws {
2727
"mapFilter map consistency" -> forAll(laws.mapFilterMapConsistency[A, B] _),
2828
"collect mapFilter consistency" -> forAll(laws.collectConsistentWithMapFilter[A, B] _),
2929
"flattenOption mapFilter consistency" -> forAll(laws.flattenOptionConsistentWithMapFilter[A] _),
30-
"filter mapFilter consistency" -> forAll(laws.filterConsistentWithMapFilter[A] _)
30+
"filter mapFilter consistency" -> forAll(laws.filterConsistentWithMapFilter[A] _),
31+
"filterNot mapFilter consistency" -> forAll(laws.filterNotConsistentWithFilter[A] _)
3132
)
3233
}
3334

0 commit comments

Comments
 (0)