From 1d3f7e4e081ac9f8e77d9368ede85b4215c51159 Mon Sep 17 00:00:00 2001 From: nikiforo Date: Fri, 19 Feb 2021 14:47:09 +0300 Subject: [PATCH] Chain add fromOption factory method --- bench/src/main/scala-2.12/cats/bench/ChainBench.scala | 4 ++++ core/src/main/scala/cats/data/Chain.scala | 6 ++++++ tests/src/test/scala/cats/tests/ChainSuite.scala | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/bench/src/main/scala-2.12/cats/bench/ChainBench.scala b/bench/src/main/scala-2.12/cats/bench/ChainBench.scala index bf19910d6f..8cab9e7a3f 100644 --- a/bench/src/main/scala-2.12/cats/bench/ChainBench.scala +++ b/bench/src/main/scala-2.12/cats/bench/ChainBench.scala @@ -8,6 +8,7 @@ import org.openjdk.jmh.annotations.{Benchmark, Scope, State} @State(Scope.Thread) class ChainBench { + private val intOption = Option(1) private val smallChain = Chain(1, 2, 3, 4, 5) private val smallCatenable = Catenable(1, 2, 3, 4, 5) private val smallVector = Vector(1, 2, 3, 4, 5) @@ -63,4 +64,7 @@ class ChainBench { @Benchmark def createSmallVector: Vector[Int] = Vector(1, 2, 3, 4, 5) @Benchmark def createSmallList: List[Int] = List(1, 2, 3, 4, 5) @Benchmark def createSmallOldChain: OldChain[Int] = OldChain(Seq(1, 2, 3, 4, 5)) + + @Benchmark def createChainSeqOption: Chain[Int] = Chain.fromSeq(intOption.toSeq) + @Benchmark def createChainOption: Chain[Int] = Chain.fromOption(intOption) } diff --git a/core/src/main/scala/cats/data/Chain.scala b/core/src/main/scala/cats/data/Chain.scala index 707152ecbe..c3327a591c 100644 --- a/core/src/main/scala/cats/data/Chain.scala +++ b/core/src/main/scala/cats/data/Chain.scala @@ -759,6 +759,12 @@ object Chain extends ChainInstances { case _ => c2 } + /** + * Creates a Chain from the specified option. + */ + def fromOption[A](o: Option[A]): Chain[A] = + o.fold(Chain.empty[A])(Chain.one) + /** * Creates a Chain from the specified sequence. */ diff --git a/tests/src/test/scala/cats/tests/ChainSuite.scala b/tests/src/test/scala/cats/tests/ChainSuite.scala index 7b9a3bcd55..2fca934ee1 100644 --- a/tests/src/test/scala/cats/tests/ChainSuite.scala +++ b/tests/src/test/scala/cats/tests/ChainSuite.scala @@ -90,6 +90,12 @@ class ChainSuite extends CatsSuite { } } + test("fromOption") { + forAll { (o: Option[Int]) => + assert(Chain.fromOption(o).toList == o.toList) + } + } + test("seq-like pattern match") { Chain(1, 2, 3) match { case Chain(a, b, c) => assert((a, b, c) === ((1, 2, 3)))