Created
February 22, 2021 11:03
-
-
Save Indy9000/3c92cca0b9327add4dca8ca56dbe89ad to your computer and use it in GitHub Desktop.
Auto Complete in 65 Lines of Dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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