public IEnumerable <VariableLetterGroup> AnalyzedUniquePermutations <T>(GraphemeSet <T> graphemes)
     where T : Grapheme, new()
 {
     foreach (VariableLetterGroup vlg in this.UniquePermutations())
     {
         if (vlg.IsValidAccordingToGraphemeSet <T>(graphemes))
         {
             yield return(vlg);
         }
     }
 }
        public bool IsValidAccordingToGraphemeSet <T>(GraphemeSet <T> graphemes)
            where T : Grapheme, new()
        {
            int  letters_length            = _letters.Count;
            int  grapheme_length           = graphemes.GetGraphemeLength();
            int  last_index_index_to_check = letters_length - grapheme_length;
            bool permutation_is_valid      = true;
            int  i = 0;

            do
            {
                T grapheme = new T();
                grapheme.SetGrapheme(StringInRange(this.ToString(), i, grapheme_length));

                if (!graphemes.Exists(grapheme))
                {
                    permutation_is_valid = false;
                }

                i++;
            }while (i <= last_index_index_to_check && permutation_is_valid);

            return(permutation_is_valid);
        }
        // PERMUTATIONS


        public IEnumerable <VariableLetterGroup> SortedAndAnalyzedUniquePermutations <T>(GraphemeSet <T> graphemes)
            where T : Grapheme, new()
        {
            var sorted = from element in AnalyzedUniquePermutations(graphemes)
                         orderby element.ToString()
                         select element;

            foreach (VariableLetterGroup vlg in sorted)
            {
                yield return(vlg);
            }
        }