Skip to content

Commit ae51ce5

Browse files
authored
Merge pull request #1354 from vectos/fristi/add-ior-monoid
Add semigroup instance for Ior
2 parents 01e7444 + 4ff06d4 commit ae51ce5

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ private[data] sealed abstract class IorInstances extends IorInstances0 {
140140
def show(f: A Ior B): String = f.show
141141
}
142142

143+
implicit def catsDataSemigroupForIor[A: Semigroup, B: Semigroup]: Semigroup[Ior[A, B]] = new Semigroup[Ior[A, B]] {
144+
def combine(x: Ior[A, B], y: Ior[A, B]) = x.append(y)
145+
}
146+
143147
implicit def catsDataMonadForIor[A: Semigroup]: Monad[A Ior ?] with RecursiveTailRecM[A Ior ?] = new Monad[A Ior ?] with RecursiveTailRecM[A Ior ?] {
144148
def pure[B](b: B): A Ior B = Ior.right(b)
145149
def flatMap[B, C](fa: A Ior B)(f: B => A Ior C): A Ior C = fa.flatMap(f)

tests/src/test/scala/cats/tests/IorTests.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package cats
22
package tests
33

44
import cats.data.Ior
5-
import cats.laws.discipline.{BifunctorTests, TraverseTests, MonadTests, SerializableTests, CartesianTests}
5+
import cats.kernel.laws.GroupLaws
6+
import cats.laws.discipline.{BifunctorTests, CartesianTests, MonadTests, SerializableTests, TraverseTests}
67
import cats.laws.discipline.arbitrary._
78
import org.scalacheck.Arbitrary._
89

@@ -20,6 +21,9 @@ class IorTests extends CatsSuite {
2021
checkAll("Traverse[String Ior ?]", SerializableTests.serializable(Traverse[String Ior ?]))
2122
checkAll("? Ior ?", BifunctorTests[Ior].bifunctor[Int, Int, Int, String, String, String])
2223

24+
checkAll("Semigroup[Ior[A: Semigroup, B: Semigroup]]", GroupLaws[Ior[List[Int], List[Int]]].semigroup)
25+
checkAll("SerializableTest Semigroup[Ior[A: Semigroup, B: Semigroup]]", SerializableTests.serializable(Semigroup[Ior[List[Int], List[Int]]]))
26+
2327
test("left Option is defined left and both") {
2428
forAll { (i: Int Ior String) =>
2529
(i.isLeft || i.isBoth) should === (i.left.isDefined)

0 commit comments

Comments
 (0)