SYNOPSIS

     use Data::Graph::Util qw(toposort is_cyclic is_acyclic);
    
     my @sorted = toposort(
         { a=>["b"], b=>["c", "d"], d=>["c"] },
     ); # => ("a", "b", "d", "c")
    
     # sort specified nodes (nodes not mentioned in the graph will be put at the
     # end), duplicates not removed
     my @sorted = toposort(
         { a=>["b"], b=>["c", "d"], d=>["c"] },
         ["e", "a", "b", "a"]
     ); # => ("a", "a", "b", "e")
    
     say is_cyclic ({a=>["b"]}); # => 0
     say is_acyclic({a=>["b"]}); # => 1
    
     say is_cyclic ({a=>["b"], b=>["c"], c=>["a"]}); # => 1
     say is_acyclic({a=>["b"], b=>["c"], c=>["a"]}); # => 0

DESCRIPTION

    Early release. More functions will be added later.

FUNCTIONS

    None are exported by default, but they are exportable.

 toposort(\%graph[ , \@nodes ]) => sorted list

    Perform a topological sort on graph (currently using the Kahn
    algorithm). Will return the nodes of the graph sorted topologically.

    If \@nodes is specified, will instead return @nodes sorted according to
    the topological order. Duplicates are allowed and not removed. Nodes
    not mentioned in graph are also allowed and will be put at the end.

 is_cyclic(\%graph) => bool

    Return true if graph contains at least one cycle. Currently implemented
    by attempting a topological sort on the graph. If it can't be
    performed, this means the graph contains cycle(s).

 is_acyclic(\%graph) => bool

    Return true if graph is acyclic, i.e. contains no cycles. The opposite
    of is_cyclic().

SEE ALSO

    https://en.wikipedia.org/wiki/Graph_(abstract_data_type)

    https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm

    Sort::Topological can also sort a DAG, but cannot handle cyclical
    graph.

