iRevive / union-derivation

A micro-library to derive a typeclass for Scala 3 Union types.
MIT License
25 stars 1 forks source link

Please consider upstreaming to Scala3 #40

Open robmwalsh opened 1 year ago

robmwalsh commented 1 year ago

Hi, thanks for the awesome library! I'm using heaps of unions so this is a lifesaver. Would you consider upstreaming this to Scala3? I think this is a missing feature that really belongs in the standard lib.

iRevive commented 1 year ago

Hi.

When Scala 3 was released, I also expected this functionality to be a part of the standard library. And I still think it should be available out of the box.

I see several issues with upstreaming the library. It's relatively simple to derive a Show typeclass, but things are getting complicated with io.circe.Decoder. In some scenarios, the decoding logic should rely on the discriminators (e.g. https://circe.github.io/circe/codecs/adt.html#the-future).

In terms of derivation, a union type is somewhat similar to a sealed trait (ignoring that type Union = String | String is a valid definition). Hence, with a few adjustments, it should be possible to derive a typeclass utilizing Mirror.SumOf (a few hints https://github.com/typelevel/shapeless-3/issues/21#issuecomment-934331200).

Once I formalize my ideas, I will make a proposition in dotty repository.