{-# LANGUAGE MultiParamTypeClasses, OverloadedStrings #-}
module Data.GraphViz.Commands
(
GraphvizCommand(..)
, dirCommand
, undirCommand
, commandFor
, GraphvizOutput(..)
, GraphvizCanvas(..)
, runGraphviz
, runGraphvizCommand
, addExtension
, runGraphvizCanvas
, runGraphvizCanvas'
, graphvizWithHandle
, isGraphvizInstalled
, quitWithoutGraphviz
) where
import Data.GraphViz.Types
import Data.GraphViz.Commands.Available
import Data.GraphViz.Commands.IO (runCommand)
import Data.GraphViz.Exception
import Control.Monad (liftM, unless)
import qualified Data.ByteString as SB
import Data.Maybe (isJust)
import Data.Version (Version (..), showVersion)
import System.Directory (findExecutable)
import System.Exit (ExitCode (..), exitWith)
import System.FilePath ((<.>))
import System.IO (Handle, hPutStrLn, hSetBinaryMode, stderr)
showCmd :: GraphvizCommand -> String
showCmd :: GraphvizCommand -> String
showCmd Dot = "dot"
showCmd Neato = "neato"
showCmd TwoPi = "twopi"
showCmd Circo = "circo"
showCmd Fdp = "fdp"
showCmd Sfdp = "sfdp"
showCmd Osage = "osage"
showCmd Patchwork = "patchwork"
dirCommand :: GraphvizCommand
dirCommand :: GraphvizCommand
dirCommand = GraphvizCommand
Dot
undirCommand :: GraphvizCommand
undirCommand :: GraphvizCommand
undirCommand = GraphvizCommand
Neato
commandFor :: (DotRepr dg n) => dg n -> GraphvizCommand
commandFor :: dg n -> GraphvizCommand
commandFor dg :: dg n
dg = if dg n -> Bool
forall (dg :: * -> *) n. DotRepr dg n => dg n -> Bool
graphIsDirected dg n
dg
then GraphvizCommand
dirCommand
else GraphvizCommand
undirCommand
class GraphvizResult o where
outputCall :: o -> String
data GraphvizOutput = Bmp
| Canon
| DotOutput
| XDot (Maybe Version)
| Eps
| Fig
| Gd
| Gd2
| Gif
| Ico
| Imap
| Cmapx
| ImapNP
| CmapxNP
| Jpeg
| Pdf
| Plain
| PlainExt
| Png
| Ps
| Ps2
| Svg
| SvgZ
| Tiff
| Vml
| VmlZ
| Vrml
| WBmp
| WebP
deriving (GraphvizOutput -> GraphvizOutput -> Bool
(GraphvizOutput -> GraphvizOutput -> Bool)
-> (GraphvizOutput -> GraphvizOutput -> Bool) -> Eq GraphvizOutput
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GraphvizOutput -> GraphvizOutput -> Bool
$c/= :: GraphvizOutput -> GraphvizOutput -> Bool
== :: GraphvizOutput -> GraphvizOutput -> Bool
$c== :: GraphvizOutput -> GraphvizOutput -> Bool
Eq, Eq GraphvizOutput
Eq GraphvizOutput =>
(GraphvizOutput -> GraphvizOutput -> Ordering)
-> (GraphvizOutput -> GraphvizOutput -> Bool)
-> (GraphvizOutput -> GraphvizOutput -> Bool)
-> (GraphvizOutput -> GraphvizOutput -> Bool)
-> (GraphvizOutput -> GraphvizOutput -> Bool)
-> (GraphvizOutput -> GraphvizOutput -> GraphvizOutput)
-> (GraphvizOutput -> GraphvizOutput -> GraphvizOutput)
-> Ord GraphvizOutput
GraphvizOutput -> GraphvizOutput -> Bool
GraphvizOutput -> GraphvizOutput -> Ordering
GraphvizOutput -> GraphvizOutput -> GraphvizOutput
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: GraphvizOutput -> GraphvizOutput -> GraphvizOutput
$cmin :: GraphvizOutput -> GraphvizOutput -> GraphvizOutput
max :: GraphvizOutput -> GraphvizOutput -> GraphvizOutput
$cmax :: GraphvizOutput -> GraphvizOutput -> GraphvizOutput
>= :: GraphvizOutput -> GraphvizOutput -> Bool
$c>= :: GraphvizOutput -> GraphvizOutput -> Bool
> :: GraphvizOutput -> GraphvizOutput -> Bool
$c> :: GraphvizOutput -> GraphvizOutput -> Bool
<= :: GraphvizOutput -> GraphvizOutput -> Bool
$c<= :: GraphvizOutput -> GraphvizOutput -> Bool
< :: GraphvizOutput -> GraphvizOutput -> Bool
$c< :: GraphvizOutput -> GraphvizOutput -> Bool
compare :: GraphvizOutput -> GraphvizOutput -> Ordering
$ccompare :: GraphvizOutput -> GraphvizOutput -> Ordering
$cp1Ord :: Eq GraphvizOutput
Ord, Int -> GraphvizOutput -> ShowS
[GraphvizOutput] -> ShowS
GraphvizOutput -> String
(Int -> GraphvizOutput -> ShowS)
-> (GraphvizOutput -> String)
-> ([GraphvizOutput] -> ShowS)
-> Show GraphvizOutput
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GraphvizOutput] -> ShowS
$cshowList :: [GraphvizOutput] -> ShowS
show :: GraphvizOutput -> String
$cshow :: GraphvizOutput -> String
showsPrec :: Int -> GraphvizOutput -> ShowS
$cshowsPrec :: Int -> GraphvizOutput -> ShowS
Show, ReadPrec [GraphvizOutput]
ReadPrec GraphvizOutput
Int -> ReadS GraphvizOutput
ReadS [GraphvizOutput]
(Int -> ReadS GraphvizOutput)
-> ReadS [GraphvizOutput]
-> ReadPrec GraphvizOutput
-> ReadPrec [GraphvizOutput]
-> Read GraphvizOutput
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GraphvizOutput]
$creadListPrec :: ReadPrec [GraphvizOutput]
readPrec :: ReadPrec GraphvizOutput
$creadPrec :: ReadPrec GraphvizOutput
readList :: ReadS [GraphvizOutput]
$creadList :: ReadS [GraphvizOutput]
readsPrec :: Int -> ReadS GraphvizOutput
$creadsPrec :: Int -> ReadS GraphvizOutput
Read)
instance GraphvizResult GraphvizOutput where
outputCall :: GraphvizOutput -> String
outputCall Bmp = "bmp"
outputCall Canon = "canon"
outputCall DotOutput = "dot"
outputCall (XDot mv :: Maybe Version
mv) = "xdot" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> (Version -> String) -> Maybe Version -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "" Version -> String
showVersion Maybe Version
mv
outputCall Eps = "eps"
outputCall Fig = "fig"
outputCall Gd = "gd"
outputCall Gd2 = "gd2"
outputCall Gif = "gif"
outputCall Ico = "ico"
outputCall Imap = "imap"
outputCall Cmapx = "cmapx"
outputCall ImapNP = "imap_np"
outputCall CmapxNP = "cmapx_np"
outputCall Jpeg = "jpeg"
outputCall Pdf = "pdf"
outputCall Plain = "plain"
outputCall PlainExt = "plain-ext"
outputCall Png = "png"
outputCall Ps = "ps"
outputCall Ps2 = "ps2"
outputCall Svg = "svg"
outputCall SvgZ = "svgz"
outputCall Tiff = "tiff"
outputCall Vml = "vml"
outputCall VmlZ = "vmlz"
outputCall Vrml = "vrml"
outputCall WBmp = "wbmp"
outputCall WebP = "webp"
defaultExtension :: GraphvizOutput -> String
defaultExtension :: GraphvizOutput -> String
defaultExtension Bmp = "bmp"
defaultExtension Canon = "gv"
defaultExtension DotOutput = "gv"
defaultExtension XDot{} = "gv"
defaultExtension Eps = "eps"
defaultExtension Fig = "fig"
defaultExtension Gd = "gd"
defaultExtension Gd2 = "gd2"
defaultExtension Gif = "gif"
defaultExtension Ico = "ico"
defaultExtension Imap = "map"
defaultExtension Cmapx = "map"
defaultExtension ImapNP = "map"
defaultExtension CmapxNP = "map"
defaultExtension Jpeg = "jpg"
defaultExtension Pdf = "pdf"
defaultExtension Plain = "txt"
defaultExtension PlainExt = "txt"
defaultExtension Png = "png"
defaultExtension Ps = "ps"
defaultExtension Ps2 = "ps"
defaultExtension Svg = "svg"
defaultExtension SvgZ = "svgz"
defaultExtension Tiff = "tif"
defaultExtension Vml = "vml"
defaultExtension VmlZ = "vmlz"
defaultExtension Vrml = "vrml"
defaultExtension WBmp = "wbmp"
defaultExtension WebP = "webp"
data GraphvizCanvas = Gtk | Xlib
deriving (GraphvizCanvas -> GraphvizCanvas -> Bool
(GraphvizCanvas -> GraphvizCanvas -> Bool)
-> (GraphvizCanvas -> GraphvizCanvas -> Bool) -> Eq GraphvizCanvas
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GraphvizCanvas -> GraphvizCanvas -> Bool
$c/= :: GraphvizCanvas -> GraphvizCanvas -> Bool
== :: GraphvizCanvas -> GraphvizCanvas -> Bool
$c== :: GraphvizCanvas -> GraphvizCanvas -> Bool
Eq, Eq GraphvizCanvas
Eq GraphvizCanvas =>
(GraphvizCanvas -> GraphvizCanvas -> Ordering)
-> (GraphvizCanvas -> GraphvizCanvas -> Bool)
-> (GraphvizCanvas -> GraphvizCanvas -> Bool)
-> (GraphvizCanvas -> GraphvizCanvas -> Bool)
-> (GraphvizCanvas -> GraphvizCanvas -> Bool)
-> (GraphvizCanvas -> GraphvizCanvas -> GraphvizCanvas)
-> (GraphvizCanvas -> GraphvizCanvas -> GraphvizCanvas)
-> Ord GraphvizCanvas
GraphvizCanvas -> GraphvizCanvas -> Bool
GraphvizCanvas -> GraphvizCanvas -> Ordering
GraphvizCanvas -> GraphvizCanvas -> GraphvizCanvas
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: GraphvizCanvas -> GraphvizCanvas -> GraphvizCanvas
$cmin :: GraphvizCanvas -> GraphvizCanvas -> GraphvizCanvas
max :: GraphvizCanvas -> GraphvizCanvas -> GraphvizCanvas
$cmax :: GraphvizCanvas -> GraphvizCanvas -> GraphvizCanvas
>= :: GraphvizCanvas -> GraphvizCanvas -> Bool
$c>= :: GraphvizCanvas -> GraphvizCanvas -> Bool
> :: GraphvizCanvas -> GraphvizCanvas -> Bool
$c> :: GraphvizCanvas -> GraphvizCanvas -> Bool
<= :: GraphvizCanvas -> GraphvizCanvas -> Bool
$c<= :: GraphvizCanvas -> GraphvizCanvas -> Bool
< :: GraphvizCanvas -> GraphvizCanvas -> Bool
$c< :: GraphvizCanvas -> GraphvizCanvas -> Bool
compare :: GraphvizCanvas -> GraphvizCanvas -> Ordering
$ccompare :: GraphvizCanvas -> GraphvizCanvas -> Ordering
$cp1Ord :: Eq GraphvizCanvas
Ord, GraphvizCanvas
GraphvizCanvas -> GraphvizCanvas -> Bounded GraphvizCanvas
forall a. a -> a -> Bounded a
maxBound :: GraphvizCanvas
$cmaxBound :: GraphvizCanvas
minBound :: GraphvizCanvas
$cminBound :: GraphvizCanvas
Bounded, Int -> GraphvizCanvas
GraphvizCanvas -> Int
GraphvizCanvas -> [GraphvizCanvas]
GraphvizCanvas -> GraphvizCanvas
GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas]
GraphvizCanvas
-> GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas]
(GraphvizCanvas -> GraphvizCanvas)
-> (GraphvizCanvas -> GraphvizCanvas)
-> (Int -> GraphvizCanvas)
-> (GraphvizCanvas -> Int)
-> (GraphvizCanvas -> [GraphvizCanvas])
-> (GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas])
-> (GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas])
-> (GraphvizCanvas
-> GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas])
-> Enum GraphvizCanvas
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: GraphvizCanvas
-> GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas]
$cenumFromThenTo :: GraphvizCanvas
-> GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas]
enumFromTo :: GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas]
$cenumFromTo :: GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas]
enumFromThen :: GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas]
$cenumFromThen :: GraphvizCanvas -> GraphvizCanvas -> [GraphvizCanvas]
enumFrom :: GraphvizCanvas -> [GraphvizCanvas]
$cenumFrom :: GraphvizCanvas -> [GraphvizCanvas]
fromEnum :: GraphvizCanvas -> Int
$cfromEnum :: GraphvizCanvas -> Int
toEnum :: Int -> GraphvizCanvas
$ctoEnum :: Int -> GraphvizCanvas
pred :: GraphvizCanvas -> GraphvizCanvas
$cpred :: GraphvizCanvas -> GraphvizCanvas
succ :: GraphvizCanvas -> GraphvizCanvas
$csucc :: GraphvizCanvas -> GraphvizCanvas
Enum, ReadPrec [GraphvizCanvas]
ReadPrec GraphvizCanvas
Int -> ReadS GraphvizCanvas
ReadS [GraphvizCanvas]
(Int -> ReadS GraphvizCanvas)
-> ReadS [GraphvizCanvas]
-> ReadPrec GraphvizCanvas
-> ReadPrec [GraphvizCanvas]
-> Read GraphvizCanvas
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GraphvizCanvas]
$creadListPrec :: ReadPrec [GraphvizCanvas]
readPrec :: ReadPrec GraphvizCanvas
$creadPrec :: ReadPrec GraphvizCanvas
readList :: ReadS [GraphvizCanvas]
$creadList :: ReadS [GraphvizCanvas]
readsPrec :: Int -> ReadS GraphvizCanvas
$creadsPrec :: Int -> ReadS GraphvizCanvas
Read, Int -> GraphvizCanvas -> ShowS
[GraphvizCanvas] -> ShowS
GraphvizCanvas -> String
(Int -> GraphvizCanvas -> ShowS)
-> (GraphvizCanvas -> String)
-> ([GraphvizCanvas] -> ShowS)
-> Show GraphvizCanvas
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GraphvizCanvas] -> ShowS
$cshowList :: [GraphvizCanvas] -> ShowS
show :: GraphvizCanvas -> String
$cshow :: GraphvizCanvas -> String
showsPrec :: Int -> GraphvizCanvas -> ShowS
$cshowsPrec :: Int -> GraphvizCanvas -> ShowS
Show)
instance GraphvizResult GraphvizCanvas where
outputCall :: GraphvizCanvas -> String
outputCall Gtk = "gtk"
outputCall Xlib = "xlib"
runGraphviz :: (PrintDotRepr dg n) => dg n -> GraphvizOutput -> FilePath
-> IO FilePath
runGraphviz :: dg n -> GraphvizOutput -> String -> IO String
runGraphviz gr :: dg n
gr = GraphvizCommand -> dg n -> GraphvizOutput -> String -> IO String
forall (dg :: * -> *) n.
PrintDotRepr dg n =>
GraphvizCommand -> dg n -> GraphvizOutput -> String -> IO String
runGraphvizCommand (dg n -> GraphvizCommand
forall (dg :: * -> *) n. DotRepr dg n => dg n -> GraphvizCommand
commandFor dg n
gr) dg n
gr
runGraphvizCommand :: (PrintDotRepr dg n) => GraphvizCommand -> dg n
-> GraphvizOutput -> FilePath
-> IO FilePath
runGraphvizCommand :: GraphvizCommand -> dg n -> GraphvizOutput -> String -> IO String
runGraphvizCommand cmd :: GraphvizCommand
cmd gr :: dg n
gr t :: GraphvizOutput
t fp :: String
fp
= (GraphvizException -> GraphvizException) -> IO String -> IO String
forall e1 e2 a.
(Exception e1, Exception e2) =>
(e1 -> e2) -> a -> a
mapException GraphvizException -> GraphvizException
addExc (IO String -> IO String) -> IO String -> IO String
forall a b. (a -> b) -> a -> b
$ GraphvizCommand
-> dg n -> GraphvizOutput -> (Handle -> IO String) -> IO String
forall (dg :: * -> *) n a.
PrintDotRepr dg n =>
GraphvizCommand
-> dg n -> GraphvizOutput -> (Handle -> IO a) -> IO a
graphvizWithHandle GraphvizCommand
cmd dg n
gr GraphvizOutput
t Handle -> IO String
toFile
where
addFl :: ShowS
addFl = String -> ShowS
forall a. [a] -> [a] -> [a]
(++) ("Unable to create " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fp String -> ShowS
forall a. [a] -> [a] -> [a]
++ "\n")
toFile :: Handle -> IO String
toFile h :: Handle
h = Handle -> IO ByteString
SB.hGetContents Handle
h IO ByteString -> (ByteString -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> ByteString -> IO ()
SB.writeFile String
fp IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
fp
addExc :: GraphvizException -> GraphvizException
addExc (GVProgramExc e :: String
e) = String -> GraphvizException
GVProgramExc (String -> GraphvizException) -> String -> GraphvizException
forall a b. (a -> b) -> a -> b
$ ShowS
addFl String
e
addExc e :: GraphvizException
e = GraphvizException
e
addExtension :: (GraphvizOutput -> FilePath -> a)
-> GraphvizOutput -> FilePath -> a
addExtension :: (GraphvizOutput -> String -> a) -> GraphvizOutput -> String -> a
addExtension cmd :: GraphvizOutput -> String -> a
cmd t :: GraphvizOutput
t fp :: String
fp = GraphvizOutput -> String -> a
cmd GraphvizOutput
t String
fp'
where
fp' :: String
fp' = String
fp String -> ShowS
<.> GraphvizOutput -> String
defaultExtension GraphvizOutput
t
graphvizWithHandle :: (PrintDotRepr dg n)
=> GraphvizCommand
-> dg n
-> GraphvizOutput
-> (Handle -> IO a)
-> IO a
graphvizWithHandle :: GraphvizCommand
-> dg n -> GraphvizOutput -> (Handle -> IO a) -> IO a
graphvizWithHandle = GraphvizCommand
-> dg n -> GraphvizOutput -> (Handle -> IO a) -> IO a
forall (dg :: * -> *) n o a.
(PrintDotRepr dg n, GraphvizResult o) =>
GraphvizCommand -> dg n -> o -> (Handle -> IO a) -> IO a
graphvizWithHandle'
graphvizWithHandle' :: (PrintDotRepr dg n, GraphvizResult o)
=> GraphvizCommand -> dg n -> o
-> (Handle -> IO a) -> IO a
graphvizWithHandle' :: GraphvizCommand -> dg n -> o -> (Handle -> IO a) -> IO a
graphvizWithHandle' cmd :: GraphvizCommand
cmd dg :: dg n
dg t :: o
t f :: Handle -> IO a
f = String -> [String] -> (Handle -> IO a) -> dg n -> IO a
forall (dg :: * -> *) n a.
PrintDotRepr dg n =>
String -> [String] -> (Handle -> IO a) -> dg n -> IO a
runCommand (GraphvizCommand -> String
showCmd GraphvizCommand
cmd)
["-T" String -> ShowS
forall a. [a] -> [a] -> [a]
++ o -> String
forall o. GraphvizResult o => o -> String
outputCall o
t]
Handle -> IO a
f'
dg n
dg
where
f' :: Handle -> IO a
f' h :: Handle
h = Handle -> Bool -> IO ()
hSetBinaryMode Handle
h Bool
True IO () -> IO a -> IO a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Handle -> IO a
f Handle
h
runGraphvizCanvas :: (PrintDotRepr dg n) => GraphvizCommand -> dg n
-> GraphvizCanvas -> IO ()
runGraphvizCanvas :: GraphvizCommand -> dg n -> GraphvizCanvas -> IO ()
runGraphvizCanvas cmd :: GraphvizCommand
cmd gr :: dg n
gr c :: GraphvizCanvas
c = GraphvizCommand
-> dg n -> GraphvizCanvas -> (Handle -> IO ()) -> IO ()
forall (dg :: * -> *) n o a.
(PrintDotRepr dg n, GraphvizResult o) =>
GraphvizCommand -> dg n -> o -> (Handle -> IO a) -> IO a
graphvizWithHandle' GraphvizCommand
cmd dg n
gr GraphvizCanvas
c Handle -> IO ()
nullHandle
where
nullHandle :: Handle -> IO ()
nullHandle :: Handle -> IO ()
nullHandle = (ByteString -> ()) -> IO ByteString -> IO ()
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (() -> ByteString -> ()
forall a b. a -> b -> a
const ()) (IO ByteString -> IO ())
-> (Handle -> IO ByteString) -> Handle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> IO ByteString
SB.hGetContents
runGraphvizCanvas' :: (PrintDotRepr dg n) => dg n -> GraphvizCanvas -> IO ()
runGraphvizCanvas' :: dg n -> GraphvizCanvas -> IO ()
runGraphvizCanvas' d :: dg n
d = GraphvizCommand -> dg n -> GraphvizCanvas -> IO ()
forall (dg :: * -> *) n.
PrintDotRepr dg n =>
GraphvizCommand -> dg n -> GraphvizCanvas -> IO ()
runGraphvizCanvas (dg n -> GraphvizCommand
forall (dg :: * -> *) n. DotRepr dg n => dg n -> GraphvizCommand
commandFor dg n
d) dg n
d
isGraphvizInstalled :: IO Bool
isGraphvizInstalled :: IO Bool
isGraphvizInstalled = (Maybe String -> Bool) -> IO (Maybe String) -> IO Bool
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Maybe String -> Bool
forall a. Maybe a -> Bool
isJust (IO (Maybe String) -> IO Bool)
-> (String -> IO (Maybe String)) -> String -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO (Maybe String)
findExecutable (String -> IO Bool) -> String -> IO Bool
forall a b. (a -> b) -> a -> b
$ GraphvizCommand -> String
showCmd GraphvizCommand
Dot
quitWithoutGraphviz :: String -> IO ()
quitWithoutGraphviz :: String -> IO ()
quitWithoutGraphviz err :: String
err = do Bool
hasGraphviz <- IO Bool
isGraphvizInstalled
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
hasGraphviz
(IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Handle -> String -> IO ()
hPutStrLn Handle
stderr String
err IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExitCode -> IO ()
forall a. ExitCode -> IO a
exitWith (Int -> ExitCode
ExitFailure 1)