-
Notifications
You must be signed in to change notification settings - Fork 64
/
DerivedMonoid.scala
36 lines (28 loc) · 1.06 KB
/
DerivedMonoid.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package cats.derived
import cats.Monoid
import shapeless3.deriving.K0.*
import scala.annotation.*
import scala.compiletime.*
@implicitNotFound("""Could not derive Monoid for ${A}.
Make sure it is a case class where all fields form Monoid.""")
type DerivedMonoid[A] = Derived[Monoid[A]]
object DerivedMonoid:
type Or[A] = Derived.Or[Monoid[A]]
@nowarn("msg=unused import")
inline def apply[A]: Monoid[A] =
import DerivedMonoid.given
summonInline[DerivedMonoid[A]].instance
@nowarn("msg=unused import")
inline def strict[A]: Monoid[A] =
import Strict.given
summonInline[DerivedMonoid[A]].instance
given [A](using inst: => ProductInstances[Or, A]): DerivedMonoid[A] =
Strict.product(using inst.unify)
trait Product[F[x] <: Monoid[x], A](using inst: ProductInstances[F, A])
extends DerivedSemigroup.Product[F, A],
Monoid[A]:
final override lazy val empty: A =
inst.construct([a] => (F: F[a]) => F.empty)
object Strict:
given product[A: ProductInstancesOf[Monoid]]: DerivedMonoid[A] =
new Product[Monoid, A] {}