Scala 3でcase classのcompanionがFunctionNを継承しなくなっていて互換がないことへの対策

数日前の記事と、対になる(?)もの

xuwei-k.hatenablog.com

たとえば、slickみたいなORマッパーや、各種Jsonライブラリなど、case classをなにか他のデータにマッピングするとき、これらが役に立つわけです。たとえばslickでは公式的にも大量にFunctionNのtupledが使われていますね

github.com

これがScala 3ではそのままでは出来なくなります。

いや、たんに

<>(User.tupled,

<>((User.apply _).tupled,

にすればScala 2でも3でも通るはず?なので、多少冗長になるけれど、あまり複雑なこと(マクロなど)をしたくないひとは、そうやって書けばいいと思います。

しかし、上記のように書きかえるの若干気に食わないし、実行時にもScala 2の場合、一瞬余計なオブジェクト挟むことになる?ので、出来ればScala 2でも3でもtupledそのまま呼べるようにしたいですよね?

というわけで transparent inline で作りました。

Scala 3のmacroまだよくわかっていないので、もっと良い書き方あったら教えて下さい。

gist.github.com