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