案例 class 的收缩宏

Shrink macro for case class

我正在为我的案例 类 实施 Shrink instances。在我看来,宏可以完成这项工作。有人实现了吗?

是的,他们有! shapeless-contrib has an instance of ShapelessTypeClass 对于 Shrink:

scala> import org.scalacheck._
import org.scalacheck._

scala> case class Foo(s: String, i: Int)
defined class Foo

scala> val unshrunk = Foo("This is a very long string", 1000)
unshrunk: Foo = Foo(This is a very long string,1000)

scala> implicitly[Shrink[Foo]].shrink(unshrunk) // boring default instance
res0: Stream[Foo] = Stream()

scala> import shapeless.contrib.scalacheck._
import shapeless.contrib.scalacheck._

scala> implicitly[Shrink[Foo]].shrink(unshrunk) // interesting instance
res1: Stream[Foo] = Stream(Foo(This is a ver,1000), ?)

这是由宏支持的,但只有 Shapeless 用于其 Generic 机器的那些。