diff --git a/modules/core/src/main/scala/mess/codec/Decoder.scala b/modules/core/src/main/scala/mess/codec/Decoder.scala index 9585f3a..3ac68c5 100644 --- a/modules/core/src/main/scala/mess/codec/Decoder.scala +++ b/modules/core/src/main/scala/mess/codec/Decoder.scala @@ -7,6 +7,8 @@ import mess.Fmt import mess.internal.ScalaVersionSpecifics._ import scala.annotation.tailrec +import scala.collection.Seq +import scala.collection.immutable import scala.collection.mutable trait Decoder[A] extends Serializable { self => @@ -128,7 +130,7 @@ private[codec] trait Decoder1 { case Left(e) => Left(e) } - @inline private[this] def decodeContainer[C[_], A](implicit + @inline private def decodeContainer[C[_], A](implicit decodeA: Decoder[A], factoryA: Factory[A, C[A]] ): Decoder[C[A]] = @@ -150,7 +152,8 @@ private[codec] trait Decoder1 { } } - implicit def decodeSeq[A: Decoder]: Decoder[Seq[A]] = decodeContainer[Seq, A] + implicit def decodeSeq[A: Decoder]: Decoder[Seq[A]] = decodeContainer[Seq, A] + implicit def decodeISeq[A: Decoder]: Decoder[immutable.Seq[A]] = decodeContainer[immutable.Seq, A] implicit def decodeSet[A: Decoder]: Decoder[Set[A]] = decodeContainer[Set, A] diff --git a/modules/core/src/main/scala/mess/codec/Encoder.scala b/modules/core/src/main/scala/mess/codec/Encoder.scala index 8f68602..ed6b4b6 100644 --- a/modules/core/src/main/scala/mess/codec/Encoder.scala +++ b/modules/core/src/main/scala/mess/codec/Encoder.scala @@ -5,6 +5,8 @@ import java.time.Instant import mess.Fmt import scala.annotation.tailrec +import scala.collection.Seq +import scala.collection.immutable import scala.collection.mutable trait Encoder[A] extends Serializable { self => @@ -74,6 +76,9 @@ private[codec] trait Encoder1 { implicit final def encodeSeq[A: Encoder]: Encoder.AsArray[Seq[A]] = a => Fmt.MArray(buildVector(a.iterator, Vector.newBuilder)) + implicit final def encodeISeq[A: Encoder]: Encoder.AsArray[immutable.Seq[A]] = + a => Fmt.MArray(buildVector(a.iterator, Vector.newBuilder)) + implicit final def encodeSet[A: Encoder]: Encoder.AsArray[Set[A]] = a => Fmt.MArray(buildVector(a.iterator, Vector.newBuilder)) diff --git a/modules/core/src/test/scala/mess/codec/DecoderSpec.scala b/modules/core/src/test/scala/mess/codec/DecoderSpec.scala index fc185a8..816e793 100644 --- a/modules/core/src/test/scala/mess/codec/DecoderSpec.scala +++ b/modules/core/src/test/scala/mess/codec/DecoderSpec.scala @@ -4,6 +4,9 @@ import mess.Fmt import mess.MsgpackHelper import mess.codec.semiauto._ +import scala.collection.Seq +import scala.collection.immutable + class DecoderSpec extends MsgpackHelper { case class Bar(double: Double) @@ -53,7 +56,7 @@ class DecoderSpec extends MsgpackHelper { test("Decoder[Array[Byte]]") { val m = Fmt.fromBytes(Array(0x11, 0x1a).map(_.toByte)) val xs = decode[Array[Byte]](m).toTry.get - assertEquals(xs.toSeq, Seq(0x11, 0x1a).map(_.toByte)) + assertEquals(xs.toSeq, immutable.Seq(0x11, 0x1a).map(_.toByte)) } test("Decoder[Char] failure") { val msg = Fmt.fromString("ab") @@ -188,6 +191,16 @@ class DecoderSpec extends MsgpackHelper { val msg = Fmt.fromString("") assertEquals(decode[Seq[Int]](msg), Left(TypeMismatchError("C[A]", msg))) } + check("Decoder[immutable.Seq[A]]", + Seq( + (immutable.Seq(0 to 14: _*), Fmt.fromValues((0 to 14).map(Fmt.fromInt): _*)), + (immutable.Seq.empty[Int], Fmt.unit) + ) + ) + test("Decoder[immutable.Seq[A]] failure") { + val msg = Fmt.fromString("") + assertEquals(decode[immutable.Seq[Int]](msg), Left(TypeMismatchError("C[A]", msg))) + } check("Decoder[Tuple2[A]]", Seq( ((1, 2), Fmt.fromValues(Fmt.fromByte(1.toByte), Fmt.fromByte(2.toByte))) diff --git a/modules/core/src/test/scala/mess/codec/EncoderSpec.scala b/modules/core/src/test/scala/mess/codec/EncoderSpec.scala index 4c214c8..2c1be74 100644 --- a/modules/core/src/test/scala/mess/codec/EncoderSpec.scala +++ b/modules/core/src/test/scala/mess/codec/EncoderSpec.scala @@ -4,6 +4,9 @@ import mess.Fmt import mess.MsgpackHelper import org.msgpack.core.MessagePack +import scala.collection.Seq +import scala.collection.immutable + class EncoderSpec extends MsgpackHelper { case class Bar(double: Double) @@ -123,6 +126,13 @@ class EncoderSpec extends MsgpackHelper { (Seq.empty[Int], Fmt.fromValues()) ) ) + check( + "Encoder[immutable.Seq[A]]", + Seq( + (immutable.Seq(0 to 14: _*), Fmt.fromValues((0 to 14).map(a => Fmt.fromByte(a.toByte)): _*)), + (immutable.Seq.empty[Int], Fmt.fromValues()) + ) + ) check("Encoder[List[A]]", Seq( ((0 to 14).toList, Fmt.fromValues((0 to 14).map(a => Fmt.fromByte(a.toByte)): _*))