npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@coderbaba/stl-js

v1.0.4

Published

STL data structures for JavaScript

Readme

@coderbaba/stl-js

A modern STL-like data structure library for JavaScript and TypeScript — inspired by C++ STL but tailored for JS/TS ecosystems.

📦 Lightweight · 📚 TypeScript-first · 🌐 CDN Friendly · 🛠️ Zero Dependencies


🚀 Installation

Via npm (Node.js / TypeScript / Modern Bundlers)

npm install @coderbaba/stl-js
// ESM / TypeScript
import { Stack, Queue, MinHeap } from '@coderbaba/stl-js';

const stack = new Stack<number>();
stack.push(10);
console.log(stack.pop()); // 10
// Via CDN (Vanilla JavaScript)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>
<script>
  const stack = new STL.Stack();
  stack.push('Amaan');
  alert(stack.pop()); // 'Amaan'
</script>
// Using npm (ESM/TypeScript)
import { Stack } from "@coderbaba/stl-js";
const stack = new Stack<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const stack = new STL.Stack();

// Methods available:

// 1. push(item) - Adds an item to the top of the stack
stack.push(10);
stack.push(20);

// 2. pop() - Removes and returns the top item of the stack
console.log(stack.pop()); // 20

// 3. peek() - Returns the top item without removing it
console.log(stack.peek()); // 10

// 4. isEmpty() - Returns true if the stack is empty
console.log(stack.isEmpty()); // false

// 5. size() - Returns the number of items in the stack
console.log(stack.size()); // 1
// Using npm (ESM/TypeScript)
import { Queue } from "@coderbaba/stl-js";
const queue = new Queue<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const queue = new STL.Queue();

// Methods available:

// 1. enqueue(item) - Adds an item to the end of the queue
queue.enqueue(10);
queue.enqueue(20);

// 2. dequeue() - Removes and returns the item at the front of the queue
console.log(queue.dequeue()); // 10

// 3. front() - Returns the front item without removing it
console.log(queue.front()); // 20

// 4. isEmpty() - Returns true if the queue is empty
console.log(queue.isEmpty()); // false

// 5. size() - Returns the number of items in the queue
console.log(queue.size()); // 1
// Using npm (ESM/TypeScript)
import { Deque } from "@coderbaba/stl-js";
const deque = new Deque<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const deque = new STL.Deque();

// Methods available:

// 1. addFront(item) - Adds an item to the front of the deque
deque.addFront(20);

// 2. addRear(item) - Adds an item to the rear of the deque
deque.addRear(10);

// 3. removeFront() - Removes and returns the front item
console.log(deque.removeFront()); // 20

// 4. removeRear() - Removes and returns the rear item
console.log(deque.removeRear()); // 10

// 5. front() - Returns the front item without removing it
deque.addRear(30);
console.log(deque.front()); // 30

// 6. rear() - Returns the rear item without removing it
deque.addRear(40);
console.log(deque.rear()); // 40

// 7. isEmpty() - Returns true if the deque is empty
console.log(deque.isEmpty()); // false

// 8. size() - Returns the number of items in the deque
console.log(deque.size()); // 2
// Using npm (ESM/TypeScript)
import { PriorityQueue } from "@coderbaba/stl-js";
const pq = new PriorityQueue<string, number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const pq = new STL.PriorityQueue();

// Methods available:

// 1. enqueue(value, priority) - Inserts a value with a given priority (lower number = higher priority)
pq.enqueue("Clean dishes", 2);
pq.enqueue("Write code", 1);
pq.enqueue("Sleep", 3);

// 2. dequeue() - Removes and returns the item with the highest priority
console.log(pq.dequeue()); // { value: 'Write code', priority: 1 }

// 3. peek() - Returns the item with the highest priority without removing it
console.log(pq.peek()); // { value: 'Clean dishes', priority: 2 }

// 4. isEmpty() - Returns true if the queue is empty
console.log(pq.isEmpty()); // false

// 5. size() - Returns the number of elements in the priority queue
console.log(pq.size()); // 2

// 6. print() - Returns a string representation of the queue
console.log(pq.print()); // (Clean dishes, p=2), (Sleep, p=3)
// Using npm (ESM/TypeScript)
import { LinkedList } from "@coderbaba/stl-js";
const list = new LinkedList<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const list = new STL.LinkedList();

// Methods available:

// 1. append(value) - Adds a value to the end of the linked list
list.append(10);
list.append(20);

// 2. prepend(value) - Adds a value to the beginning of the list
list.prepend(5);

// 3. delete(value) - Removes all nodes with the given value
list.delete(20);

// 4. find(value) - Returns the first node with the given value
const node = list.find(10);
console.log(node?.value); // 10

// 5. size() - Returns the number of nodes in the list
console.log(list.size()); // 2

// 6. isEmpty() - Returns true if the list is empty
console.log(list.isEmpty()); // false
// Using npm (ESM/TypeScript)
import { DoublyLinkedList } from "@coderbaba/stl-js";
const dll = new DoublyLinkedList<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const dll = new STL.DoublyLinkedList();

// Methods available:

// 1. push(value) - Adds a value to the end of the list
dll.push(10);
dll.push(20);

// 2. pop() - Removes and returns the value at the end of the list
console.log(dll.pop()); // 20

// 3. unshift(value) - Adds a value to the beginning of the list
dll.unshift(5);

// 4. shift() - Removes and returns the value at the beginning of the list
console.log(dll.shift()); // 5

// 5. find(value) - Returns the first node with the given value
dll.push(30);
const node = dll.find(30);
console.log(node?.value); // 30

// 6. delete(value) - Deletes the first node with the given value
dll.delete(30); // true

// 7. isEmpty() - Returns true if the list is empty
console.log(dll.isEmpty()); // false

// 8. size() - Returns the number of nodes in the list
console.log(dll.size()); // 1

// 9. toArray() - Returns all values in the list as an array
console.log(dll.toArray()); // [10]
// Using npm (ESM/TypeScript)
import { CircularLinkedList } from "@coderbaba/stl-js";
const cll = new CircularLinkedList<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const cll = new STL.CircularLinkedList();

// Methods available:

// 1. append(value) - Adds a value to the end of the circular list
cll.append(10);
cll.append(20);

// 2. prepend(value) - Adds a value to the beginning of the list
cll.prepend(5);

// 3. delete(value) - Removes all occurrences of the given value
cll.delete(20);

// 4. find(value) - Returns the first node with the given value
const node = cll.find(10);
console.log(node?.value); // 10

// 5. contains(value) - Returns true if the value exists in the list
console.log(cll.contains(5)); // true

// 6. size() - Returns the number of elements in the list
console.log(cll.size()); // 2

// 7. isEmpty() - Checks whether the list is empty
console.log(cll.isEmpty()); // false

// 8. clear() - Removes all nodes
cll.clear();
console.log(cll.isEmpty()); // true

// 9. toArray(limit?) - Returns an array of values (optional limit)
cll.append(1);
cll.append(2);
cll.append(3);
console.log(cll.toArray()); // [1, 2, 3]

// 10. print(limit?) - Logs the list up to a limit to avoid infinite loop
cll.print(); // 1 -> 2 -> 3 -> ...
// Using npm (ESM/TypeScript)
import { Pair } from "@coderbaba/stl-js";
const pair = new Pair<string, string>("TS", "JS");

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const pair = new STL.Pair("TS", "JS");

// Methods available:

// 1. getFirst() - Returns the first value in the pair
console.log(pair.getFirst()); // "TS"

// 2. getSecond() - Returns the second value in the pair
console.log(pair.getSecond()); // "JS"

// 3. setFirst(value) - Sets a new first value
pair.setFirst("Coder");

// 4. setSecond(value) - Sets a new second value
pair.setSecond("Baba");

// 5. toArray() - Converts the pair to an array
console.log(pair.toArray()); // ["Coder", "Baba"]

// 6. toString() - Converts the pair to a string representation
console.log(pair.toString()); // (Coder, Baba)

// 7. toObject() - Converts the pair to an object representation
console.log(pair.toObject()); // { first: "Coder", second: "Baba" }
// Using npm (ESM/TypeScript)
import { VectorPair } from "@coderbaba/stl-js";
const vop = new VectorPair<string, string>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const vop = new STL.VectorPair();

// Methods available:

// 1. push(first, second) - Adds a new pair to the end of the vector
vop.push("TS", "JS");
vop.push("Node", "React");

// 2. pop() - Removes and returns the last pair
const last = vop.pop();
console.log(last?.toString()); // (Node, React)

// 3. get(index) - Returns the pair at the given index
const pair = vop.get(0);
console.log(pair?.toString()); // (TS, JS)

// 4. size() - Returns the number of pairs in the vector
console.log(vop.size()); // 1

// 5. isEmpty() - Checks if the vector is empty
console.log(vop.isEmpty()); // false

// 6. clear() - Clears all pairs from the vector
vop.clear();
console.log(vop.isEmpty()); // true

// 7. toArray() - Converts all pairs to an array of [T, U]
vop.push("A", "B");
vop.push("X", "Y");
console.log(vop.toArray()); // [["A", "B"], ["X", "Y"]]

// 8. toString() - Returns a string representation of all pairs
console.log(vop.toString()); // [(A, B), (X, Y)]

// 9. findByFirst(value) - Finds the first pair with a matching first value
const foundFirst = vop.findByFirst("A");
console.log(foundFirst?.toString()); // (A, B)

// 10. findBySecond(value) - Finds the first pair with a matching second value
const foundSecond = vop.findBySecond("Y");
console.log(foundSecond?.toString()); // (X, Y)

// 11. forEach(callback) - Iterates over each pair
vop.forEach((pair, index) => {
  console.log(index, pair.toString());
});

// 12. sortByFirst(compareFn?) - Sorts the vector by the first value
vop.sortByFirst(); // Uses default < if available
vop.sortByFirst((a, b) => a.localeCompare(b)); // Custom string comparison

// 13. sortBySecond(compareFn?) - Sorts the vector by the second value
vop.sortBySecond(); // Uses default < if available
vop.sortBySecond((a, b) => a.localeCompare(b)); // Custom string comparison
// Using npm (ESM/TypeScript)
import { MinHeap } from "@coderbaba/stl-js";
const heap = new MinHeap<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const heap = new STL.MinHeap();

// Methods available:

// 1. insert(value) - Inserts a value into the heap
heap.insert(40);
heap.insert(10);
heap.insert(30);
heap.insert(20);

// 2. extractMin() - Removes and returns the minimum (top) element
console.log(heap.extractMin()); // 10

// 3. peek() - Returns the minimum value without removing it
console.log(heap.peek()); // 20

// 4. size() - Returns the number of elements in the heap
console.log(heap.size()); // 3
// Using npm (ESM/TypeScript)
import { MaxHeap } from "@coderbaba/stl-js";
const heap = new MaxHeap<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const heap = new STL.MaxHeap();

// Methods available:

// 1. insert(value) - Inserts a value into the heap
heap.insert(15);
heap.insert(40);
heap.insert(30);
heap.insert(50);

// 2. extractMax() - Removes and returns the maximum (top) element
console.log(heap.extractMax()); // 50

// 3. peek() - Returns the maximum value without removing it
console.log(heap.peek()); // 40

// 4. size() - Returns the number of elements in the heap
console.log(heap.size()); // 3
// Using npm (ESM/TypeScript)
import { MultiMap } from "@coderbaba/stl-js";
const multimap = new MultiMap<string, string>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const multimap = new STL.MultiMap();

// Methods available:

// 1. set(key, value) - Adds a value under the specified key
multimap.set("fruit", "apple");
multimap.set("fruit", "banana");
multimap.set("color", "red");

// 2. get(key) - Returns all values associated with the key
console.log(multimap.get("fruit")); // ["apple", "banana"]

// 3. has(key) - Checks if the key exists
console.log(multimap.has("color")); // true

// 4. delete(key) - Deletes the key and all its values
multimap.delete("color"); // true

// 5. delete(key, value) - Deletes a specific value from the key
multimap.delete("fruit", "banana"); // true

// 6. clear() - Removes all keys and values
// multimap.clear();

// 7. keys() - Returns all keys in the multimap
console.log(multimap.keys()); // ["fruit"]

// 8. values() - Returns all values in the multimap
console.log(multimap.values()); // ["apple"]

// 9. entries() - Returns all key-value[] pairs
console.log(multimap.entries()); // [["fruit", ["apple"]]]

// 10. size() - Returns the number of keys
console.log(multimap.size()); // 1

// 11. forEach(callback) - Iterates over each key and its values
multimap.forEach((key, values) => {
  console.log(`${key}: ${values.join(", ")}`);
});
// Using npm (ESM/TypeScript)
import { BinaryTree } from "@coderbaba/stl-js";
const tree = new BinaryTree<number>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const tree = new STL.BinaryTree();

// Methods available:

// 1. insert(value) - Inserts a value into the tree using level-order (BFS)
tree.insert(10);
tree.insert(20);
tree.insert(30);
tree.insert(40);

// Tree structure (level-order):
//        10
//       /  \
//     20    30
//    /
//  40

// 2. inOrder() - Returns an array of values using in-order traversal (Left → Root → Right)
console.log(tree.inOrder()); // [40, 20, 10, 30]

// 3. preOrder() - Returns an array of values using pre-order traversal (Root → Left → Right)
console.log(tree.preOrder()); // [10, 20, 40, 30]

// 4. postOrder() - Returns an array of values using post-order traversal (Left → Right → Root)
console.log(tree.postOrder()); // [40, 20, 30, 10]
// Using npm (ESM/TypeScript)
import { UnorderedSet } from "@coderbaba/stl-js";
const mySet = new UnorderedSet<string>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const mySet = new STL.UnorderedSet();

// Methods available:

// 1. add(value) - Adds a value to the set
mySet.add("apple");
mySet.add("banana");

// 2. has(value) - Checks if the set contains the value
console.log(mySet.has("apple")); // true
console.log(mySet.has("grape")); // false

// 3. delete(value) - Removes a value from the set
mySet.delete("banana"); // true

// 4. clear() - Removes all values from the set
// mySet.clear();

// 5. size() - Returns the number of elements in the set
console.log(mySet.size()); // 1

// 6. values() - Returns all values in the set as an array
console.log(mySet.values()); // ["apple"]

// 7. forEach(callback) - Executes a callback for each element in the set
mySet.forEach((value) => {
  console.log("Item:", value);
});
// Using npm (ESM/TypeScript)
import { UnorderedMap } from "@coderbaba/stl-js";
const map = new UnorderedMap<string, string>();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const map = new STL.UnorderedMap();

// Methods available:

// 1. set(key, value) - Adds or updates a key-value pair
map.set("name", "John");
map.set("role", "Developer");

// 2. get(key) - Retrieves the value for a given key
console.log(map.get("name")); // "Amaan"

// 3. has(key) - Checks if a key exists in the map
console.log(map.has("role")); // true

// 4. delete(key) - Removes a key-value pair
map.delete("role"); // true

// 5. clear() - Removes all entries from the map
// map.clear();

// 6. size() - Returns the number of entries in the map
console.log(map.size()); // 1

// 7. keys() - Returns all keys in the map
console.log(map.keys()); // ["name"]

// 8. values() - Returns all values in the map
console.log(map.values()); // ["Amaan"]

// 9. entries() - Returns all key-value pairs as an array
console.log(map.entries()); // [["name", "Amaan"]]

// 10. forEach(callback) - Iterates over each key-value pair
map.forEach((value, key) => {
  console.log(`${key}: ${value}`);
});
// Using npm (ESM/TypeScript)
import { Graph } from "@coderbaba/stl-js";
const graph = new Graph();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const graph = new STL.Graph();

// Methods available:

// 1. addVertex(vertex) - Adds a new vertex
graph.addVertex("A");
graph.addVertex("B");

// 2. addEdge(v1, v2) - Adds an undirected edge between two vertices
graph.addEdge("A", "B");
graph.addEdge("A", "C");
graph.addEdge("B", "D");

// Graph structure:
// A - B
// |   |
// C   D

// 3. removeEdge(v1, v2) - Removes the edge between v1 and v2
graph.removeEdge("A", "B");

// 4. removeVertex(vertex) - Removes the vertex and all its edges
graph.removeVertex("C");

// 5. dfs(start) - Performs depth-first traversal starting from `start`
console.log(graph.dfs("A")); // Example: ["A", "B", "D"]

// 6. bfs(start) - Performs breadth-first traversal starting from `start`
console.log(graph.bfs("A")); // Example: ["A", "B", "D"]
// Using npm (ESM/TypeScript)
import { Trie } from "@coderbaba/stl-js";
const trie = new Trie();

// Using CDN (Vanilla JS)
<script src="https://unpkg.com/@coderbaba/stl-js/dist/index.global.js"></script>;
const trie = new STL.Trie();

// Methods available:

// 1. insert(word) - Inserts a word into the trie
trie.insert("apple");
trie.insert("app");
trie.insert("bat");

// 2. search(word) - Returns true if the exact word exists
console.log(trie.search("app")); // true
console.log(trie.search("apple")); // true
console.log(trie.search("appl")); // false

// 3. startsWith(prefix) - Returns true if any word starts with the prefix
console.log(trie.startsWith("ap")); // true
console.log(trie.startsWith("ba")); // true
console.log(trie.startsWith("ca")); // false

// 4. delete(word) - Deletes a word if it exists
console.log(trie.delete("apple")); // true
console.log(trie.search("apple")); // false

// 5. getAllWords() - Returns all words stored in the trie
console.log(trie.getAllWords()); // ["app", "bat"]