bbfd733aa33dbd0ee2993d1339770f024fdaba16
[darcs-mirror-hpvt.git] / Utils.hs
1 module Utils where
2
3 import qualified Data.Map as M
4 import qualified Data.Set as S
5 import Data.List
6
7 isSublistOf []   _   = True
8 isSublistOf what l = contains' l
9  where  contains' []   = False
10         contains' text = what `isPrefixOf` text || contains' (tail text)
11
12 type MapDef k v = (v, M.Map k v)
13
14 startCombine :: (Ord k) => a -> MapDef k a
15 startCombine f = (f, M.empty)
16
17 mapCombine :: (Ord k) => MapDef k (Maybe b -> c) -> M.Map k b -> MapDef k c
18 mapCombine (def,a) b = (def Nothing, result)
19   where keys = M.keysSet a `S.union` M.keysSet b
20         result = fromSet app keys
21         app k= M.findWithDefault def k a (M.lookup k b)
22
23 stopCombine :: MapDef k c -> M.Map k c
24 stopCombine = snd
25
26 fromSet :: Ord k => (k -> v) -> S.Set k -> M.Map k v
27 fromSet v = S.fold (\k -> M.insert k (v k)) M.empty
28
29
30 fromListMax :: (Ord k, Ord a) => [(k,a)] -> M.Map k a
31 fromListMax = foldr insert M.empty
32   where insert (k,v) = M.alter (higher v) k
33         higher v Nothing   = Just v
34         higher v (Just v') = Just (max v v')
35