code: def find_all_ngrams(
      tokens: list[str], ngram_range: range
  ) -> typing.Iterator[N_GRAM]:
      """Generates all n-grams in a given range.
  
      Examples
      --------
  
      >>> tokens = ['a', 'b', 'c']
  
      >>> list(find_all_ngrams(tokens, range(2)))
      ['a', 'b', 'c']
  
      >>> list(find_all_ngrams(iter(tokens), range(2)))
      ['a', 'b', 'c']
  
      >>> list(find_all_ngrams(iter(tokens), range(1, 4)))
      ['a', 'b', 'c', ('a', 'b'), ('b', 'c'), ('a', 'b', 'c')]
  
      """
      return (
          ngram
          for n, t in zip(
              ngram_range, itertools.tee(tokens, len(ngram_range))
          )
          for ngram in find_ngrams(t, n)
      )
  
imports: from __future__ import annotations
  import collections
  import functools
  import itertools
  import math
  import operator
  import re
  import typing
  import unicodedata
  import pandas
  from scipy import sparse
  from river import base
label_desc: Use image node_id 5 for calling a global function with example usage: find_all_ngrams(tokens, ngram_range) and returns: unknown