{-# LANGUAGE CPP #-}

module Data.Graph.Dom.Internal where

import Data.Graph.Dom as D

#if MIN_VERSION_containers(0, 5, 0)
import Data.IntMap.Strict as IM
#else
import Data.IntMap as IM
#endif

import Data.Foldable as F
import Data.List
import Data.IntSet as IS

newline :: [Char]
newline :: [Char]
newline = [Char]
"\n"

-- | For debugging only

asDotFile :: D.Graph -> String
asDotFile :: Graph -> [Char]
asDotFile Graph
g =
    let pprNode :: (Int, IntSet) -> String
        pprNode :: (Int, IntSet) -> [Char]
pprNode (Int
node,IntSet
targets) =
            [[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
F.concat ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
intersperse [Char]
newline ([[Char]] -> [[Char]]) -> [[Char]] -> [[Char]]
forall a b. (a -> b) -> a -> b
$ (Int -> [Char]) -> [Int] -> [[Char]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Int -> [Char]
forall a a. (Show a, Show a) => a -> a -> [Char]
pprEdge Int
node) ([Int] -> [[Char]]) -> [Int] -> [[Char]]
forall a b. (a -> b) -> a -> b
$ IntSet -> [Int]
IS.toList IntSet
targets
        pprEdge :: a -> a -> [Char]
pprEdge a
v a
u = a -> [Char]
forall a. Show a => a -> [Char]
show a
v [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" -> " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ a -> [Char]
forall a. Show a => a -> [Char]
show a
u [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
";"
    in [Char]
"digraph G {" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newline [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
            ([[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
F.concat ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
intersperse [Char]
newline ([[Char]] -> [[Char]]) -> [[Char]] -> [[Char]]
forall a b. (a -> b) -> a -> b
$ ((Int, IntSet) -> [Char]) -> [(Int, IntSet)] -> [[Char]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int, IntSet) -> [Char]
pprNode (Graph -> [(Int, IntSet)]
forall a. IntMap a -> [(Int, a)]
IM.toList Graph
g)) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newline [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
            [Char]
"}"