private static IEnumerator <IImmutableList <T> > AllChoiceCombinationsOfRemainder <T>(this IEnumerator <IEnumerable <T> > sequenceOfChoices) { if (!sequenceOfChoices.MoveNext()) { yield return(ImmutableList.Create <T>()); yield break; } var headChoices = sequenceOfChoices.Current; var tailChoices = sequenceOfChoices.AllChoiceCombinationsOfRemainder(); using (var e = tailChoices) { while (e.MoveNext()) { var tailChoice = e.Current; foreach (var headChoice in headChoices) { yield return(tailChoice.Insert(0, headChoice)); } } } }