1 type MultimapIterator<K, V> = 2 inherit Iterator<(K, V)> 3 4 let multimap : Multimap<K, V> 5 let version = multimap.version 6 let iterator = multimap.map.get_iterator 7 let mut maybe_k : Option<K> = None 8 let mut maybe_iter : Option<SetIterator<V>> = None 9 10 let find_next () = 11 repeat 12 if maybe_iter.is_none then 13 if iterator.move_next then 14 let (k, set) = iterator.get_value 15 maybe_k = Some k 16 maybe_iter = Some set.get_iterator 17 else 18 return None 19 20 case maybe_iter.unwrap.try_next of 21 None -> 22 maybe_k = None 23 maybe_iter = None 24 25 Some v -> 26 return Some (maybe_k.unwrap, v) 27 28 let mut maybe_next = find_next 29 30 def Iterator.move_next = 31 assert multimap.version == version 32 maybe_next = find_next 33 maybe_next.is_some 34 35 def Iterator.get_value = maybe_next.unwrap 36 37 end@ multimap 38 39 type Multimap<K, V> 40 def try_size = Some size |> as_option 41 def get_iterator = MultimapIterator<K, V> self 42 43 is Iterable<(K, V)> 44