package prog8tests.helpers fun cartesianProduct(c1: Collection, c2: Collection): Sequence> { return c1.flatMap { lhsElem -> c2.map { rhsElem -> lhsElem to rhsElem } }.asSequence() } fun cartesianProduct(c1: Collection, c2: Collection, c3: Collection): Sequence> { return sequence { for (a in c1) for (b in c2) for (c in c3) yield(Triple(a,b,c)) } } data class Product(val first: T, val second: U, val third: V, val fourth: W) fun cartesianProduct(c1: Collection, c2: Collection, c3: Collection, c4: Collection): Sequence> { return sequence { for (a in c1) for (b in c2) for (c in c3) for (d in c4) yield(Product(a,b,c,d)) } } fun mapCombinations(dim1: Iterable, dim2: Iterable, combine2: (A, B) -> R) = sequence { for (a in dim1) for (b in dim2) yield(combine2(a, b)) }.toList() fun mapCombinations(dim1: Iterable, dim2: Iterable, dim3: Iterable, combine3: (A, B, C) -> R) = sequence { for (a in dim1) for (b in dim2) for (c in dim3) yield(combine3(a, b, c)) }.toList() fun mapCombinations(dim1: Iterable, dim2: Iterable, dim3: Iterable, dim4: Iterable, combine4: (A, B, C, D) -> R) = sequence { for (a in dim1) for (b in dim2) for (c in dim3) for (d in dim4) yield(combine4(a, b, c, d)) }.toList()