tur/hamt
hamt/new
(hamt/new :ptr<void>)
create a new empty persistent HAMT.
Since: Phase P1
hamt/free
(hamt/free [m :ptr<void>] :void)
decrement the reference count of a HAMT; free if it reaches zero.
| m | HAMT pointer |
Since: Phase P1
hamt/retain
(hamt/retain [m :ptr<void>] :ptr<void>)
increment the reference count of a HAMT and return it.
| m | HAMT pointer |
Since: Phase P1
hamt/set
(hamt/set [m :ptr<void> hash :int key :ptr<void> val :ptr<void>] :ptr<void>)
insert or update a key/value pair; returns a new HAMT.
| m | source HAMT pointer | |
| hash | 64-bit hash of the key (passed as int64_t) | |
| key | key pointer | |
| val | value pointer |
Since: Phase P1
hamt/del
(hamt/del [m :ptr<void> hash :int key :ptr<void>] :ptr<void>)
delete a key from the HAMT; returns a new HAMT.
| m | source HAMT pointer | |
| hash | 64-bit hash of the key | |
| key | key pointer |
Since: Phase P1
hamt/get
(hamt/get [m :ptr<void> hash :int key :ptr<void>] :ptr<void>)
look up a key and return its value, or NULL if absent.
| m | HAMT pointer | |
| hash | 64-bit hash of the key | |
| key | key pointer |
Since: Phase P1
hamt/has?
(hamt/has? [m :ptr<void> hash :int key :ptr<void>] :bool)
check whether a key exists in the HAMT.
| m | HAMT pointer | |
| hash | 64-bit hash of the key | |
| key | key pointer |
Since: Phase P1
hamt/count
(hamt/count [m :ptr<void>] :int)
return the number of key/value pairs in the HAMT.
| m | HAMT pointer |
Since: Phase P1
hamt/merge
(hamt/merge [a :ptr<void> b :ptr<void>] :ptr<void>)
merge two HAMTs; values from b win on key collision.
| a | first HAMT pointer | |
| b | second HAMT pointer (wins on collision) |
Since: Phase P1
hamt/hash-str
(hamt/hash-str [str :cstr] :int)
compute an xxHash64 of a NUL-terminated C string.
| str | NUL-terminated C string to hash |
Since: Phase P1
hamt/hash-ptr
(hamt/hash-ptr :int)
hash a pointer value directly (identity hash).
| ptr | pointer whose address is used as the hash input |
Since: Phase P1
hamt/iter-init
(hamt/iter-init [iter :ptr<void> m :ptr<void>] :void)
initialize a stack-allocated iterator over a HAMT.
| iter | pre-allocated buffer of at least 64 bytes | |
| m | HAMT pointer to iterate over |
Since: Phase P1
hamt/iter-free
(hamt/iter-free [iter :ptr<void>] :void)
release any resources held by an iterator.
| iter | iterator buffer previously passed to hamt/iter-init |
Since: Phase P1
hamt/iter-next
(hamt/iter-next [iter :ptr<void> hash-out :ptr<void> key-out :ptr<void> val-out :ptr<void>] :bool)
advance an iterator and write the next entry into out-pointers.
| iter | iterator buffer | |
| hash-out | pointer that receives the key hash | |
| key-out | pointer that receives the key pointer | |
| val-out | pointer that receives the value pointer |
Since: Phase P1
hamt/map
(hamt/map [m :ptr<void> fn :ptr<void> ctx :ptr<void>] :ptr<void>)
return a new HAMT with each value replaced by fn(val, ctx).
| m | source HAMT pointer | |
| fn | C function pointer (val :ptr, ctx :ptr) -> :ptr | |
| ctx | caller-supplied context passed to fn |
Since: Phase P1
hamt/filter
(hamt/filter [m :ptr<void> fn :ptr<void> ctx :ptr<void>] :ptr<void>)
return a new HAMT keeping only entries where fn(key, val, ctx) is true.
| m | source HAMT pointer | |
| fn | C predicate pointer (key :ptr, val :ptr, ctx :ptr) -> bool | |
| ctx | caller-supplied context passed to fn |
Since: Phase P1
hamt/reduce
(hamt/reduce [m :ptr<void> fn :ptr<void> init :ptr<void> ctx :ptr<void>] :ptr<void>)
fold all entries into an accumulator using fn(acc, key, val, ctx).
| m | source HAMT pointer | |
| fn | C function pointer (acc :ptr, key :ptr, val :ptr, ctx :ptr) -> :ptr | |
| init | initial accumulator pointer | |
| ctx | caller-supplied context passed to fn |
Since: Phase P1
hamt/merge-with
(hamt/merge-with [a :ptr<void> b :ptr<void> fn :ptr<void> ctx :ptr<void>] :ptr<void>)
merge two HAMTs, resolving key conflicts with fn(val_a, val_b, ctx).
| a | first HAMT pointer | |
| b | second HAMT pointer | |
| fn | C function pointer (val_a :ptr, val_b :ptr, ctx :ptr) -> :ptr | |
| ctx | caller-supplied context passed to fn |
Since: Phase P1
hamt/show
(hamt/show [m :ptr<void>] :cstr)
return a debug string "{k->v, ...}" for the HAMT; caller must free.
| m | HAMT pointer |
Since: Phase P1
hamt/dump
(hamt/dump [m :ptr<void>] :void)
write the HAMT structure in DOT format to stderr for debugging.
| m | HAMT pointer to dump |
Since: Phase P1
hamt/transient
(hamt/transient [m :ptr<void>] :ptr<void>)
fork a mutable transient from an immutable HAMT.
| m | immutable HAMT pointer to fork from |
Since: Phase P1
hamt/transient-set!
(hamt/transient-set! [t :ptr<void> hash :int key :ptr<void> val :ptr<void>] :void)
mutate a transient by inserting or updating a key in place.
| t | transient HAMT pointer | |
| hash | 64-bit hash of the key | |
| key | key pointer | |
| val | value pointer |
Since: Phase P1
hamt/transient-del!
(hamt/transient-del! [t :ptr<void> hash :int key :ptr<void>] :void)
mutate a transient by deleting a key in place.
| t | transient HAMT pointer | |
| hash | 64-bit hash of the key | |
| key | key pointer |
Since: Phase P1
hamt/persistent!
(hamt/persistent! [t :ptr<void>] :ptr<void>)
seal a transient into an immutable HAMT.
| t | transient HAMT pointer (must not be used after this call) |
Since: Phase P1
Internal definitions
hamt/autolink-hint-- internal marker that triggers hamt.c compilation in tur build/run.