blob: a8f30efbc8550d4c98feac1bb94d8afc73e35624 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
module T20112A (
-- * Data structure
AdjacencyMap, adjacencyMap, transpose, overlays
) where
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
newtype AdjacencyMap a = AM {
adjacencyMap :: Map a (Set.Set a) }
overlays :: Ord a => [AdjacencyMap a] -> AdjacencyMap a
overlays = AM . Map.unionsWith Set.union . map adjacencyMap
transpose :: Ord a => AdjacencyMap a -> AdjacencyMap a
transpose (AM m) = AM $ Map.foldrWithKey combine vs m
where
combine v es = Map.unionWith Set.union (Map.fromSet (const $ Set.singleton v) es)
vs = Map.fromSet (const Set.empty) (Map.keysSet m)
|