Rand Stats

Concurrent::Trie

cpan:JNTHN

Concurrent::Trie

A lock-free trie (Text Retrieval) data structure, safe for concurrent use.

Synopsis

use Concurrent::Trie;

my $trie = Concurrent::Trie.new;
say $trie.contains('brie');         # False
say so $trie;                       # False
say $trie.elems;                    # 0

$trie.insert('brie');
say $trie.contains('brie');         # True
say so $trie;                       # True
say $trie.elems;                    # 1

$trie.insert('babybel');
$trie.insert('gorgonzola');
say $trie.elems;                    # 3
say $trie.entries();                # (gorgonzola babybel brie)
say $trie.entries('b');             # (babybel brie)

Overview

A trie stores strings as a tree, with each level in the tree representing a character in the string (so the tree's maximum depth is equal to the number of characters in the longest entry). A trie is especially useful for prefix searches, where all entries with a given prefix are required, since this is obtained simply by walking the tree according to the prefix, and then visiting all nodes below that point to find entries.

This is a lock-free trie. Checking if the trie contains a particular string never blocks. Iterating the entries never blocks either, and will provide a snapshot of all the entries at the time the entries method was called. An insertion uses optimistic concurrency control, building an updated tree and then trying to commit it. This offers a global progress bound: if one thread fails to insert, it's because another thread did a successful insert.

This data structure is well suited to auto-complete style features in concurrent applications, where new entries and lookups may occur when, for example, processing web requests in parallel.

Methods

insert(Str $value --> Nil)

Inserts the passed string value into the trie.

contains(Str $value --> Bool)

Checks if the passed string value is in the trie. Returns True if so, and False otherwise.

entries($prefix = '' --> Seq)

Returns a lazy iterator of all entries in the trie with the specified prefix. If no prefix is passed, the default is the empty prefix, meaning that a call like $trie.entries() will iterate all entries in the trie. The order of the results is not defined.

The results will be a snapshot of what was in the trie at the point entries was called; additions after that point will not be in the entries list.

elems(--> Int)

Gets the number of entries in the trie. The data structure maintains a count, making this O(1) (as opposed to $trie.entries.elems, which would be O(n)).

Bool()

Returns True if the number of entries in the trie is non-zero, and False otherwise.