3 import qualified Data.Map as M
4 import qualified Data.Set as S
7 isSublistOf [] _ = True
8 isSublistOf what l = contains' l
9 where contains' [] = False
10 contains' text = what `isPrefixOf` text || contains' (tail text)
12 type MapDef k v = (v, M.Map k v)
14 startCombine :: (Ord k) => a -> MapDef k a
15 startCombine f = (f, M.empty)
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)
23 stopCombine :: MapDef k c -> M.Map k c
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
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')