Resource-Silo
view release on metacpan or search on metacpan
lib/Resource/Silo/Metadata.pm view on Meta::CPAN
{
no strict 'refs'; ## no critic Strictures
*{"${target}::$name"} =
Resource::Silo::Container::_silo_make_accessor($name, \%spec);
}
if (@forward_deps) {
$self->{pending_deps}->add_edges([$name], \@forward_deps);
} else {
# resource is independent, notify dependents if any
$self->{pending_deps}->drop_sink_cascade($name);
};
$self->{resource}{$name} = \%spec;
push @{ $self->{preload} }, $name if $spec{preload};
return $self;
};
sub _make_init_class {
my ($self, $name, $spec) = @_;
lib/Resource/Silo/Metadata/DAG.pm view on Meta::CPAN
foreach my $consumer (@$from) {
foreach my $producer (@$to) {
next if $consumer eq $producer; # self-dependency is ignored
$self->edges_out->{$consumer}->{$producer} = 1;
$self->edges_in->{$producer}->{$consumer} = 1;
}
}
return;
}
=head2 drop_sink_cascade($name)
If $name is a sink, remove it along with any vertex which becomes
a sink as a result of the operation, propagating along the edges.
Otherwise do nothing.
=cut
sub drop_sink_cascade {
my ($self, $arriving) = @_;
my @queue = ($arriving);
while (@queue) {
my $producer = shift @queue;
next if $self->edges_out->{$producer}; # producer is not independent => skip
my $node = delete $self->edges_in->{$producer};
next unless $node; # no one is waiting => skip
foreach my $consumer (keys %$node) {
t/101-util-dag.t view on Meta::CPAN
subtest "no loop (e->b)" => sub {
my $loop = $graph->find_loop('e', [ 'b' ], {}) || [];
is_deeply [ sort @$loop ], [], "no loop found (e depends on b)";
};
subtest "no loop (e->f)" => sub {
my $loop = $graph->find_loop('e', [ 'f', 'g' ], {}) || [];
is_deeply [ sort @$loop ], [], "no loop found (e depends on f)";
};
$graph->drop_sink_cascade('e');
is_deeply [ sort $graph->list ], [ qw( a b c ) ], "e now provided, d is also completed";
ok !$graph->self_check, "graph is consistent"
or diag $graph->self_check;
};
done_testing;
( run in 0.974 second using v1.01-cache-2.11-cpan-13bb782fe5a )