@std/collections

API Reference

class Map

Insertion-ordered hash table from keys to values. Build one with new Map<K, V>(), fill it with set, and read it back with get or has. A missing key reads as null rather than aborting, so ?? and ?. supply defaults.

Entries keep insertion order: setting an existing key keeps its slot, and deleting a key then setting it again appends it at the end. The deinit block frees the table and drops the map's reference to every key and value it still holds.

Keys must be Int, Float, Bool, String, or a heap object compared by identity; see the module notes for the full key rules. Printing a map renders {k: v, ...} in insertion order through the @std/io pretty renderer, so read the contents with keys() or values() when you need the pieces as values instead.

init()

fields

  • handle: Int
fn clear()

Drop every entry at once, releasing the map's reference to each key and value. The map stays usable, and later entries start a fresh insertion order.

import { Map } from "@std/collections";

let m = new Map<String, Int>();
m.set("a", 1);
m.set("b", 2);
m.clear();
print(m.len(), m.keys().join(","));
Run in Playground
fn delete(key: K): Bool

Remove the entry for key and drop the map's reference to that key and value. The remaining keys keep their order, and a key set again later is appended at the end rather than returning to its old slot.

key — entry key.

returns — true when an entry was removed, false when key had none.

import { Map } from "@std/collections";

let m = new Map<String, Int>();
m.set("a", 1);
m.set("b", 2);
print(m.delete("a"), m.len());
print(m.delete("a"));
print(m.keys().join(","));
Run in Playground
fn get(key: K): V?

Read the value stored under key.

A missing key reads as null instead of aborting, which means a null you stored yourself looks the same as an absent key. Use has to tell them apart, or ?? and ?. to pick a default.

key — entry key.

returns — the stored value, or `null` when key has no entry.

import { Map } from "@std/collections";

let m = new Map<String, Int>();
m.set("ore", 7);
print(m.get("ore") ?? 0);
print(m.get("coal") ?? 0);
Run in Playground
fn has(key: K): Bool

Test whether key currently has an entry. An entry holding null still counts as present, which is the one case get cannot report.

key — entry key.

returns — true when key is present, false when it is absent.

import { Map } from "@std/collections";

let m = new Map<String, Int>();
m.set("ore", 7);
print(m.has("ore"), m.has("coal"));
Run in Playground
fn iterator(): Iterator<K>

Fresh iterator over the keys in insertion order. This is what for..in calls, and every call restarts at the first key; next() yields null once the keys run out.

returns — an iterator over the keys.

import { Map } from "@std/collections";

let m = new Map<String, Int>();
m.set("iron", 12);
m.set("coal", 7);
for name in m {
print(name, m.get(name) ?? 0);
}
Run in Playground
fn keys(): Array<K>

Snapshot of every key in insertion order, aligned index by index with values(). Mutating the returned array does not touch the map.

returns — a new key array; empty when the map is empty.

import { Map } from "@std/collections";

let m = new Map<String, Int>();
m.set("iron", 12);
m.set("coal", 7);
m.set("iron", 14);
print(m.keys().join(", "));
print(m.len());
Run in Playground
fn len(): Int

Number of live entries. Overwriting a key does not change it, and a deleted key stops counting right away.

returns — entry count; 0 for an empty map.

fn set(key: K, val: V)

Store val under key. An existing entry for key is overwritten: the key keeps its position in insertion order, the old value's reference is dropped, and len() does not change. A key that was deleted earlier is a new entry and lands at the end.

The map takes a reference to val and keeps it until the entry is overwritten, deleted, or cleared. Nothing is returned, so calls cannot be chained.

key — entry key; must be `Int`, `Float`, `Bool`, `String`, or a heap object compared by identity.

val — value to store.

import { Map } from "@std/collections";

let m = new Map<String, Int>();
m.set("a", 1);
m.set("b", 2);
m.set("a", 10);
print(m.keys().join(","));
print(m.values().join(","));
Run in Playground
fn values(): Array<V>

Snapshot of every value in key insertion order, aligned index by index with keys(). Mutating the returned array does not touch the map.

returns — a new value array; empty when the map is empty.

import { Map } from "@std/collections";

let m = new Map<String, Int>();
m.set("iron", 12);
m.set("coal", 7);
print(m.values().join(", "));
Run in Playground
class Set

Distinct members backed by a Map<T, Bool>, so members follow the same rules as Map keys: only hashable types, kept by reference count, handed back in insertion order. Adding a member that is already there keeps one copy and leaves its position alone. values() is the member list, since the member is the key.

The table lock makes a set shareable between threads; guard a check-then-add pair with a Mutex from @std/sync when threads race. The deinit block frees the backing map.

init()

fields

  • inner: Map<T, Bool>
fn add(val: T)

Add val as a member. A member that is already present is left untouched, so the length does not change and its position in insertion order stays where it was. A member that was deleted earlier is added again at the end.

The set takes a reference to val and keeps it until the member is deleted or the set is cleared. Nothing is returned, so calls cannot be chained.

val — member value; must be a hashable type.

import { Set } from "@std/collections";

let s = new Set<String>();
s.add("ore");
s.add("ore");
print(s.has("ore"), s.len());
print(s.values().join(", "));
Run in Playground
fn clear()

Drop every member at once, releasing the set's reference to each one. The set stays usable and later members start a fresh insertion order.

import { Set } from "@std/collections";

let s = new Set<String>();
s.add("ore");
s.add("coal");
s.clear();
print(s.len(), s.values().join(","));
Run in Playground
fn delete(val: T): Bool

Remove a member and drop the set's reference to it. The remaining members keep their order, and a member added again later lands at the end.

val — member value.

returns — true when a member was removed, false when val was absent.

import { Set } from "@std/collections";

let s = new Set<String>();
s.add("ore");
s.add("coal");
print(s.delete("ore"), s.len());
print(s.values().join(", "));
Run in Playground
fn has(val: T): Bool

Test whether val is currently a member.

val — member value.

returns — true when val is present, false when it is not.

import { Set } from "@std/collections";

let s = new Set<String>();
s.add("ore");
print(s.has("ore"), s.has("coal"));
Run in Playground
fn iterator(): Iterator<T>

Fresh iterator over the members in insertion order. This is what for..in calls, and every call restarts at the first member; next() yields null once the members run out.

returns — an iterator over the members.

import { Set } from "@std/collections";

let s = new Set<String>();
s.add("iron");
s.add("coal");
for member in s {
print(member);
}
Run in Playground
fn len(): Int

Number of distinct members.

returns — member count; 0 for an empty set.

fn values(): Array<T>

Snapshot of every member in insertion order. Mutating the returned array does not touch the set.

returns — a new member array; empty when the set is empty.

import { Set } from "@std/collections";

let s = new Set<String>();
s.add("iron");
s.add("coal");
print(s.values().join(", "));
Run in Playground