diff --git a/build.sbt b/build.sbt index a5272d7c..34f15e1f 100644 --- a/build.sbt +++ b/build.sbt @@ -47,6 +47,8 @@ lazy val commonSettings = Seq( username, password)).toSeq, + resolvers += + "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots" ) lazy val root = Project("desert", file(".")) @@ -71,7 +73,7 @@ lazy val core = CrossProject("desert-core", file("desert-core"))(JVMPlatform, JS description := "A Scala binary serialization library", libraryDependencies ++= Seq( "org.scala-lang" % "scala-reflect" % scalaVersion.value, - "dev.zio" %% "zio-prelude" % "1.0.0-RC1", + "dev.zio" %% "zio-prelude" % "1.0.0-RC5", "com.chuusai" %% "shapeless" % "2.3.7", ), ) diff --git a/desert-core/src/main/scala/io/github/vigoo/desert/BinaryCodec.scala b/desert-core/src/main/scala/io/github/vigoo/desert/BinaryCodec.scala index 78cfb901..03d62545 100644 --- a/desert-core/src/main/scala/io/github/vigoo/desert/BinaryCodec.scala +++ b/desert-core/src/main/scala/io/github/vigoo/desert/BinaryCodec.scala @@ -20,7 +20,7 @@ trait BinarySerializer[T] { self => object BinarySerializer { final case class SerializationEnv(output: BinaryOutput, typeRegistry: TypeRegistry) - type Ser[T] = ZPure[SerializerState, SerializerState, SerializationEnv, DesertFailure, T] + type Ser[T] = ZPure[Nothing, SerializerState, SerializerState, SerializationEnv, DesertFailure, T] object Ser { final def fromEither[T](value: Either[DesertFailure, T]): Ser[T] = @@ -39,7 +39,7 @@ trait BinaryDeserializer[T] { self => object BinaryDeserializer { final case class DeserializationEnv(input: BinaryInput, typeRegistry: TypeRegistry) - type Deser[T] = ZPure[SerializerState, SerializerState, DeserializationEnv, DesertFailure, T] + type Deser[T] = ZPure[Nothing, SerializerState, SerializerState, DeserializationEnv, DesertFailure, T] object Deser { final def fromEither[T](value: Either[DesertFailure, T]): Deser[T] = diff --git a/desert-core/src/main/scala/io/github/vigoo/desert/GenericBinaryCodec.scala b/desert-core/src/main/scala/io/github/vigoo/desert/GenericBinaryCodec.scala index 9925b5ac..8d34ef98 100644 --- a/desert-core/src/main/scala/io/github/vigoo/desert/GenericBinaryCodec.scala +++ b/desert-core/src/main/scala/io/github/vigoo/desert/GenericBinaryCodec.scala @@ -609,8 +609,10 @@ class GenericBinaryCodec(evolutionSteps: Vector[Evolution]) extends GenericDeriv finalState <- Ser.fromEither( serializer.value.serialize(taggedTransients.tag(genericValue)) .provide(chunkedOutput) - .runEither(initialState)) - .map(_._1) // state + .getState + .map(_._1) + .either + .runResult(initialState)) _ <- chunkedOutput.writeEvolutionHeader(finalState.fieldIndices) _ <- chunkedOutput.writeOrderedChunks() _ <- setSerializerState(finalState.serializerState) @@ -634,7 +636,9 @@ class GenericBinaryCodec(evolutionSteps: Vector[Evolution]) extends GenericDeriv transientFields) result <- Deser.fromEither(deserializer.value.deserialize() .provide(chunkedInput) - .runEither(initialState)) + .getState + .either + .runResult(initialState)) (finalState, hlist) = result _ <- setDeserializerState(finalState.serializerState) } yield gen.from(taggedTransients.untag(hlist)) @@ -843,7 +847,7 @@ object GenericBinaryCodec { transientFields: Map[Symbol, Any] ) - type ChunkedSer[T] = ZPure[ChunkedSerState, ChunkedSerState, ChunkedOutput, DesertFailure, T] + type ChunkedSer[T] = ZPure[Nothing, ChunkedSerState, ChunkedSerState, ChunkedOutput, DesertFailure, T] object ChunkedSerOps { final def getChunkedOutput: ChunkedSer[ChunkedOutput] = ZPure.environment @@ -860,7 +864,9 @@ object GenericBinaryCodec { chunkedState <- getChunkedState runResult <- fromEither(value .provide(SerializationEnv(output, chunkedState.typeRegistry)) - .runEither(chunkedState.serializerState)) + .getState + .either + .runResult(chunkedState.serializerState)) (resultState, result) = runResult _ <- setChunkedState(chunkedState.copy(serializerState = resultState)) } yield result @@ -905,7 +911,7 @@ object GenericBinaryCodec { def inputFor(version: Byte): Either[DesertFailure, BinaryInput] } - type ChunkedDeser[T] = ZPure[ChunkedSerState, ChunkedSerState, ChunkedInput, DesertFailure, T] + type ChunkedDeser[T] = ZPure[Nothing, ChunkedSerState, ChunkedSerState, ChunkedInput, DesertFailure, T] object ChunkedDeserOps { final def getChunkedInput: ChunkedDeser[ChunkedInput] = ZPure.environment @@ -921,7 +927,9 @@ object GenericBinaryCodec { chunkedState <- getChunkedState runResult <- fromEither(value .provide(DeserializationEnv(input, chunkedState.typeRegistry)) - .runEither(chunkedState.serializerState)) + .getState + .either + .runResult(chunkedState.serializerState)) (resultState, result) = runResult _ <- setChunkedState(chunkedState.copy(serializerState = resultState)) } yield result diff --git a/desert-core/src/main/scala/io/github/vigoo/desert/codecs.scala b/desert-core/src/main/scala/io/github/vigoo/desert/codecs.scala index 73b9b165..8ee39e1e 100644 --- a/desert-core/src/main/scala/io/github/vigoo/desert/codecs.scala +++ b/desert-core/src/main/scala/io/github/vigoo/desert/codecs.scala @@ -100,7 +100,7 @@ object codecs { lsb <- readLong() } yield new UUID(msb, lsb)) - implicit def optionCodec[T : BinaryCodec]: BinaryCodec[Option[T]] = new BinaryCodec[Option[T]] { + implicit def optionCodec[T: BinaryCodec]: BinaryCodec[Option[T]] = new BinaryCodec[Option[T]] { override def deserialize(): Deser[Option[T]] = { for { isDefined <- read[Boolean]() @@ -137,6 +137,7 @@ object codecs { ) implicit def persistedThrowableCodec: BinaryCodec[PersistedThrowable] = BinaryCodec.deriveF() { api => import api._; derive } + implicit val throwableCodec: BinaryCodec[Throwable] = BinaryCodec.from( persistedThrowableCodec.contramap(PersistedThrowable.apply), persistedThrowableCodec.map(persisted => persisted) @@ -144,7 +145,7 @@ object codecs { // Collections - def iterableCodec[A : BinaryCodec, T <: Iterable[A]](implicit factory: Factory[A, T]): BinaryCodec[T] = new BinaryCodec[T] { + def iterableCodec[A: BinaryCodec, T <: Iterable[A]](implicit factory: Factory[A, T]): BinaryCodec[T] = new BinaryCodec[T] { override def deserialize(): Deser[T] = { for { knownSize <- readVarInt(optimizeForPositive = false) @@ -209,42 +210,69 @@ object codecs { } implicit def wrappedArrayCodec[A: BinaryCodec : ClassTag]: BinaryCodec[ArraySeq[A]] = iterableCodec[A, ArraySeq[A]] + implicit def arrayCodec[A: BinaryCodec : ClassTag]: BinaryCodec[Array[A]] = BinaryCodec.from( wrappedArrayCodec.contramap(arr => ArraySeq.unsafeWrapArray(arr)), wrappedArrayCodec.map(_.toArray[A]) ) - implicit def listCodec[A : BinaryCodec]: BinaryCodec[List[A]] = iterableCodec[A, List[A]] - implicit def vectorCodec[A : BinaryCodec]: BinaryCodec[Vector[A]] = iterableCodec[A, Vector[A]] - implicit def setCodec[A : BinaryCodec]: BinaryCodec[Set[A]] = iterableCodec[A, Set[A]] - implicit def sortedSetCodec[A : BinaryCodec : Ordering]: BinaryCodec[SortedSet[A]] = iterableCodec[A, SortedSet[A]] + + implicit def listCodec[A: BinaryCodec]: BinaryCodec[List[A]] = iterableCodec[A, List[A]] + + implicit def vectorCodec[A: BinaryCodec]: BinaryCodec[Vector[A]] = iterableCodec[A, Vector[A]] + + implicit def setCodec[A: BinaryCodec]: BinaryCodec[Set[A]] = iterableCodec[A, Set[A]] + + implicit def sortedSetCodec[A: BinaryCodec : Ordering]: BinaryCodec[SortedSet[A]] = iterableCodec[A, SortedSet[A]] // Tuples - implicit def tuple1Codec[T1 : BinaryCodec]: BinaryCodec[Tuple1[T1]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple2Codec[T1 : BinaryCodec, T2: BinaryCodec]: BinaryCodec[Tuple2[T1, T2]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple3Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec]: BinaryCodec[Tuple3[T1, T2, T3]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple4Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec]: BinaryCodec[Tuple4[T1, T2, T3, T4]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple5Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec]: BinaryCodec[Tuple5[T1, T2, T3, T4, T5]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple6Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec]: BinaryCodec[Tuple6[T1, T2, T3, T4, T5, T6]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple7Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec]: BinaryCodec[Tuple7[T1, T2, T3, T4, T5, T6, T7]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple8Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec]: BinaryCodec[Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple9Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec]: BinaryCodec[Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple10Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec]: BinaryCodec[Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple11Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec]: BinaryCodec[Tuple11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple12Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec]: BinaryCodec[Tuple12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple13Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec]: BinaryCodec[Tuple13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple14Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec]: BinaryCodec[Tuple14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple15Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec]: BinaryCodec[Tuple15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple16Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec]: BinaryCodec[Tuple16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple17Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec]: BinaryCodec[Tuple17[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple18Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec]: BinaryCodec[Tuple18[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple19Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec, T19: BinaryCodec]: BinaryCodec[Tuple19[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple20Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec, T19: BinaryCodec, T20: BinaryCodec]: BinaryCodec[Tuple20[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple21Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec, T19: BinaryCodec, T20: BinaryCodec, T21: BinaryCodec]: BinaryCodec[Tuple21[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21]] = BinaryCodec.deriveF() { api => import api._; derive } - implicit def tuple22Codec[T1 : BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec, T19: BinaryCodec, T20: BinaryCodec, T21: BinaryCodec, T22: BinaryCodec]: BinaryCodec[Tuple22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22]] = BinaryCodec.deriveF() { api => import api._; derive } - - implicit def mapCodec[K : BinaryCodec, V: BinaryCodec]: BinaryCodec[Map[K, V]] = iterableCodec[(K, V), Map[K, V]] - implicit def sortedMapCodec[K : BinaryCodec : Ordering, V: BinaryCodec]: BinaryCodec[SortedMap[K, V]] = iterableCodec[(K, V), SortedMap[K, V]] + implicit def tuple1Codec[T1: BinaryCodec]: BinaryCodec[Tuple1[T1]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple2Codec[T1: BinaryCodec, T2: BinaryCodec]: BinaryCodec[Tuple2[T1, T2]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple3Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec]: BinaryCodec[Tuple3[T1, T2, T3]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple4Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec]: BinaryCodec[Tuple4[T1, T2, T3, T4]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple5Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec]: BinaryCodec[Tuple5[T1, T2, T3, T4, T5]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple6Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec]: BinaryCodec[Tuple6[T1, T2, T3, T4, T5, T6]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple7Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec]: BinaryCodec[Tuple7[T1, T2, T3, T4, T5, T6, T7]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple8Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec]: BinaryCodec[Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple9Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec]: BinaryCodec[Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple10Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec]: BinaryCodec[Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple11Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec]: BinaryCodec[Tuple11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple12Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec]: BinaryCodec[Tuple12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple13Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec]: BinaryCodec[Tuple13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple14Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec]: BinaryCodec[Tuple14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple15Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec]: BinaryCodec[Tuple15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple16Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec]: BinaryCodec[Tuple16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple17Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec]: BinaryCodec[Tuple17[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple18Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec]: BinaryCodec[Tuple18[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple19Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec, T19: BinaryCodec]: BinaryCodec[Tuple19[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple20Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec, T19: BinaryCodec, T20: BinaryCodec]: BinaryCodec[Tuple20[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple21Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec, T19: BinaryCodec, T20: BinaryCodec, T21: BinaryCodec]: BinaryCodec[Tuple21[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def tuple22Codec[T1: BinaryCodec, T2: BinaryCodec, T3: BinaryCodec, T4: BinaryCodec, T5: BinaryCodec, T6: BinaryCodec, T7: BinaryCodec, T8: BinaryCodec, T9: BinaryCodec, T10: BinaryCodec, T11: BinaryCodec, T12: BinaryCodec, T13: BinaryCodec, T14: BinaryCodec, T15: BinaryCodec, T16: BinaryCodec, T17: BinaryCodec, T18: BinaryCodec, T19: BinaryCodec, T20: BinaryCodec, T21: BinaryCodec, T22: BinaryCodec]: BinaryCodec[Tuple22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22]] = BinaryCodec.deriveF() { api => import api._; derive } + + implicit def mapCodec[K: BinaryCodec, V: BinaryCodec]: BinaryCodec[Map[K, V]] = iterableCodec[(K, V), Map[K, V]] + + implicit def sortedMapCodec[K: BinaryCodec : Ordering, V: BinaryCodec]: BinaryCodec[SortedMap[K, V]] = iterableCodec[(K, V), SortedMap[K, V]] implicit def eitherCodec[L: BinaryCodec, R: BinaryCodec]: BinaryCodec[Either[L, R]] = new BinaryCodec[Either[L, R]] { override def deserialize(): Deser[Either[L, R]] = { @@ -280,18 +308,18 @@ object codecs { // ZIO prelude specific codecs - implicit def nonEmptyChunkCodec[A : BinaryCodec]: BinaryCodec[NonEmptyChunk[A]] = { - val inner = iterableCodec[A, Chunk[A]] - BinaryCodec.from( - inner.contramap(_.toChunk), - () => inner.deserialize().flatMap { chunk => - NonEmptyChunk.fromChunk(chunk) match { - case Some(nonEmptyChunk) => finishDeserializerWith(nonEmptyChunk) - case None => failDeserializerWith(DeserializationFailure("Non empty chunk is serialized as empty", None)) - } + implicit def nonEmptyChunkCodec[A: BinaryCodec]: BinaryCodec[NonEmptyChunk[A]] = { + val inner = iterableCodec[A, Chunk[A]] + BinaryCodec.from( + inner.contramap(_.toChunk), + () => inner.deserialize().flatMap { chunk => + NonEmptyChunk.fromChunk(chunk) match { + case Some(nonEmptyChunk) => finishDeserializerWith(nonEmptyChunk) + case None => failDeserializerWith(DeserializationFailure("Non empty chunk is serialized as empty", None)) } - ) - } + } + ) + } implicit def validationCodec[E: BinaryCodec, A: BinaryCodec]: BinaryCodec[Validation[E, A]] = new BinaryCodec[Validation[E, A]] { override def deserialize(): Deser[Validation[E, A]] = { @@ -299,16 +327,18 @@ object codecs { isValid <- read[Boolean]() result <- if (isValid) - read[A]().map(Validation.Success.apply) + read[A]().map(Validation.succeed[A]) else - read[NonEmptyChunk[E]]().map(Validation.Failure.apply) + read[NonEmptyChunk[E]]().map { errors => + Validation.collectAllPar(errors.map(Validation.fail)).map(x => x.asInstanceOf[A]) + } } yield result } override def serialize(value: Validation[E, A]): Ser[Unit] = { value match { - case Validation.Failure(value) => write(false) *> write(value) - case Validation.Success(value) => write(true) *> write(value) + case Validation.Failure(_, value) => write(false) *> write(value) + case Validation.Success(_, value) => write(true) *> write(value) } } } @@ -324,7 +354,7 @@ object codecs { ) } - implicit def zsetCodec[A: BinaryCodec, B : BinaryCodec]: BinaryCodec[ZSet[A, B]] = { + implicit def zsetCodec[A: BinaryCodec, B: BinaryCodec]: BinaryCodec[ZSet[A, B]] = { val inner = mapCodec[A, B] BinaryCodec.from( inner.contramap(_.toMap),