1    type Multiset<T>
2        def bind (f : T -> Unit) (g : T -> Unit) =
3            let token = subscribe f g
4    
5            for x in self do
6                f x
7    
8            Token { token.discard
9                    for x in self do
10                       g x }
11   
12   object Obs
13       def map<T, U> (multiset : Multiset<T>) (f : T -> U) =
14           let to = Multiset<U>.new
15           let map = StdMap<T, U>.new
16   
17           multiset.bind { x -> let value = f x
18                                map.add x value
19                                to.add value
20                                @[weak to] }
21                         { x -> let value = map[x]
22                                map.remove x
23                                to.remove value
24                                @[weak to] }
25           |> to.push_token
26   
27           to.as_readonly
28   
29       def to_multimap<T, K, V> (multimap : Multiset<T>) (f : T -> K * V) =
30           let to = Multimap<K, V>.new
31   
32           multimap.bind { x -> let (k, v) = f x
33                                to.add k v
34                                @[weak to] }
35                         { x -> let (k, v) = f x
36                                to.remove k v
37                                @[weak to] }
38           |> to.push_token
39   
40           to.as_readonly
41