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