ziv@2203: functor MultimapFn (structure KeyMap : ORD_MAP structure ValSet : ORD_SET) = struct ziv@2203: type key = KeyMap.Key.ord_key ziv@2203: type item = ValSet.item ziv@2213: type itemSet = ValSet.set ziv@2203: type multimap = ValSet.set KeyMap.map ziv@2213: val empty : multimap = KeyMap.empty ziv@2213: fun insertSet (kToVs : multimap, k : key, vs : itemSet) : multimap = ziv@2203: KeyMap.unionWith ValSet.union (kToVs, KeyMap.singleton (k, vs)) ziv@2203: fun insert (kToVs : multimap, k : key, v : item) : multimap = ziv@2213: insertSet (kToVs, k, ValSet.singleton v) ziv@2213: fun findSet (kToVs : multimap, k : key) = ziv@2203: case KeyMap.find (kToVs, k) of ziv@2203: SOME vs => vs ziv@2203: | NONE => ValSet.empty ziv@2213: val findList : multimap * key -> item list = ValSet.listItems o findSet ziv@2203: end