code: def basic_filter_languages(languages, ranges):
      
  
      if LanguageRange.WILDCARD in ranges:
          yield from languages
          return
  
      found = set()
  
      for language_range in ranges:
          range_str = language_range.match_str
          for language in languages:
              if language in found:
                  continue
  
              match_str = language.match_str
              if match_str == range_str:
                  yield language
                  found.add(language)
                  continue
  
              if len(range_str) < len(match_str):
                  if     (match_str[:len(range_str)] == range_str and
                          match_str[len(range_str)] == "-"):
                      yield language
                      found.add(language)
                      continue
docs: Filter languages using the string-based basic filter algorithm described in
      RFC4647.
  
      `languages` must be a sequence of :class:`LanguageTag` instances which are
      to be filtered.
  
      `ranges` must be an iterable which represent the basic language ranges to
      filter with, in priority order. The language ranges must be given as
      :class:`LanguageRange` objects.
  
      Return an iterator of languages which matched any of the `ranges`. The
      sequence produced by the iterator is in match order and duplicate-free. The
      first range to match a language yields the language into the iterator, no
      other range can yield that language afterwards.