diff --git a/core/shared/src/main/scala-2.12/plotly/MutableSequenceImplicitConversions.scala b/core/shared/src/main/scala-2.12/plotly/MutableSequenceImplicitConversions.scala new file mode 100644 index 0000000..0e4650c --- /dev/null +++ b/core/shared/src/main/scala-2.12/plotly/MutableSequenceImplicitConversions.scala @@ -0,0 +1,5 @@ +package plotly + +trait MutableSequenceImplicitConversions { + // Unneccessary in Scala 2.12, since the `Seq` alias refers to the supertype for mutable and immutable sequences +} diff --git a/core/shared/src/main/scala-2.13/plotly/MutableSequenceImplicitConversions.scala b/core/shared/src/main/scala-2.13/plotly/MutableSequenceImplicitConversions.scala new file mode 100644 index 0000000..5edd50c --- /dev/null +++ b/core/shared/src/main/scala-2.13/plotly/MutableSequenceImplicitConversions.scala @@ -0,0 +1,26 @@ +package plotly + +import plotly.Sequence.{DateTimes, Doubles, NestedDoubles, NestedInts, Strings} +import plotly.element.LocalDateTime +import scala.collection.{Seq => BaseScalaSeq} + +trait MutableSequenceImplicitConversions { + + implicit def fromMutableDoubleSeq(s: BaseScalaSeq[Double]): Sequence = + Doubles(s.toSeq) + implicit def fromMutableFloatSeq(s: BaseScalaSeq[Float]): Sequence = + Doubles(s.map(_.toDouble).toSeq) + implicit def fromMutableIntSeq(s: BaseScalaSeq[Int]): Sequence = + Doubles(s.map(_.toDouble).toSeq) + implicit def fromMutableLongSeq(s: BaseScalaSeq[Long]): Sequence = + Doubles(s.map(_.toDouble).toSeq) + implicit def fromMutableNestedDoubleSeq(s: BaseScalaSeq[BaseScalaSeq[Double]]): Sequence = + NestedDoubles(s.map(_.toSeq).toSeq) + implicit def fromMutableNestedIntSeq(s: BaseScalaSeq[BaseScalaSeq[Int]]): Sequence = + NestedInts(s.map(_.toSeq).toSeq) + implicit def fromMutableStringSeq(s: BaseScalaSeq[String]): Sequence = + Strings(s.toSeq) + implicit def fromMutableDateTimes(seq: BaseScalaSeq[LocalDateTime]): Sequence = + DateTimes(seq.toSeq) + +} diff --git a/core/shared/src/main/scala/plotly/Sequence.scala b/core/shared/src/main/scala/plotly/Sequence.scala index db872d4..c206e51 100755 --- a/core/shared/src/main/scala/plotly/Sequence.scala +++ b/core/shared/src/main/scala/plotly/Sequence.scala @@ -4,7 +4,7 @@ import plotly.element.LocalDateTime sealed abstract class Sequence extends Product with Serializable -object Sequence { +object Sequence extends MutableSequenceImplicitConversions { final case class Doubles(seq: Seq[Double]) extends Sequence final case class NestedDoubles(seq: Seq[Seq[Double]]) extends Sequence final case class NestedInts(seq: Seq[Seq[Int]]) extends Sequence diff --git a/tests/src/test/scala/plotly/SequenceTests.scala b/tests/src/test/scala/plotly/SequenceTests.scala new file mode 100644 index 0000000..918e4b3 --- /dev/null +++ b/tests/src/test/scala/plotly/SequenceTests.scala @@ -0,0 +1,31 @@ +package plotly + +import org.scalatest.FlatSpec + +import scala.collection.mutable.ArrayBuffer + +class SequenceTests extends FlatSpec { + + "The implicit sequence conversion" should "convert a List to a Sequence" in { + assert((List(1, 2, 3): Sequence) === Sequence.Doubles(List(1d, 2d, 3d))) + } + + it should "convert a mutable ArrayBuffer to a Sequence" in { + assert((ArrayBuffer(1, 2, 3): Sequence) === Sequence.Doubles(List(1d, 2d, 3d))) + } + + it should "convert a nested mutable ArrayBuffer to a Sequence" in { + val mutableNestedDoubles: ArrayBuffer[ArrayBuffer[Double]] = ArrayBuffer( + ArrayBuffer(1d, 2d), + ArrayBuffer(3d, 4d), + ) + + val nestedDoublesList: List[List[Double]] = List( + List(1d, 2d), + List(3d, 4d), + ) + + assert((mutableNestedDoubles: Sequence) === Sequence.NestedDoubles(nestedDoublesList)) + } + +}