From e103c8e1b5bf9bf47b94e7da443186f5703ce1bb Mon Sep 17 00:00:00 2001 From: stuebinm Date: Fri, 17 Dec 2021 18:21:00 +0100 Subject: simple graphviz visualisation of a repository might be useful to have --- lib/Dirgraph.hs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'lib/Dirgraph.hs') diff --git a/lib/Dirgraph.hs b/lib/Dirgraph.hs index 0931ea0..b97a644 100644 --- a/lib/Dirgraph.hs +++ b/lib/Dirgraph.hs @@ -1,15 +1,21 @@ -{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE TupleSections #-} -- | Simple directed graphs, for dependency checking module Dirgraph where import CheckMap (MapResult (mapresultDepends)) -import Data.Map.Strict (Map, mapMaybeWithKey, mapWithKey) +import Control.Monad (forM_) +import Data.Functor ((<&>)) +import Data.Map.Strict (Map, mapMaybeWithKey, mapWithKey, + traverseWithKey) import qualified Data.Map.Strict as M import Data.Set (Set, (\\)) import qualified Data.Set as S import Paths (normalise) +import Text.Dot (Dot, (.->.)) +import qualified Text.Dot as D import Types (Dep (LocalMap)) import Witherable (mapMaybe) @@ -47,3 +53,15 @@ reachableFrom entrypoint graph = recursive mempty (S.singleton entrypoint) unreachableFrom :: Ord a => a -> Graph a -> Set a unreachableFrom entrypoint graph = nodes graph \\ reachableFrom entrypoint graph + +graphToDot :: Graph FilePath -> Dot () +graphToDot graph = do + nodes <- traverseWithKey + (\name edges -> D.node [("label",name)] <&> (,edges)) + graph + + forM_ nodes $ \(node, edges) -> + forM_ edges $ \key -> + case M.lookup key nodes of + Just (other,_) -> node .->. other + _ -> pure () -- cgit v1.2.3