@@ -24,6 +24,8 @@ package data
24
24
25
25
import cats .kernel .{CommutativeMonoid , CommutativeSemigroup , LowerBounded , UpperBounded }
26
26
27
+ import scala .annotation .nowarn
28
+
27
29
/**
28
30
* [[Const ]] is a phantom type, it does not contain a value of its second type parameter `B`
29
31
* [[Const ]] can be seen as a type level version of `Function.const[A, B]: A => B => A`
@@ -39,6 +41,7 @@ final case class Const[A, B](getConst: A) {
39
41
def combine (that : Const [A , B ])(implicit A : Semigroup [A ]): Const [A , B ] =
40
42
Const (A .combine(getConst, that.getConst))
41
43
44
+ @ nowarn(" cat=unused" )
42
45
def traverse [F [_], C ](f : B => F [C ])(implicit F : Applicative [F ]): F [Const [A , C ]] =
43
46
F .pure(retag[C ])
44
47
@@ -51,6 +54,9 @@ final case class Const[A, B](getConst: A) {
51
54
def compare (that : Const [A , B ])(implicit A : Order [A ]): Int =
52
55
A .compare(getConst, that.getConst)
53
56
57
+ def hash (implicit A : Hash [A ]): Int =
58
+ Const (A .hash(getConst)).hashCode()
59
+
54
60
def show (implicit A : Show [A ]): String =
55
61
s " Const( ${A .show(getConst)}) "
56
62
}
@@ -92,17 +98,19 @@ sealed abstract private[data] class ConstInstances extends ConstInstances0 {
92
98
93
99
implicit def catsDataOrderForConst [A : Order , B ]: Order [Const [A , B ]] = _ compare _
94
100
101
+ implicit def catsDataPartialOrderForConst [A : PartialOrder , B ]: PartialOrder [Const [A , B ]] = _ partialCompare _
102
+
95
103
implicit def catsDataAlignForConst [A : Semigroup ]: Align [Const [A , * ]] =
96
104
new Align [Const [A , * ]] {
97
105
def align [B , C ](fa : Const [A , B ], fb : Const [A , C ]): Const [A , Ior [B , C ]] =
98
106
Const (Semigroup [A ].combine(fa.getConst, fb.getConst))
99
- def functor : Functor [Const [A , * ]] = catsDataFunctorForConst
107
+ def functor : Functor [Const [A , * ]] = catsDataTraverseForConst
100
108
}
101
109
102
110
implicit def catsDataShowForConst [A : Show , B ]: Show [Const [A , B ]] = _.show
103
111
104
112
implicit def catsDataTraverseForConst [C ]: Traverse [Const [C , * ]] =
105
- new Traverse [Const [C , * ]] {
113
+ new Traverse [Const [C , * ]] with ConstFunctor [ C ] {
106
114
def foldLeft [A , B ](fa : Const [C , A ], b : B )(f : (B , A ) => B ): B = b
107
115
108
116
def foldRight [A , B ](fa : Const [C , A ], lb : Eval [B ])(f : (A , Eval [B ]) => Eval [B ]): Eval [B ] = lb
@@ -121,22 +129,22 @@ sealed abstract private[data] class ConstInstances extends ConstInstances0 {
121
129
implicit def catsDataTraverseFilterForConst [C ]: TraverseFilter [Const [C , * ]] =
122
130
new TraverseFilter [Const [C , * ]] {
123
131
124
- override def mapFilter [A , B ](fa : Const [C , A ])(f : ( A ) => Option [B ]): Const [C , B ] = fa.retag
132
+ override def mapFilter [A , B ](fa : Const [C , A ])(f : A => Option [B ]): Const [C , B ] = fa.retag
125
133
126
134
override def collect [A , B ](fa : Const [C , A ])(f : PartialFunction [A , B ]): Const [C , B ] = fa.retag
127
135
128
136
override def flattenOption [A ](fa : Const [C , Option [A ]]): Const [C , A ] = fa.retag
129
137
130
- override def filter [A ](fa : Const [C , A ])(f : ( A ) => Boolean ): Const [C , A ] = fa.retag
138
+ override def filter [A ](fa : Const [C , A ])(f : A => Boolean ): Const [C , A ] = fa.retag
131
139
132
140
override def filterNot [A ](fa : Const [C , A ])(f : A => Boolean ): Const [C , A ] = fa.retag
133
141
134
142
def traverseFilter [G [_], A , B ](
135
143
fa : Const [C , A ]
136
- )(f : ( A ) => G [Option [B ]])(implicit G : Applicative [G ]): G [Const [C , B ]] =
144
+ )(f : A => G [Option [B ]])(implicit G : Applicative [G ]): G [Const [C , B ]] =
137
145
G .pure(fa.retag[B ])
138
146
139
- override def filterA [G [_], A ](fa : Const [C , A ])(f : ( A ) => G [Boolean ])(implicit G : Applicative [G ]): G [Const [C , A ]] =
147
+ override def filterA [G [_], A ](fa : Const [C , A ])(f : A => G [Boolean ])(implicit G : Applicative [G ]): G [Const [C , A ]] =
140
148
G .pure(fa)
141
149
142
150
val traverse : Traverse [Const [C , * ]] = Const .catsDataTraverseForConst[C ]
@@ -151,6 +159,8 @@ sealed abstract private[data] class ConstInstances extends ConstInstances0 {
151
159
x.combine(y)
152
160
}
153
161
162
+ implicit def catsDataSemigroupForConst [A : Semigroup , B ]: Semigroup [Const [A , B ]] = _ combine _
163
+
154
164
implicit val catsDataBifoldableForConst : Bifoldable [Const ] =
155
165
new Bifoldable [Const ] {
156
166
def bifoldLeft [A , B , C ](fab : Const [A , B ], c : C )(f : (C , A ) => C , g : (C , B ) => C ): C =
@@ -161,10 +171,26 @@ sealed abstract private[data] class ConstInstances extends ConstInstances0 {
161
171
): Eval [C ] =
162
172
f(fab.getConst, c)
163
173
}
174
+
175
+ implicit def catsDataMonoidKForConst [C : Monoid ]: MonoidK [Const [C , * ]] = new MonoidK [Const [C , * ]] {
176
+ override def empty [A ]: Const [C , A ] = Const .empty
177
+ override def combineK [A ](x : Const [C , A ], y : Const [C , A ]): Const [C , A ] = x.combine(y)
178
+ }
179
+
180
+ implicit def catsDataSemigroupKForConst [C : Semigroup ]: SemigroupK [Const [C , * ]] = new SemigroupK [Const [C , * ]] {
181
+ override def combineK [A ](x : Const [C , A ], y : Const [C , A ]): Const [C , A ] = x.combine(y)
182
+ }
164
183
}
165
184
166
185
sealed abstract private [data] class ConstInstances0 extends ConstInstances1 {
167
186
187
+ implicit def catsDataEqForConst [A : Eq , B ]: Eq [Const [A , B ]] = _ === _
188
+
189
+ implicit def catsDataHashForConst [A : Hash , B ]: Hash [Const [A , B ]] = new Hash [Const [A , B ]] {
190
+ override def hash (x : Const [A , B ]): Int = x.hash
191
+ override def eqv (x : Const [A , B ], y : Const [A , B ]): Boolean = x === y
192
+ }
193
+
168
194
implicit def catsDataContravariantMonoidalForConst [D : Monoid ]: ContravariantMonoidal [Const [D , * ]] =
169
195
new ContravariantMonoidal [Const [D , * ]] {
170
196
override def unit = Const .empty[D , Unit ]
@@ -174,46 +200,51 @@ sealed abstract private[data] class ConstInstances0 extends ConstInstances1 {
174
200
fa.retag[(A , B )].combine(fb.retag[(A , B )])
175
201
}
176
202
177
- implicit def catsDataCommutativeApplicativeForConst [C ](implicit
178
- C : CommutativeMonoid [C ]
179
- ): CommutativeApplicative [Const [C , * ]] =
180
- new ConstApplicative [C ] with CommutativeApplicative [Const [C , * ]] { val C0 : CommutativeMonoid [C ] = C }
203
+ implicit def catsDataContravariantSemigroupalForConst [D : Semigroup ]: ContravariantSemigroupal [Const [D , * ]] =
204
+ new ContravariantSemigroupal [Const [D , * ]] {
205
+ override def contramap [A , B ](fa : Const [D , A ])(f : B => A ): Const [D , B ] =
206
+ fa.retag[B ]
207
+ override def product [A , B ](fa : Const [D , A ], fb : Const [D , B ]): Const [D , (A , B )] =
208
+ fa.retag[(A , B )].combine(fb.retag[(A , B )])
209
+ }
181
210
}
182
211
183
212
sealed abstract private [data] class ConstInstances1 extends ConstInstances2 {
184
213
214
+ implicit def catsDataCommutativeApplicativeForConst [C ](implicit
215
+ C : CommutativeMonoid [C ]
216
+ ): CommutativeApplicative [Const [C , * ]] =
217
+ new ConstApplicative [C ] with CommutativeApplicative [Const [C , * ]] {
218
+ val C0 : CommutativeMonoid [C ] = C
219
+ }
220
+
185
221
implicit def catsDataCommutativeApplyForConst [C ](implicit C : CommutativeSemigroup [C ]): CommutativeApply [Const [C , * ]] =
186
222
new ConstApply [C ] with CommutativeApply [Const [C , * ]] { val C0 : CommutativeSemigroup [C ] = C }
187
223
}
188
224
189
225
sealed abstract private [data] class ConstInstances2 extends ConstInstances3 {
190
226
191
- implicit def catsDataSemigroupForConst [A : Semigroup , B ]: Semigroup [Const [A , B ]] = _ combine _
192
-
193
- implicit def catsDataPartialOrderForConst [A : PartialOrder , B ]: PartialOrder [Const [A , B ]] = _ partialCompare _
194
-
195
227
implicit def catsDataApplicativeForConst [C ](implicit C : Monoid [C ]): Applicative [Const [C , * ]] =
196
228
new ConstApplicative [C ] { val C0 : Monoid [C ] = C }
197
- }
198
-
199
- sealed abstract private [data] class ConstInstances3 extends ConstInstances4 {
200
- implicit def catsDataEqForConst [A : Eq , B ]: Eq [Const [A , B ]] = _ === _
201
229
202
230
implicit def catsDataApplyForConst [C ](implicit C : Semigroup [C ]): Apply [Const [C , * ]] =
203
231
new ConstApply [C ] { val C0 : Semigroup [C ] = C }
204
232
}
205
233
206
- sealed abstract private [data] class ConstInstances4 {
234
+ sealed abstract private [data] class ConstInstances3 extends ConstInstances4 {
207
235
208
- implicit def catsDataFunctorForConst [C ]: Functor [Const [C , * ]] =
236
+ @ deprecated(" Use catsDataTraverseForConst instead" , " 2.10.0" )
237
+ def catsDataFunctorForConst [C ]: Functor [Const [C , * ]] =
209
238
new ConstFunctor [C ] {}
210
239
211
240
implicit def catsDataContravariantForConst [C ]: Contravariant [Const [C , * ]] =
212
241
new ConstContravariant [C ] {}
213
242
}
214
243
244
+ sealed abstract private [data] class ConstInstances4
245
+
215
246
sealed private [data] trait ConstFunctor [C ] extends Functor [Const [C , * ]] {
216
- def map [A , B ](fa : Const [C , A ])(f : A => B ): Const [C , B ] =
247
+ final override def map [A , B ](fa : Const [C , A ])(f : A => B ): Const [C , B ] =
217
248
fa.retag[B ]
218
249
}
219
250
@@ -233,7 +264,7 @@ sealed private[data] trait ConstApply[C] extends ConstFunctor[C] with Apply[Cons
233
264
fa.retag[(A , B )].combine(fb.retag[(A , B )])
234
265
}
235
266
236
- sealed private [data] trait ConstApplicative [C ] extends ConstApply [ C ] with Applicative [Const [C , * ]] {
267
+ sealed private [data] trait ConstApplicative [C ] extends Applicative [Const [C , * ]] with ConstApply [ C ] {
237
268
238
269
implicit def C0 : Monoid [C ]
239
270
0 commit comments