Help language development. Donate to The Perl Foundation

Concurrent::Trie cpan:JNTHN last updated on 2018-05-18

README.md
# 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.