From 5f1233a39381bd22a315aeb31793987f756676a4 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Tue, 23 Sep 2025 20:04:26 -0500 Subject: [PATCH] Sketch HashMap impl. --- sketching/september_2025/map/Map.dm | 58 +++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 sketching/september_2025/map/Map.dm diff --git a/sketching/september_2025/map/Map.dm b/sketching/september_2025/map/Map.dm new file mode 100644 index 0000000..b25577b --- /dev/null +++ b/sketching/september_2025/map/Map.dm @@ -0,0 +1,58 @@ +pub trait HashCode + fn hash() -> USize +end + +pub int Map + fn get(key: K) -> Option<&V> + fn put(key: K, value: V) -> Void + fn take(key: K) -> Option +end + +pub class HashMap(hasher: impl HashCode[K]) : Map + + class Entry(pub key: K, pub value: V) end + + let mut buckets: List>> = ArrayList(size: 10, init: { [] }) + + fn getBucketIndex(key: K) -> Int + hasher.hash(key) & buckets.size() + end + + impl fn put(key: K, value: V) -> Void + let bucket = buckets[getBucketIndex(key)] + bucket.add(Entry(key, value)) + end + + impl fn get(key: K) -> Option<&V> + let bucket = buckets[getBucketIndex(key)] // bucket: &List> + bucket.find { it.key == key } // it: &Entry + .map { it.value } // it.value: &V + end + + impl fn take(key: K) -> Option + let mut bucket = buckets.take(getBucketIndex(key), []) // bucket: List> + if bucket.findIndex { it.key == key } is Some(index) then + let entry = bucket.remove(index) // entry: Entry + Some(entry.value) // moved out of Entry + else + None + end + end + +end + +impl HashCode for String + fn hash() -> Int = todo() +end + +class Greeter(pub greeting: String) end + +fn main() + let greeterMap: Map = HashMap(HashCode[]) // Short for HashCode[String] + greeterMap.put("friendly", Greeter("Friendly hello!")) + greeterMap.put("nasty", Greeter("Nasty hello!")) + let friendlyGreeter: &Greeter = greeterMap.get("friendly").unwrap() + println friendlyGreeter.greeting + let nastyGreeter: Greeter = greeterMap.take("nasty").unwrap() + println nastyGreeter.greeting +end \ No newline at end of file