scalaprops-magnoliaというライブラリを作った

github.com

ScalaMatsuri中に内職して作りました、ごめんなさい。

まずmagnoliaとは、

"型クラスのインスタンスの自動生成ライブラリ" でしょうか。

github.com

"型クラスのインスタンスの自動生成" といえば、shaplessという有名なライブラリがあります。

github.com

それ使った scalaprops-shapeless も以前作ってメンテナンスしています。

https://github.com/scalaprops/scalaprops-shapeless

xuwei-k.hatenablog.com

shapelessはそういった機能以外にも色々入っていますが、magnoliaはその機能に特化したライブラリらしいです。

"型クラスのインスタンスの自動生成"に関して、機能的にshapelessと出来ること自体はそれほど大差がない?(自分もあまり理解してない)ですが、コンパイル速度や、定義の書きやすさなど、いくつか良い点があるらしいです。 (確かにscalaprops-shapelessのコードより、格段に実装量少なくなった)

詳細は公式サイト見てください。

http://magnolia.work/

ちなみに、magnolia自体は、shapeless同様マクロ内部でScalaコンパイラのclassにキャストして、それをいじる、という黒魔術を使っているようで難しかったです(小並感)

さて、scalapropsとは自分が作ってメンテナンスしているproperty based testingのライブラリですが、

xuwei-k.hatenablog.com

Property Based Testing - scalapropsとscalacheckとその他色々

任意のデータ型を生成するための Gen という型クラスがあるので、magnoliaを使ってそのGenのインスタンスを自動生成するものが、scalaprops-magnoliaです。

同じようなscalacheck-magnoliaというものがあるので、それ参考にしたりしつつ作りました。

GitHub - etaty/scalacheck-magnolia: replace scalacheck-shapeless with scalacheck-magnolia for insane compilation speed up

magnolia自体の最新版がなぜかScala 2.11で動かないバグがあるらしく、最初のversionではScala 2.12向けしかpublishしていません。 あとは、magnolia自体はscala-jsやscala-native向けビルドされていますが 「マクロのライブラリで実行時に依存する部分がないならscala-js向けビルド自体が必要なく、同じjarでscala-jsでも使用可能」 という気がしたので、一旦scala-jsやscala-nativeビルドしていませんが、それは自分の勘違いな気がしてきた(実行時に依存する部分ある?)ので、必要ならあとでscala-jsやscala-nativeビルドを追加するかもしれません。 scala-js版もリリースしました。

あとは、Gen以外の型クラス(Cogen)が対応できるなら対応する、などのタスクも可能だったらやります。