fun Arb.Companion.frequency(vararg arbs: Pair>): Arb = arb(arbs.flatMap { it.second.edgecases() }) { rs -> require(arbs.isNotEmpty()) { "No Arb instances passed to Arb.frequency()." } val iters = arbs.toList().flatMap { (weight, arb) -> List(weight) { arb } }.map { it.values(rs).iterator() } fun next(): Sample? { val iter = iters.shuffled(rs.random).first() return if (iter.hasNext()) iter.next() else null } sequence { while (true) { var next: Sample? = null while (next == null) next = next() yield(next.value) } } }