Skip to main content

LinearMap<K, V>

Pebble 0.3.1 · all symbols on this page are stable.

An association list — Cardano's on-chain "map". Structurally a List<LinearMapEntry<K, V>> where each entry is a (K, V) pair. Lookups are O(n); choose it because the underlying Plutus representation is what the chain speaks, not because it's fast.

const m: LinearMap<bytes, int> = { #01: 10, #02: 20 };

match m.lookup(#01) {
Some{ value: amount }: trace(amount),
None{}: fail "missing"
}

Literals

const empty: LinearMap<bytes, int> = {};
const m: LinearMap<bytes, int> = { #01: 10, #02: 20 };

The key/value types are inferred from context.

Methods

MethodDescription
length(): intNumber of entries. O(n).
isEmpty(): boolTrue iff there are no entries.
head(): LinearMapEntry<K, V>First (K, V) pair. Fails on empty.
tail(): LinearMap<K, V>Map without its first entry. Fails on empty.
lookup(k: K): Optional<V>First value bound to k, wrapped in Some, or None.
prepend(k: K, v: V): LinearMap<K, V> (requires K: ToData, V: ToData)Add (k, v) at the front. Both type parameters must implement ToData.
Duplicate keys

LinearMap allows duplicates. lookup returns the first match. To enforce uniqueness, do so at insertion or de-duplicate before lookup.

Examples (one per method)

const m: LinearMap<bytes, int> = { #01: 10, #02: 20 };

const n: int = m.length(); // 2
const e: bool = m.isEmpty(); // false
const h: LinearMapEntry<bytes, int> = m.head(); // (#01, 10)
const t: LinearMap<bytes, int> = m.tail(); // { #02: 20 }
const got: Optional<int> = m.lookup(#02); // Some{ value: 20 }
const m2: LinearMap<bytes, int> = m.prepend(#03, 30); // { #03:30, #01:10, #02:20 }

LinearMapEntry<K, V>

The entry returned by head(). Has two fields:

FieldTypeDescription
fstKThe key.
sndVThe value.

Iteration

LinearMap<K, V> is structurally a list, so anything that works on a list works here. To iterate, use for...of or list helpers:

for( const entry of m ) {
trace(entry.fst);
trace(entry.snd);
}

See also