Skip to content

Instantly share code, notes, and snippets.

@Indy9000
Created February 22, 2021 11:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Indy9000/3c92cca0b9327add4dca8ca56dbe89ad to your computer and use it in GitHub Desktop.
Save Indy9000/3c92cca0b9327add4dca8ca56dbe89ad to your computer and use it in GitHub Desktop.
Auto Complete in 65 Lines of Dart
class Node {
String prefix;
List<Node> children = List<Node>();
bool _addNewChild(String rest) {
final child = Node();
var added = child.add(rest);
if (added) children.add(child);
return added;
}
bool add(String word) {
if (word == null || word.length == 0) return true;
final first = word[0];
final rest = word.substring(1);
if (prefix == null) {
prefix = first;
return _addNewChild(rest);
} else {
if (prefix == first) {
for (var n in children) {
var added = n.add(rest);
if (added) return added;
}
return _addNewChild(rest);
}
return false;
}
}
List<String> find(String partialWord) {
return _find("", partialWord);
}
// Finds partial matches
List<String> _find(String sofar, String partialWord) {
final result = List<String>();
if (partialWord == null || partialWord.length == 0) return result;
final first = partialWord[0];
final rest = partialWord.substring(1);
if (prefix == first) {
for (var n in children) {
var result = n._find(sofar + prefix, rest);
if (result.length != 0) return result;
}
return getWords(sofar, result);
}
return result;
}
List<String> getWords(String sofar, List<String> words) {
if (prefix == null) {
words.add(sofar);
return words;
}
sofar += prefix;
for (var ch in children) {
words = ch.getWords(sofar, words);
}
return words;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment