input: Write a function to implement a fuzzy search algorithm that can match strings with near similarities by calculating the Levenshtein distance between the query and choices, filtering matches based on a provided threshold. The function should return a list of all choices that have a Levenshtein distance less than or equal to the threshold.
  
  assert find_matches("hello", ["helo", "jello", "world", "helldo"], 1)==["helo"]
  assert find_matches("fuzzy", ["fizzy", "fuzz", "fuzy", "busy"], 2)==["fizzy", "fuzy"]
  assert find_matches("test", ["testing", "tost", "tent", "fest"], 3)==["testing", "tost"]
  assert find_matches("match", ["mat", "march", "munch", "catch"], 2)==["mat", "catch"]
  assert find_matches("empty", [], 1)==[]
output: def find_matches(query, choices, threshold):
      def levenshtein_distance(s1, s2):
          if len(s1) < len(s2):
              return levenshtein_distance(s2, s1)
          if len(s2) == 0:
              return len(s1)
          previous_row = range(len(s2) + 1)
          for i, c1 in enumerate(s1):
              current_row = [i + 1]
              for j, c2 in enumerate(s2):
                  insertions = previous_row[j + 1] + 1
                  deletions = current_row[j] + 1
                  substitutions = previous_row[j] + (c1 != c2)
                  current_row.append(min(insertions, deletions, substitutions))
              previous_row = current_row
          return previous_row[-1]
  
      return [choice for choice in choices if levenshtein_distance(query, choice) <= threshold]