Slide 20
Slide 20 text
RANDOM COPRODUCTS
case class CoproductOptions[A, C <: Coproduct](
options: List[() => A] = Nil)
implicit def rCNil[A]: CoproductOptions[A, CNil] =
CoproductOptions[A, CNil](Nil)
implicit def rCP[A, H <: A, T <: Coproduct](
implicit rh: Lazy[Random[H]],
rt: Lazy[CoproductOptions[A, T]]): CoproductOptions[A, H :+: T] =
CoproductOptions[A, H :+: T](rh.value :: rt.value.options)
implicit def rCoproduct[T, Repr <: Coproduct](
implicit g: Generic.Aux[T, Repr],
rg: Lazy[CoproductOptions[T, Repr]]): Random[T] =
() => {
val choices = rg.value.options
choices(util.Random.nextInt(choices.length))()
}