/** * creates a generator that produces arrays whose elements * are chosen from $gen. * * @param Generator $gen * @return Generator */ public static function arraysOf(self $gen) { $sized = self::sized(function ($s) { return self::choose(0, $s); }); return $sized->bindGen(function (RoseTree $numRose) use($gen) { $seq = self::sequence(FP::repeat($numRose->getRoot(), $gen)); return $seq->bindGen(function ($roses) { return self::pureGen(RoseTree::shrink(FP::args(), $roses)); }); }); }