{-# LANGUAGE Rank2Types #-}
-- | Defines a Monad context for calling graphviz.

module Capabilities.Graphviz (
  MonadGraphviz (errorWithoutGraphviz, layoutGraph, layoutGraph'),
  ) where

import Control.Monad.Trans.Class        (MonadTrans (lift))
import Control.OutputCapable.Blocks.Generic (
  GenericReportT
  )
import Data.GraphViz (
  AttributeEdge,
  AttributeNode,
  GraphvizCommand,
  GraphvizParams,
  )
import Data.Graph.Inductive.Graph       (Graph, Node)

class Monad m => MonadGraphviz m where
  errorWithoutGraphviz :: m ()
  layoutGraph
    :: forall gr v e . Graph gr
    => GraphvizCommand
    -> gr v e
    -> m (gr (AttributeNode v) (AttributeEdge e))
  layoutGraph'
    :: (Ord cl, Graph gr)
    => GraphvizParams Node v e cl l
    -> GraphvizCommand
    -> gr v e
    -> m (gr (AttributeNode v) (AttributeEdge e))

instance MonadGraphviz m => MonadGraphviz (GenericReportT l o m)  where
  errorWithoutGraphviz :: GenericReportT l o m ()
errorWithoutGraphviz = m () -> GenericReportT l o m ()
forall (m :: * -> *) a. Monad m => m a -> GenericReportT l o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m ()
forall (m :: * -> *). MonadGraphviz m => m ()
errorWithoutGraphviz
  layoutGraph :: forall (gr :: * -> * -> *) v e.
Graph gr =>
GraphvizCommand
-> gr v e
-> GenericReportT l o m (gr (AttributeNode v) (AttributeEdge e))
layoutGraph GraphvizCommand
command = m (gr (AttributeNode v) (AttributeEdge e))
-> GenericReportT l o m (gr (AttributeNode v) (AttributeEdge e))
forall (m :: * -> *) a. Monad m => m a -> GenericReportT l o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (gr (AttributeNode v) (AttributeEdge e))
 -> GenericReportT l o m (gr (AttributeNode v) (AttributeEdge e)))
-> (gr v e -> m (gr (AttributeNode v) (AttributeEdge e)))
-> gr v e
-> GenericReportT l o m (gr (AttributeNode v) (AttributeEdge e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GraphvizCommand
-> gr v e -> m (gr (AttributeNode v) (AttributeEdge e))
forall (m :: * -> *) (gr :: * -> * -> *) v e.
(MonadGraphviz m, Graph gr) =>
GraphvizCommand
-> gr v e -> m (gr (AttributeNode v) (AttributeEdge e))
forall (gr :: * -> * -> *) v e.
Graph gr =>
GraphvizCommand
-> gr v e -> m (gr (AttributeNode v) (AttributeEdge e))
layoutGraph GraphvizCommand
command
  layoutGraph' :: forall cl (gr :: * -> * -> *) v e l.
(Ord cl, Graph gr) =>
GraphvizParams Node v e cl l
-> GraphvizCommand
-> gr v e
-> GenericReportT l o m (gr (AttributeNode v) (AttributeEdge e))
layoutGraph' GraphvizParams Node v e cl l
params GraphvizCommand
command = m (gr (AttributeNode v) (AttributeEdge e))
-> GenericReportT l o m (gr (AttributeNode v) (AttributeEdge e))
forall (m :: * -> *) a. Monad m => m a -> GenericReportT l o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (gr (AttributeNode v) (AttributeEdge e))
 -> GenericReportT l o m (gr (AttributeNode v) (AttributeEdge e)))
-> (gr v e -> m (gr (AttributeNode v) (AttributeEdge e)))
-> gr v e
-> GenericReportT l o m (gr (AttributeNode v) (AttributeEdge e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GraphvizParams Node v e cl l
-> GraphvizCommand
-> gr v e
-> m (gr (AttributeNode v) (AttributeEdge e))
forall cl (gr :: * -> * -> *) v e l.
(Ord cl, Graph gr) =>
GraphvizParams Node v e cl l
-> GraphvizCommand
-> gr v e
-> m (gr (AttributeNode v) (AttributeEdge e))
forall (m :: * -> *) cl (gr :: * -> * -> *) v e l.
(MonadGraphviz m, Ord cl, Graph gr) =>
GraphvizParams Node v e cl l
-> GraphvizCommand
-> gr v e
-> m (gr (AttributeNode v) (AttributeEdge e))
layoutGraph' GraphvizParams Node v e cl l
params GraphvizCommand
command