From e1c5e77be6a795dc2d02f59d298642e776563546 Mon Sep 17 00:00:00 2001 From: Bondarenko Date: Thu, 15 Aug 2019 13:44:04 +0300 Subject: [PATCH] unapplySeq in Chain (issue #2960) --- core/src/main/scala/cats/data/Chain.scala | 8 ++++++++ tests/src/test/scala/cats/tests/ChainSuite.scala | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/core/src/main/scala/cats/data/Chain.scala b/core/src/main/scala/cats/data/Chain.scala index 03b0a2aaa7..a09d27c526 100644 --- a/core/src/main/scala/cats/data/Chain.scala +++ b/core/src/main/scala/cats/data/Chain.scala @@ -531,6 +531,14 @@ object Chain extends ChainInstances { false // b/c `fromSeq` constructor doesn't allow either branch to be empty } + def unapplySeq[A](chain: Chain[A]): Option[Seq[A]] = + Some(chain.toList) + + object ==: { + def unapply[T](c: Chain[T]): Option[(T, Chain[T])] = + c.uncons + } + /** 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 042a8a86c3..ca22f17003 100644 --- a/tests/src/test/scala/cats/tests/ChainSuite.scala +++ b/tests/src/test/scala/cats/tests/ChainSuite.scala @@ -2,6 +2,7 @@ package cats package tests import cats.data.Chain +import cats.data.Chain.==: import cats.laws.discipline.{ AlternativeTests, CoflatMapTests, @@ -74,6 +75,17 @@ class ChainSuite extends CatsSuite { } } + test("list-like pattern match") { + Chain(1, 2, 3) match { + case Chain(a, b, c) => (a, b, c) should ===((1, 2, 3)) + } + + Chain(1, 2, 3) match { + case h ==: t => (h, t) should ===(1 -> Chain(2, 3)) + } + + } + test("size is consistent with toList.size") { forAll { (ci: Chain[Int]) => ci.size.toInt should ===(ci.toList.size)