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));
                }
            }
        }
    }