shapeless: Generic programming for Scala | This room deprecated in favour of #shapeless on the Typelevel Discord: https://discord.gg/bSQBZA3Ced
joroKr21 on main
Update sbt-scalajs, scalajs-com… (compare)
joroKr21 on main
Update scala-parser-combinators… (compare)
joroKr21 on main
Update junit-plugin, junit-runt… (compare)
joroKr21 on main
Update sbt to 1.8.2 (#1296) (compare)
joroKr21 on main
Fixed typo (#1295) (compare)
joroKr21 on main
Update slf4j-nop to 2.0.6 (#129… (compare)
case class Foo
object Foo extends Summoner[Foo]
Foo[A]
has an implicit deriveMsgPack
for A
deriveMsgPack
into the companion object of an example case class and see if it still works
object Module {
import shapeless._
sealed trait Decode[A] {
def decode(s: String): Option[A]
}
object Decode {
def dummy[A]: Decode[A] = new Decode[A] {
def decode(s: String) = Option.empty[A]
}
def apply[A](implicit decoder: Decode[A]): Decode[A] =
decoder
implicit def strings: Decode[String] = dummy[String]
implicit def bools: Decode[Boolean] = dummy[Boolean]
implicit def ints: Decode[Int] = dummy[Int]
implicit def hnil: Decode[HNil] = dummy[HNil]
implicit def hcons[H: Decode, T <: HList: Decode]: Decode[H :: T] =
dummy[H :: T]
implicit def cnil: Decode[CNil] = dummy[CNil]
implicit def ccons[H: Decode, T <: Coproduct: Decode]: Decode[H :+: T] =
dummy[H :+: T]
}
trait DeriveDecoder[F] {
implicit def generics[A <: F, R](implicit gen: Generic.Aux[A, R],
decoder: Decode[R]): Decode[A] = Decode.dummy[A]
}
}
sealed trait A
case class B(s: String, i: Int) extends A
case class C(b: Boolean) extends A
object A extends Module.DeriveDecoder[A]
sealed trait A1
case class B1(s: String, i: Int) extends A1
case class C1(b: Boolean) extends A1
object Test {
import shapeless.test._
val a = Module.Decode[A]
val b = illTyped("Module.Decode[A1]")
// code compiles
}
object Module {
import shapeless._
sealed trait Decode[A] {
def decode(s: String): Option[A]
}
object Decode {
def dummy[A]: Decode[A] = new Decode[A] {
def decode(s: String) = Option.empty[A]
}
def apply[A](implicit decoder: Decode[A]): Decode[A] =
decoder
implicit def strings: Decode[String] = dummy[String]
implicit def bools: Decode[Boolean] = dummy[Boolean]
implicit def ints: Decode[Int] = dummy[Int]
implicit def hnil: Decode[HNil] = dummy[HNil]
implicit def hcons[H: Decode, T <: HList: Decode]: Decode[H :: T] =
dummy[H :: T]
implicit def cnil: Decode[CNil] = dummy[CNil]
implicit def ccons[H: Decode, T <: Coproduct: Decode]: Decode[H :+: T] =
dummy[H :+: T]
implicit def generics[A, R](implicit gen: Generic.Aux[A, R],
decoder: Decode[R], opt: OptIn[A]): Decode[A] = Decode.dummy[A]
}
sealed trait OptIn[A]
object OptIn {
def instance[A]: OptIn[A] = new OptIn[A] {}
}
trait DeriveDecoder[F] {
implicit def optIn[A <: F] = OptIn.instance[A]
}
}
sealed trait A
case class B(s: String, i: Int) extends A
case class C(b: Boolean) extends A
object A extends Module.DeriveDecoder[A]
sealed trait A1
case class B1(s: String, i: Int) extends A1
case class C1(b: Boolean) extends A1
object Test {
import shapeless.test._
val a = Module.Decode[A]
val b = illTyped("Module.Decode[A1]")
// code compiles
}
case class Foo(a: String, b: Bar)
case class Bar(c: Int, d: Baz)
case class Baz(e: Long)
val instance = Foo("A", Bar(1, Baz(2)))
val flattened: String = ??? // Should be "a=A c=1 e=2"
trait MsgpackIndexed[A] extends Msgpack[A] {
private val si = Serialize[Int]
val defaultIndex = 0
def pack(v: A) = packIndexed(defaultIndex, v).flatMap((packWithIndex _).tupled)
def unpack(v: MessagePack) = v match {
case MFixArray(Vector(i, m)) => si.unpack(i).flatMap(unpackIndexed(_, m))
case _ => Attempt.failure(Err(s"Couldn't unpack indexed messagepack from $v"))
}
def packIndexed(index: Int, v: A): Attempt[(Int, MessagePack)]
def unpackIndexed(index: Int, v: MessagePack): Attempt[A]
private def packWithIndex(index: Int, payload: MessagePack): Attempt[MessagePack] =
si.pack(index).map(packed => MFixArray(Vector(packed, payload)))
}