A comprehensive TypeScript data structures library with production-ready implementations.
๐ Installation โข Quick Start โข Full Docs โข API Reference โข Playground โข Examples
- Who Should Use This?
- Why Not Just Array or Map?
- Key Features
- Installation
- Quick Start
- Data Structures
- Documentation
If you are building ranked collections, scheduling queues, or sorted data structures in TypeScript,
consider data-structure-typed instead of hand-rolled Arrays or Maps.
- Leaderboards & Rankings โ Maintain top-K efficiently without repeated sorting
- Task Scheduling โ Priority queues, ordered execution, time-based operations
- Real-Time Dashboards โ Grafana-style workloads with instant lookups
- Time-Series Data โ Sorted insertion + fast range queries
- Search & Autocomplete โ Prefix matching at scale
- Graph Problems โ Pathfinding, cycle detection, topological sorting
| Use Case | Array | Map | data-structure-typed |
|---|---|---|---|
| Sorted Lookup | โ O(n) | โ Unordered | โ O(log n) |
| Insert at Position | โ O(n) shift | โ No position | โ O(log n) |
| Leaderboard Top-K | โ Re-sort O(n log n) | โ Manual sort | โ Instant |
| Remove from Front | โ O(n) | โ No dequeue | โ O(1) |
| Prefix Search | โ O(n*m) | โ Not applicable | โ O(m + k) |
| Familiar API | โ Yes | โ Yes | โ Same |
// โ WITHOUT data-structure-typed
const queue = [1, 2, 3, ..., 100000
]
;
for (let i = 0; i < 100000; i++) {
queue.shift(); // O(n) - Reindexes EVERY element!
}
// Time: 2829ms โ// โ
WITH data-structure-typed (Deque)
const deque = new Deque([1, 2, 3, ..., 100000])
;
for (let i = 0; i < 100000; i++) {
deque.shift(); // O(1) - Just moves a pointer
}
// Time: 5.83ms โ
// **484x faster!**-
10โ40% faster than common JS implementations in hot paths
- Array.sort() O(n log n) โ TreeSet O(log n) insertion
- Repeated Array.shift() O(n) โ Queue O(1)
- Manual index tracking โ RB-Tree auto-balance
-
Optimized for V8 JIT (Node.js 18+, modern browsers)
-
Tree-shakable ESM / CJS / legacy builds
๐ Full benchmarks โ
Don't learn new APIs. Just use push, pop, map, filter, and reduce everywhere.
// All linear structures use THE SAME 4 methods
const deque = new Deque([1, 2, 3]);
const queue = new Queue([1, 2, 3]);
const doublyLinkeList = new DoublyLinkedList([1, 2, 3]);
const singlyLinkedList = new SinglyLinkedList([1, 2, 3]);
// They ALL support:
structure.push(item); // Add to end
structure.pop(); // Remove from end
structure.shift(); // Remove from start
structure.unshift(item); // Add to startFull generics and strict TypeScript support out of the box.
const tree = new RedBlackTree<number, string>();
tree.set(1, 'Alice');
tree.set(2, 'Bob');
// Type-safe access
const value = tree.get(1); // Type: string | undefinedWorks everywhere. Spread it [...], loop it for..of, convert it instantly.
// All data structures work with iterator protocol
const tree = new RedBlackTree([5, 2, 8]);
const sorted = [...tree]; // Spread operator
for (const item of tree) {
} // for...of loop
const set = new Set(tree); // Set constructorpnpm add data-structure-typednpm i data-structure-typed --saveyarn add data-structure-typedUse only what you need:
pnpm add heap-typed deque-typed red-black-tree-typedโ When you need:
- Top-K / Leaderboard queries without repeated sorting
- Insertion order + lookup performance simultaneously
- Priority queues with fast position-based access
- Time-series data with range queries
- Red-Black Tree / Heap performance without learning new APIs
โ When your current code has:
array.sort()in hot paths (request handlers, loops)- Manual index tracking after insertions
Array.shift()on large lists (queues)- Custom sorting logic you repeat across files
- Map that needs to be ordered
import { RedBlackTree } from 'data-structure-typed';
const leaderboard = new RedBlackTree([
[100, 'Alice'],
[85, 'Bob'],
[92, 'Charlie']
]);
// Get sorted scores (automatically maintained!)
for (const [score, player] of leaderboard) {
console.log(`${player}: ${score}`);
}
// Output:
// Alice: 100
// Charlie: 92
// Bob: 85
// Update score
leaderboard.delete(85);
leaderboard.set(95, 'Bob'); // O(log n)
// Query top players
const topPlayers = [...leaderboard.values()].reverse().slice(0, 3);import { MaxPriorityQueue } from 'data-structure-typed';
const taskQueue = new MaxPriorityQueue<{priority: number; task: string}>([], {
comparator: (a, b) => b.priority - a.priority
});
taskQueue.add({ priority: 5, task: 'Email' });
taskQueue.add({ priority: 9, task: 'Alert' }); // Instant priority handling
const nextTask = taskQueue.poll(); // { priority: 9, task: 'Alert' }import { Deque } from 'data-structure-typed';
const queue = new Deque([1, 2, 3, 4, 5]);
queue.shift(); // Remove from front: O(1) not O(n)
queue.push(6); // Add to back: O(1)| Structure | Use Case | Time Complexity | NPM |
|---|---|---|---|
| RedBlackTree | Sorted collections, range queries | O(log n) | npm |
| Heap / PriorityQueue | Task scheduling, top-K elements | O(log n) | npm |
| Deque | Fast front/back operations | O(1) | npm |
| Trie | Autocomplete, prefix search | O(m+k) | npm |
| DirectedGraph | Pathfinding, DAG algorithms | O(V+E) | npm |
| Stack | Undo/redo, expression parsing | O(1) | npm |
| LinkedList | Dynamic sizing, no index shift | O(1)* | npm |
| AVLTree | Stricter balance than RB-Tree | O(log n) | npm |
๐ See all 20+ structures โ
| Your Goal | Start Here | Next Steps |
|---|---|---|
| Learn concepts | CONCEPTS.md | GUIDES.md |
| Use in my project | GUIDES.md | REFERENCE.md |
| Look up API | REFERENCE.md | PERFORMANCE.md |
| Performance questions | PERFORMANCE.md | ARCHITECTURE.md |
| Framework integration | INTEGRATIONS.md | GUIDES.md |
| Understand design | ARCHITECTURE.md | CONCEPTS.md |
- CONCEPTS.md - Core Fundamentals & Theory
- Big Three Concepts (BST, Balanced Trees, Heap)
- 13 Plain Language Explanations
- Iterator Protocol Design
- 5 Comparisons with Native JavaScript
- Complete Decision Guide
- REFERENCE.md - Complete API & Data Structures
- Quick Reference Table
- All 20+ Structures with Examples
- CRUD Operations
- Common Methods
- TypeScript Support
- ARCHITECTURE.md - Design & Implementation
- Design Philosophy & Principles
- 3 Pain Points Solved
- Why Deque is 484x Faster
- Iterator Protocol Design
- Self-Balancing Strategy
- V8 JIT Optimizations
- PERFORMANCE.md - Benchmarks & Comparisons
- Performance Summary
- 3 Real-World Scenarios
- Detailed Benchmarks
- When to Use What
- Optimization Tips
- GUIDES.md - Real-World Examples
- 4 Design Patterns
- 5 Production Code Examples
- Common Mistakes
- Best Practices
- INTEGRATIONS.md - Framework Integration
- React Integration (State Management, Leaderboard)
- Express Integration (LRU Cache, Rate Limiting)
- Nest.js Integration (Ranking Service, Task Queue)
- TypeScript Configuration
class LRUCache<K, V> {
private cache = new Map<K, V>();
private order = new DoublyLinkedList<K>();
get(key: K): V | null {
if (!this.cache.has(key)) return null;
// Move to end (recently used)
// Efficient with O(1) operations
return this.cache.get(key)!;
}
}type Player = {
id: string;
name: string;
score: number;
};
const seedPlayers: Player[] = [
{ id: 'player_01HZX4E8Q2K8Y3J9M7T1A6B3C4', name: 'Pablo', score: 65 },
{ id: 'player_01HZX4E9R6V2D8K1P0N5S4T7U8', name: 'Bunny', score: 10 },
{ id: 'player_01HZX4EA3M9Q7W1E2R8T6Y5U0I', name: 'Jeff', score: 99 },
];
class ScoreLeaderboard {
private readonly byScore: RedBlackTree<number, Player, Player>;
constructor(initialPlayers: Player[]) {
this.byScore = new RedBlackTree<number, Player, Player>(initialPlayers, {
isMapMode: false,// Use "node value" storage rather than Map-style.
toEntryFn: (player) => [player.score, player], // Convert a player object into the tree entry: key = score, value = player.
});
}
/**
* Returns players whose scores fall within the given range.
* Supports either a tuple [min, max] or a Range object for inclusive/exclusive bounds.
*/
public findPlayersByScoreRange(range: [number, number] | Range<number>): (Player | undefined)[] {
return this.byScore.rangeSearch(range, (node) => node.value);
}
public upsertPlayer(player: Player) {
return this.byScore.set(player.score, player);
}
}
const leaderboard = new ScoreLeaderboard(seedPlayers);
console.log(leaderboard.findPlayersByScoreRange([65, 100]));
leaderboard.upsertPlayer({
id: 'player_01HZX4EB7C4N2M9Q8R1T3Y6U5I',
name: 'Alex',
score: 80,
});
console.log(leaderboard.findPlayersByScoreRange(new Range(65, 100, true, true)));type Message = {
id: string;
type: string;
payload: unknown;
priority: 'urgent' | 'normal';
createdAt: number;
retryCount?: number;
};
class MessageQueue {
private urgent = new Deque<Message>();
private normal = new Deque<Message>();
dequeue(): Message | null {
return this.urgent.shift() || this.normal.shift();
}
}๐ More examples in GUIDES.md
- Price-sorted order book
- Real-time portfolio rankings
- Option chain ordering
- Player leaderboards
- Enemy priority queues
- Game event scheduling
- Trending posts (top-K)
- Feed ordering
- Notification scheduling
- Patient priority queues
- Appointment scheduling
- Medical record organization
- Product price ranges
- Inventory management
- Order scheduling
| Pain Point | Solution |
|---|---|
| Repeated sorting slowing down code | TreeSet auto-maintains order |
| Array.shift timeout in loops | Deque O(1) shift instead of O(n) |
| Learning different APIs | All structures use push/pop/shift/unshift |
| Type safety nightmares | Full TypeScript generics support |
| Browser compatibility issues | Works everywhere: Node, browsers, CDN |
โ
20+ data structures (production-ready)
โ
50+ code examples (real-world patterns)
โ
Full TypeScript support (strict typing)
โ
Performance benchmarks (484x speedups)
โ
Framework integrations (React, Express, Nest.js)
โ
6 core documentation files (2500+ lines)
npm i data-structure-typedimport { RedBlackTree, Deque, MaxPriorityQueue } from 'data-structure-typed';const tree = new RedBlackTree([5, 2, 8]);
console.log([...tree]); // [2, 5, 8] - Automatically sorted!๐๐ปโโ๏ธ Try it instantly:
๐ Check CONCEPTS.md for core concepts
๐ See GUIDES.md for production examples
๐ Read REFERENCE.md for complete API
Need frequent head/tail operations?
โ Deque (O(1) shift/unshift/push/pop)
Need sorted + fast lookup?
โ RedBlackTree (O(log n) guaranteed)
Need highest/lowest priority?
โ Heap/PriorityQueue (O(log n) add/remove)
Need prefix/text matching?
โ Trie (O(m+k) where m=prefix)
Need graph operations?
โ DirectedGraph/UndirectedGraph
Otherwise?
โ Use Array (simplest case)
Found a bug? Have suggestions? Open an issue
MIT
docs/
โโโ README.md (this file)
โโโ CONCEPTS.md (theory & fundamentals)
โโโ REFERENCE.md (API documentation)
โโโ ARCHITECTURE.md (design principles)
โโโ PERFORMANCE.md (benchmarks)
โโโ GUIDES.md (real-world examples)
โโโ INTEGRATIONS.md (framework guides)
Just started? โ Quick Start
Need concepts? โ CONCEPTS.md
Want to build? โ GUIDES.md
Need API? โ REFERENCE.md
Curious about performance? โ PERFORMANCE.md
Framework questions? โ INTEGRATIONS.md
Ready to supercharge your TypeScript data structures? Get started now โ