You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@pekko.apache.org by "mdedetrich (via GitHub)" <gi...@apache.org> on 2023/08/21 08:25:42 UTC
[GitHub] [incubator-pekko-connectors] mdedetrich commented on pull request #160: Add Scala3 support for Geode
mdedetrich commented on PR #160:
URL: https://github.com/apache/incubator-pekko-connectors/pull/160#issuecomment-1685880588
So I managed to make some decent progress, I figured out the biggest issue I was having before is not having a type level data structure to represent the field's/types of a case class. With shapeless there is a `FieldType` however there didn't seem to be an equivalent for Scala 3's inbuild generics.
Thankfully I came across https://scalac.io/blog/inline-your-boilerplate-harnessing-scala3-metaprogramming-without-macros/ which provided the exact data structure needed, i.e.
```scala
import scala.compiletime.*
import scala.deriving.*
sealed trait Field[Label <: String, Type]
object Field {
type FromLabelsAndTypes[Labels <: Tuple, Types <: Tuple] <: Tuple =
(Labels, Types) match {
case (EmptyTuple, EmptyTuple) => EmptyTuple
case (labelHead *: labelTail, typeHead *: typeTail) =>
Field[labelHead, typeHead] *: FromLabelsAndTypes[labelTail, typeTail]
}
}
```
You can then create this type level data structure using a mirror, i.e.
```scala
case class Test(string: String, int: Int)
val mirror = summon[Mirror.ProductOf[Test]]
type Fields = FromLabelsAndTypes[mirror.MirroredElemLabels, mirror.MirroredElemTypes]
// defined alias type Fields = (Field["string", String], Field["int", Int])
```
Which is actually whats needed, i.e a type with each element being a `Field` that contains the case class fieldname on the left and the case class type on the right.
The PR isn't completely done but this a big step. Pinging @jrudolph because you showed interest before.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org
For additional commands, e-mail: notifications-help@pekko.apache.org