diff --git a/core/src/main/scala/cats/data/Chain.scala b/core/src/main/scala/cats/data/Chain.scala index a09d27c526..0eed880a20 100644 --- a/core/src/main/scala/cats/data/Chain.scala +++ b/core/src/main/scala/cats/data/Chain.scala @@ -539,6 +539,11 @@ object Chain extends ChainInstances { c.uncons } + object :== { + def unapply[T](c: Chain[T]): Option[(Chain[T], T)] = + c.initLast + } + /** Empty Chain. */ val nil: Chain[Nothing] = Empty diff --git a/tests/src/test/scala/cats/tests/ChainSuite.scala b/tests/src/test/scala/cats/tests/ChainSuite.scala index ca22f17003..65834aa67f 100644 --- a/tests/src/test/scala/cats/tests/ChainSuite.scala +++ b/tests/src/test/scala/cats/tests/ChainSuite.scala @@ -3,6 +3,7 @@ package tests import cats.data.Chain import cats.data.Chain.==: +import cats.data.Chain.`:==` import cats.laws.discipline.{ AlternativeTests, CoflatMapTests, @@ -75,7 +76,7 @@ class ChainSuite extends CatsSuite { } } - test("list-like pattern match") { + test("seq-like pattern match") { Chain(1, 2, 3) match { case Chain(a, b, c) => (a, b, c) should ===((1, 2, 3)) } @@ -84,6 +85,10 @@ class ChainSuite extends CatsSuite { case h ==: t => (h, t) should ===(1 -> Chain(2, 3)) } + Chain(1, 2, 3) match { + case init :== last => (init, last) should ===(Chain(1, 2) -> 3) + } + } test("size is consistent with toList.size") {