summaryrefslogtreecommitdiff
path: root/src/multimap_fn.sml
blob: 3dab68a566ba6a10dca6af37fbbff5d5e570ee98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
functor MultimapFn (structure KeyMap : ORD_MAP structure ValSet : ORD_SET) = struct
    type key = KeyMap.Key.ord_key
    type item = ValSet.item
    type itemSet = ValSet.set
    type multimap = ValSet.set KeyMap.map
    val empty : multimap = KeyMap.empty
    fun insertSet (kToVs : multimap, k : key, vs : itemSet) : multimap =
        KeyMap.unionWith ValSet.union (kToVs, KeyMap.singleton (k, vs))
    fun insert (kToVs : multimap, k : key, v : item) : multimap =
        insertSet (kToVs, k, ValSet.singleton v)
    fun findSet (kToVs : multimap, k : key) =
        case KeyMap.find (kToVs, k) of
            SOME vs => vs
          | NONE => ValSet.empty
    val findList : multimap * key -> item list = ValSet.listItems o findSet
end