Collections Domain
The Collections domain is your toolbox for structured data. While List is great for simple sequences, real-world software needs more. Whether you need to look up users by their ID (Map), keep a list of unique tags (Set), or process tasks by priority (Heap), this domain provides persistent data structures designed for functional code.
Overview
use aivi.collections (Map, Set)
scores = Map.empty()
|> Map.insert("Alice", 100)
|> Map.insert("Bob", 95)
if scores |> Map.has("Alice") {
print("Alice is present")
}v1.0 Scope
- Map/Dict: persistent ordered maps (AVL/Red-Black) and/or HashMaps (HAMT).
- Set: persistent sets corresponding to map types.
- Queue/Deque: efficient FIFO/LIFO structures.
- Heap/PriorityQueue.
Literals and Merging (v1.0)
Collections introduce sigil-based literals for concise construction. These are domain literals and are validated at compile time.
Map literal
users = ~map{
"id-1" => { name: "Alice", age: 30 }
"id-2" => { name: "Bob", age: 25 }
}Rules:
- Entries use
key => value. - Keys and values are full expressions.
...exprspreads another map into the literal.- When duplicate keys exist, the last entry wins (right-biased).
defaults = ~map{ "theme" => "light", "lang" => "en" }
settings = ~map{ ...defaults, "theme" => "dark" }Set literal
primes = ~set[2, 3, 5, 7, 11]
combined = ~set[...a, ...b]Rules:
- Elements are expressions.
...exprspreads another set.- Duplicates are removed (set semantics).
Merge operator
The Collections domain provides ++ as a right-biased merge for Map and union for Set.
use aivi.collections (Map, Set, domain Collections)
merged = map1 ++ map2
allTags = set1 ++ set2Core API (v1.0)
The following functions are required for v1.0 implementations. Exact module layout may vary, but names and behavior should match.
Map
| Function | Explanation |
|---|---|
Map.empty | Creates an empty map. |
Map.size map | Returns the number of entries. |
Map.has key map | Returns whether key is present. |
Map.get key map | Returns Some value or None. |
Map.insert key value map | Returns a new map with the entry inserted. |
Map.update key f map | Applies f when key exists; otherwise no-op. |
Map.remove key map | Returns a new map without key. |
Map.map f map | Transforms all values with f. |
Map.mapWithKey f map | Transforms values with access to keys. |
Map.keys map | Returns all keys as a list. |
Map.values map | Returns all values as a list. |
Map.entries map | Returns all entries as key/value pairs. |
Map.fromList entries | Builds a map from key/value pairs. |
Map.toList map | Converts a map into key/value pairs. |
Map.union left right | Merges maps with right-biased keys. |
Notes:
Map.unionis right-biased (keys from the right map override).Map.updateapplies only when the key exists; otherwise it is a no-op.
Set
| Function | Explanation |
|---|---|
Set.empty | Creates an empty set. |
Set.size set | Returns the number of elements. |
Set.has value set | Returns whether value is present. |
Set.insert value set | Returns a new set with value inserted. |
Set.remove value set | Returns a new set without value. |
Set.union left right | Returns the union of two sets. |
Set.intersection left right | Returns elements common to both sets. |
Set.difference left right | Returns elements in left not in right. |
Set.fromList values | Builds a set from a list. |
Set.toList set | Converts a set into a list. |
Queue / Deque
| Function | Explanation |
|---|---|
Queue.empty | Creates an empty queue. |
Queue.enqueue value queue | Adds value to the back. |
Queue.dequeue queue | Removes and returns the front value and remaining queue. |
Queue.peek queue | Returns the front value without removing it. |
Deque.empty | Creates an empty deque. |
Deque.pushFront value deque | Adds value to the front. |
Deque.pushBack value deque | Adds value to the back. |
Deque.popFront deque | Removes and returns the front value and rest. |
Deque.popBack deque | Removes and returns the back value and rest. |
Deque.peekFront deque | Returns the front value without removing it. |
Deque.peekBack deque | Returns the back value without removing it. |
Heap / PriorityQueue
| Function | Explanation |
|---|---|
Heap.empty | Creates an empty heap. |
Heap.push value heap | Inserts value into the heap. |
Heap.popMin heap | Removes and returns the smallest value and remaining heap. |
Heap.peekMin heap | Returns the smallest value without removing it. |
Heap ordering is determined by Ord for the element type.