Sketch HashMap impl.
This commit is contained in:
		
							parent
							
								
									2a2936ef02
								
							
						
					
					
						commit
						5f1233a393
					
				
							
								
								
									
										58
									
								
								sketching/september_2025/map/Map.dm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								sketching/september_2025/map/Map.dm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | |||||||
|  | pub trait HashCode | ||||||
|  |     fn hash() -> USize | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | pub int Map<K, V> | ||||||
|  |     fn get(key: K) -> Option<&V> | ||||||
|  |     fn put(key: K, value: V) -> Void | ||||||
|  |     fn take(key: K) -> Option<V> | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | pub class HashMap<K, V>(hasher: impl HashCode[K]) : Map<K, V> | ||||||
|  |      | ||||||
|  |     class Entry<K, V>(pub key: K, pub value: V) end | ||||||
|  |      | ||||||
|  |     let mut buckets: List<List<Entry<K, V>>> = 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<Entry<K, V>> | ||||||
|  |         bucket.find { it.key == key } // it: &Entry<K, V> | ||||||
|  |             .map { it.value } // it.value: &V | ||||||
|  |     end | ||||||
|  |      | ||||||
|  |     impl fn take(key: K) -> Option<V> | ||||||
|  |         let mut bucket = buckets.take(getBucketIndex(key), []) // bucket: List<Entry<K, V>> | ||||||
|  |         if bucket.findIndex { it.key == key } is Some(index) then | ||||||
|  |             let entry = bucket.remove(index) // entry: Entry<K, V> | ||||||
|  |             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<String, Greeter> = 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 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Jesse Brault
						Jesse Brault