namespace WhiteRabbit { using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; /// /// Converts e.g. pair of variants [[a, b, c], [d, e]] into all possible pairs: [[a, d], [a, e], [b, d], [b, e], [c, d], [c, e]] /// internal static class Flattener { private static IEnumerable Flatten3(T[][] phrase) { foreach (var item0 in phrase[0]) foreach (var item1 in phrase[1]) foreach (var item2 in phrase[2]) yield return new T[] { item0, item1, item2, }; } private static IEnumerable Flatten4(T[][] phrase) { foreach (var item0 in phrase[0]) foreach (var item1 in phrase[1]) foreach (var item2 in phrase[2]) foreach (var item3 in phrase[3]) yield return new T[] { item0, item1, item2, item3, }; } private static IEnumerable Flatten5(T[][] phrase) { foreach (var item0 in phrase[0]) foreach (var item1 in phrase[1]) foreach (var item2 in phrase[2]) foreach (var item3 in phrase[3]) foreach (var item4 in phrase[4]) yield return new T[] { item0, item1, item2, item3, item4, }; } private static IEnumerable Flatten6(T[][] phrase) { foreach (var item0 in phrase[0]) foreach (var item1 in phrase[1]) foreach (var item2 in phrase[2]) foreach (var item3 in phrase[3]) foreach (var item4 in phrase[4]) foreach (var item5 in phrase[5]) yield return new T[] { item0, item1, item2, item3, item4, item5, }; } private static IEnumerable Flatten7(T[][] phrase) { foreach (var item0 in phrase[0]) foreach (var item1 in phrase[1]) foreach (var item2 in phrase[2]) foreach (var item3 in phrase[3]) foreach (var item4 in phrase[4]) foreach (var item5 in phrase[5]) foreach (var item6 in phrase[6]) yield return new T[] { item0, item1, item2, item3, item4, item5, item6, }; } private static IEnumerable Flatten8(T[][] phrase) { foreach (var item0 in phrase[0]) foreach (var item1 in phrase[1]) foreach (var item2 in phrase[2]) foreach (var item3 in phrase[3]) foreach (var item4 in phrase[4]) foreach (var item5 in phrase[5]) foreach (var item6 in phrase[6]) foreach (var item7 in phrase[7]) yield return new T[] { item0, item1, item2, item3, item4, item5, item6, item7, }; } private static IEnumerable Flatten9(T[][] phrase) { foreach (var item0 in phrase[0]) foreach (var item1 in phrase[1]) foreach (var item2 in phrase[2]) foreach (var item3 in phrase[3]) foreach (var item4 in phrase[4]) foreach (var item5 in phrase[5]) foreach (var item6 in phrase[6]) foreach (var item7 in phrase[7]) foreach (var item8 in phrase[8]) yield return new T[] { item0, item1, item2, item3, item4, item5, item6, item7, item8, }; } private static IEnumerable Flatten10(T[][] phrase) { foreach (var item0 in phrase[0]) foreach (var item1 in phrase[1]) foreach (var item2 in phrase[2]) foreach (var item3 in phrase[3]) foreach (var item4 in phrase[4]) foreach (var item5 in phrase[5]) foreach (var item6 in phrase[6]) foreach (var item7 in phrase[7]) foreach (var item8 in phrase[8]) foreach (var item9 in phrase[9]) yield return new T[] { item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, }; } public static IEnumerable Flatten(T[][] wordVariants) { switch (wordVariants.Length) { case 3: return Flatten3(wordVariants); case 4: return Flatten4(wordVariants); case 5: return Flatten5(wordVariants); case 6: return Flatten6(wordVariants); case 7: return Flatten7(wordVariants); case 8: return Flatten8(wordVariants); case 9: return Flatten9(wordVariants); case 10: return Flatten10(wordVariants); default: throw new ArgumentOutOfRangeException(nameof(wordVariants)); } } } }