2121public class UsernameTrie <V > {
2222
2323 //TODO we might want to be case in-sensitive, but goes at the cost of tab-completing names in their right casing.
24+ //TODO can we make this a lock-free thread-safe data structure?
2425
2526 private final Node <V > root ;
2627
@@ -40,7 +41,7 @@ public Maybe<V> insert(String username, V value) {
4041 return insert (username .toCharArray (), value );
4142 }
4243
43- public Maybe <V > insert (char [] username , V value ) {
44+ public synchronized Maybe <V > insert (char [] username , V value ) {
4445 Node <V > node = root .lookup (username );
4546 Maybe <V > oldValue = node .value ;
4647 node .value = Maybe .just (value );
@@ -51,7 +52,7 @@ public Maybe<V> delete(String username) {
5152 return delete (username .toCharArray ());
5253 }
5354
54- public Maybe <V > delete (char [] username ) {
55+ public synchronized Maybe <V > delete (char [] username ) {
5556 Node <V > node = root .lookup (username );
5657 Maybe <V > oldValue = node .value ;
5758 node .value = Maybe .nothing ();
@@ -63,7 +64,7 @@ public Maybe<V> get(String username) {
6364 return get (username .toCharArray ());
6465 }
6566
66- public Maybe <V > get (char [] username ) {
67+ public synchronized Maybe <V > get (char [] username ) {
6768 Node <V > node = root .lookup (username );
6869 Maybe <V > value = node .value ;
6970 node .cleanUp ();
@@ -74,7 +75,7 @@ public void traverse(String prefix, BiConsumer<String, ? super V> consumer) {
7475 traverse (prefix .toCharArray (), (chars , v ) -> consumer .accept (new String (chars ), v ));
7576 }
7677
77- public void traverse (char [] prefix , BiConsumer <char [], ? super V > consumer ) {
78+ public synchronized void traverse (char [] prefix , BiConsumer <char [], ? super V > consumer ) {
7879 Node <V > node = root .lookup (prefix );
7980 node .traverse (consumer );
8081 node .cleanUp ();
0 commit comments