Skip to content

Commit

Permalink
Add Semigroup and Monoid instances for Const
Browse files Browse the repository at this point in the history
(cherry picked from commit 7ed5b32)
  • Loading branch information
puffnfresh authored and xuwei-k committed Sep 16, 2015
1 parent 32215aa commit e7879b7
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions core/src/main/scala/scalaz/Const.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@ package scalaz

final case class Const[A, B](getConst: A)

private sealed trait ConstSemigroup[A, B] extends Semigroup[Const[A, B]] {
def A: Semigroup[A]

override def append(f1: Const[A, B], f2: => Const[A, B]): Const[A, B] =
Const(A.append(f1.getConst, f2.getConst))
}

private sealed trait ConstMonoid[A, B] extends Monoid[Const[A, B]] with ConstSemigroup[A, B] {
def A: Monoid[A]

override def zero: Const[A, B] =
Const(A.zero)
}

private sealed trait ConstFunctor[C] extends Functor[({type λ[α] = Const[C, α]})#λ]{
override def map[A, B](fa: Const[C, A])(f: A => B): Const[C, B] = Const(fa.getConst)
}
Expand Down Expand Up @@ -52,6 +66,11 @@ sealed abstract class ConstInstances0 extends ConstInstances1 {
val OA: Equal[A] = implicitly
}

implicit def constSemigroup[A: Semigroup, B]: Semigroup[Const[A, B]] =
new ConstSemigroup[A, B] {
val A: Semigroup[A] = implicitly
}

implicit def constApply[C: Semigroup]: Apply[({type λ[α] = Const[C, α]})#λ] = new ConstApply[C] {
val C: Semigroup[C] = implicitly
}
Expand All @@ -62,6 +81,11 @@ sealed abstract class ConstInstances extends ConstInstances0 {
val OA: Order[A] = implicitly
}

implicit def constMonoid[A: Monoid, B]: Monoid[Const[A, B]] =
new ConstMonoid[A, B] {
val A: Monoid[A] = implicitly
}

implicit def constApplicative[C: Monoid]: Applicative[({type λ[α] = Const[C, α]})#λ] = new ConstApplicative[C] {
val C: Monoid[C] = implicitly
}
Expand Down

0 comments on commit e7879b7

Please sign in to comment.