1    type Map<K, V>
2        def to_stream =
3            let stream = Stream<K>.new
4    
5            bind { k _ -> stream.push k @[weak stream] }
6                 { k _ _ -> stream.push k @[weak stream] }
7                 { k _ -> stream.push k @[weak stream] }
8            |> stream.push_token
9    
10           stream.as_readonly
11   
12   object Obs
13       def map<K, V, U> (map : Map<K, V>) (f : K * V -> U) =
14           let to = Map<K, U>.new
15   
16           map.bind { k v -> to.add k (f k v) @[weak to] }
17                    { k _ v -> to[k] = f k v @[weak to] }
18                    { k _ -> to.remove k @[weak to] }
19           |> to.push_token
20   
21           to.as_readonly
22