module Graph (Graph(..), IncidenceGraph(..), BidirectionalGraph(..), AdjacencyGraph(..), VertexListGraph(..), EdgeListGraph(..)) where class Graph g e v | g -> e, g -> v where src :: e -> g -> v tgt :: e -> g -> v class Graph g e v => IncidenceGraph g e v where out_edges :: v -> g -> [e] out_degree :: v -> g -> Int class (IncidenceGraph g e v) => BidirectionalGraph g e v where in_edges :: v -> g -> [e] in_degree :: v -> g -> Int degree :: v -> g -> Int class AdjacencyGraph g v | g -> v where adjacent_vertices :: v -> g -> [v] class VertexListGraph g v | g -> v where vertices :: g -> [v] num_vertices :: g -> Int class Graph g e v => EdgeListGraph g e v where edges :: g -> [e] num_edges :: g -> Int