hocon-0.1.0.0: src/Data/Map.hs
module Data.Map
( groupBy
, sortByKey
, Map
)
where
import Data.List (sortBy)
type Map k v = [(k, v)]
groupBy :: (Ord k, Eq k) => (v -> k) -> [v] -> Map k [v]
groupBy f vs = sortBy (\(k1, _) (k2, _) -> compare k1 k2) $ go f (vs, [])
where
go :: Eq k => (v -> k) -> ([v], Map k [v]) -> Map k [v]
go _ ([], vs) = vs
go f (v : vs, acc) =
let
append key value (k, v) = if key == k then (k, value : v) else (k, v)
acc' = if any (\(k', _) -> k' == f v) acc then map (append (f v) v) acc else (f v, [v]) : acc
in go f (vs, acc')
sortByKey :: (Ord k) => Map k v -> Map k v
sortByKey = sortBy (\a b -> compare (fst a) (fst b))