Skip to content

hashicorp/go-immutable-radix

Folders and files

NameName
Last commit message
Last commit date

Latest commit

4ca59a1 · Feb 20, 2025
Feb 20, 2025
Jun 1, 2015
Feb 20, 2025
Feb 20, 2025
Dec 16, 2022
Oct 12, 2022
Jul 15, 2022
Nov 18, 2024
Dec 16, 2022
Dec 16, 2022
Nov 18, 2024
Feb 20, 2025
Nov 18, 2024
Nov 18, 2024
Feb 20, 2025
Feb 20, 2025
Nov 18, 2024
Nov 18, 2024
Nov 18, 2024
Nov 18, 2024

go-immutable-radix Run CI Tests

Provides the iradix package that implements an immutable radix tree. The package only provides a single Tree implementation, optimized for sparse nodes.

As a radix tree, it provides the following:

  • O(k) operations. In many cases, this can be faster than a hash table since the hash function is an O(k) operation, and hash tables have very poor cache locality.
  • Minimum / Maximum value lookups
  • Ordered iteration

A tree supports using a transaction to batch multiple updates (insert, delete) in a more efficient manner than performing each operation one at a time.

For a mutable variant, see go-radix.

V2

The v2 of go-immutable-radix introduces generics to improve compile-time type safety for users of the package. The module name for v2 is github.com/hashicorp/go-immutable-radix/v2.

Documentation

The full documentation is available on Godoc.

Example

Below is a simple example of usage

// Create a tree
r := iradix.New[int]()
r, _, _ = r.Insert([]byte("foo"), 1)
r, _, _ = r.Insert([]byte("bar"), 2)
r, _, _ = r.Insert([]byte("foobar"), 2)

// Find the longest prefix match
m, _, _ := r.Root().LongestPrefix([]byte("foozip"))
if string(m) != "foo" {
    panic("should be foo")
}

Here is an example of performing a range scan of the keys.

// Create a tree
r := iradix.New[int]()
r, _, _ = r.Insert([]byte("001"), 1)
r, _, _ = r.Insert([]byte("002"), 2)
r, _, _ = r.Insert([]byte("005"), 5)
r, _, _ = r.Insert([]byte("010"), 10)
r, _, _ = r.Insert([]byte("100"), 10)

// Range scan over the keys that sort lexicographically between [003, 050)
it := r.Root().Iterator()
it.SeekLowerBound([]byte("003"))
for key, _, ok := it.Next(); ok; key, _, ok = it.Next() {
  if string(key) >= "050" {
      break
  }
  fmt.Println(string(key))
}
// Output:
//  005
//  010