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 )