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