1 module Gargantext.Data.HashMap.Strict.Utils where
3 import Data.HashMap.Strict (HashMap)
4 import Data.Hashable (Hashable)
5 import Gargantext.Prelude
6 import qualified Data.HashMap.Strict as HashMap
8 ------------------------------------------------------------------------
9 unionsWith :: (Foldable f, Eq k, Hashable k) => (a->a->a) -> f (HashMap k a) -> HashMap k a
10 unionsWith f = foldl' (HashMap.unionWith f) HashMap.empty
12 ------------------------------------------------------------------------
13 -- | Partition the map according to some predicate. The first map contains all
14 -- elements that satisfy the predicate, the second all elements that fail the
16 partition :: (Ord k, Hashable k) => (a -> Bool) -> HashMap k a -> (HashMap k a, HashMap k a)
17 partition p m = (HashMap.filter p m, HashMap.filter (not . p) m)
19 -- | Partition the map according to some predicate. The first map contains all
20 -- elements that satisfy the predicate, the second all elements that fail the
22 partitionWithKey :: (Ord a, Hashable k) => (k -> a -> Bool) -> HashMap k a -> (HashMap k a, HashMap k a)
23 partitionWithKey p m = (HashMap.filterWithKey p m, HashMap.filterWithKey (\k -> not . p k) m)
25 ------------------------------------------------------------------------
26 -- getKeyWithMaxValue :: Hashable k => HashMap k a -> Maybe k
27 getKeysOrderedByValueMaxFirst :: (Ord k, Hashable k, Ord a) => HashMap k a -> [k]
28 getKeysOrderedByValueMaxFirst m = go [] Nothing (HashMap.toList m)
31 go ks Nothing ((k,v):rest) = go (k:ks) (Just v) rest
32 go ks (Just u) ((k,v):rest)
33 | v < u = go ks (Just u) rest
34 | v > u = go [k] (Just v) rest
35 | otherwise = go (k:ks) (Just v) rest