memory

module
v0.0.0-...-53d0996 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 21, 2026 License: Apache-2.0

README

memory

A high-performance collection of generic data structures and algorithms for Go.

memory provides a suite of specialized, type-safe in-memory data structures optimized for efficiency and specific use cases. Unlike the standard library's container packages, this repository offers advanced algorithms like Locality Sensitive Hashing (SimDict), Counting Bloom Filters, Fuzzy Search, and Ordered Maps, all built using Go 1.18+ generics.

Features

🧠 Probabilistic Data Structures
  • Bloom Filter (bloom): Space-efficient probabilistic data structure for checking if an element is in a set. Includes a Counting Bloom Filter that supports removals.
  • HyperLogLog (hll): Efficient cardinality estimation for large datasets.
  • SimDict (simdict): A similarity dictionary using Locality Sensitive Hashing (LSH) to cluster similar documents or strings into buckets.
🔍 Search & String Algo
  • Fuzzy Search (fuzzysearch): Fast, lightweight fuzzy matching. Supports simple subsequence matching and Levenshtein distance ranking.
📦 Containers & Caches
  • LRU Cache (lru): A generic, thread-safe Least Recently Used cache implementation.
  • Ordered Map (orderedmap): A map that maintains insertion order, supporting iteration and index-based access.
  • Registry (registry): A thread-safe structure for grouping items by ID and Category, useful for managing active sessions or grouped workers.
  • Stack (stack): A classic LIFO stack implementation with slice-based backing.
  • Sorted Set (sortedset): (Redis-like) ZSET implementation for storing unique elements with scores.

Installation

Bash

go get github.com/FrogoAI/memory

Usage Examples

1. Counting Bloom Filter

Check for existence with a defined false-positive rate, with support for removing items.

Go

package main

import (
	"fmt"
	"github.com/FrogoAI/memory/bloom"
)

func main() {
	// Initialize for 1000 items with 0.01 (1%) false positive rate
	filter := bloom.NewCounting(1000, 0.01)

	data := []byte("user_123")

	filter.Add(data)

	if filter.Test(data) {
		fmt.Println("Item exists!")
	}

	filter.Remove(data)
}
2. Fuzzy Search & Ranking

Find strings that approximately match a target, ranked by Levenshtein distance.

Go

package main

import (
	"fmt"
	"github.com/FrogoAI/memory/fuzzysearch"
)

func main() {
	targets := []string{"cartwheel", "foobar", "wheel", "baz"}
	
	// Find simple matches (subsequence)
	matches := fuzzysearch.Find("whl", targets)
	fmt.Println(matches) // ["cartwheel", "wheel"]

	// Rank by Levenshtein distance
	ranks := fuzzysearch.RankFind("wheel", targets)
	for _, r := range ranks {
		fmt.Printf("Target: %s, Distance: %d\n", r.Target, r.Distance)
	}
}
3. LRU Cache

A type-safe cache that automatically evicts the least recently used items.

Go

package main

import (
	"fmt"
	"github.com/FrogoAI/memory/lru"
)

func main() {
	// Create a cache with capacity 2
	cache := lru.NewLRUCache[string](2)

	cache.Put("a", "alpha")
	cache.Put("b", "beta")
	
	val, found := cache.Get("a") // "a" is now most recently used
	
	cache.Put("c", "charlie") // Evicts "b" (least recently used)

	_, foundB := cache.Get("b") // false
	fmt.Println(foundB)
}
4. SimDict (Similarity Clustering)

Cluster documents into buckets based on similarity using LSH.

Go

package main

import (
	"fmt"
	"github.com/FrogoAI/memory/simdict"
)

func main() {
	manager := simdict.NewLSHManager()

	// Assign documents to buckets based on content similarity
	bucket1 := manager.ProcessAndAssign("The quick brown fox")
	bucket2 := manager.ProcessAndAssign("The quick brown fox jumps")
	bucket3 := manager.ProcessAndAssign("Completely different text")

	fmt.Println(bucket1 == bucket2) // true (Similar enough to share a bucket)
	fmt.Println(bucket1 == bucket3) // false
}
5. Registry

Manage grouped resources (e.g., connections per user) safely.

Go

package main

import (
	"github.com/FrogoAI/memory/registry"
)

func main() {
	// Key=String (GroupID), Index=Int (ItemID), Value=String (Data)
	reg := registry.NewRegistry[string, int, string]()

	// Add item 101 to group "admins"
	reg.Add("admins", 101, "User Alice")
	
	// Iterate over all admins
	for user := range reg.Iterator("admins") {
		println(user)
	}
}

License

MIT

Directories

Path Synopsis
Fuzzy searching allows for flexibly matching a string with partial input, useful for filtering data very quickly based on lightweight user input.
Fuzzy searching allows for flexibly matching a string with partial input, useful for filtering data very quickly based on lightweight user input.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL