#!/usr/bin/env perl

die "Usage: $0 outfile\n" if !@ARGV;

use strict;
use warnings;
use PDL::PP qw(math.pd Math PDL::Math);
PDL::PP::pp_def('dummy', Code=>'', Pars=>'a()'); # lazy-loads stuff
use Graph;
use GraphViz2;
use Scalar::Util qw(refaddr);

my $g = Graph->new; # should really be hypergraph but GraphViz2 not do yet
$PDL::PP::deftbl = $PDL::PP::deftbl; # suppress warning
for my $r (@{$PDL::PP::deftbl}) {
  my $r_addr = refaddr $r;
  my $r_label = ref($r) =~ s/^PDL::PP:://r;
  $g->set_vertex_attribute($r_addr, graphviz => { shape => 'box', label => $r_label });
  $g->add_edge($_, $r_addr) for @{$r->{targets}};
  for my $c (@{$r->{conditions}||[]}) {
    my $maybe = $c =~ s/\?//g;
    $g->add_edge($r_addr, $c);
    $g->set_edge_attribute($r_addr, $c,
      graphviz => { style => 'dashed' },
    ) if $maybe;
  }
}
my ($fmt) = $ARGV[0] =~ /\.([^.]+)$/;
$g->set_graph_attribute(graphviz=>{graph=>{rankdir=>'LR'}});
GraphViz2->from_graph($g)->run(format=>$fmt,output_file=>$ARGV[0]);

=head1 NAME

doc-pp - Generate graph of pp_def key dependencies with graphviz

=head1 SYNOPSIS

  doc-pp deps.svg

=head1 DESCRIPTION

Uses L<Graph> and L<GraphViz2> to visualise the dependencies between
keys in L<PDL::PP/pp_def>.
