{-# LANGUAGE Safe #-}

module Data.Graph.Generators where

{-
    The information required to build a graph.

    This datastructure is designed to occupy minimal space.
    With n being the number of nodes, the edge list contains
    tuples (from, to), denoting an edge from node *from* to node
    *to* where *from* and *to* are integers less than the number
    of nodes.

    Note that for a graph with n nodes, the nodes are labelled
    @[0..n-1]@.

    This data structure is library-agnostic and can be converted
    to arbitrary representations.

    Copyright (C) 2014 Uli Köhler
    Apache License v2.0
-}
data GraphInfo = GraphInfo {
                  numNodes :: Int, -- ^ Number of nodes
                  edges :: [(Int,Int)] -- ^ Edge list
                 } deriving (Eq, Show)

{-
    The context of a single graph node.

    This data-structure is library-agnostic, however,
    it is isomophic to FGL's UContext
-}
data GraphContext = GraphContext {
                        inEdges :: [Int], -- ^ Nodes having an edge to the current node
                        nodeLabel :: Int, -- ^ The node identifier of the current node
                        outEdges :: [Int] -- ^ Nodes having an ingoing edge from the current node
                    }

{-
    Check the integrity of a GraphInfo instance:
    Ensures for every edge (i,j), the following condition is met:
    @0 <= i < n && 0 <= j < n@
-}
checkGraphInfo :: GraphInfo -> Bool
checkGraphInfo (GraphInfo n edges) =
    all (\(i, j) -> 0 <= i && i < n && 0 <= j && j < n) edges

-- | Get the edge count for a given GraphInfo instance
numEdges :: GraphInfo -> Int
numEdges = length . edges