has deps => (is => 'ro', isa => DependencyTree, required => 1);
-has revdeps => (is => 'ro', required => 1);
+has revdeps => (is => 'ro', required => 1, isa => HashRef[DependencyList]);
sub new_empty {
my ($class) = @_;
$class->new(deps => {}, revdeps => {});
}
-sub with_entry_for {
+sub with_dependencies_for {
my ($self, $for_id, $deps_for) = @_;
- my @expanded = $self->_expand_deps($deps_for);
+ my $old_revdeps = $self->revdeps;
my $new_revdeps = {
- %{$self->revdeps},
- $for_id => \@expanded,
+ %{$old_revdeps},
+ $for_id => [ @{$old_revdeps->{$for_id}||[]}, @$deps_for ],
};
my $new_deps = $self->_merge_deps_for(
- $self->deps, $for_id, map @{$_}[1..$#$_], @expanded
+ $self->deps, $for_id, @$deps_for
);
ref($self)->new(
deps => $new_deps,
my %new_revdeps = %{$self->revdeps};
my $new_deps = $self->deps;
$new_deps = $self->_unmerge_deps_for(
- $new_deps, $_, map @{$_}[1..$#$_], @{$new_revdeps{$_}}
+ $new_deps, $_, @{$new_revdeps{$_}}
) for @for_ids;
delete @new_revdeps{@for_ids};
ref($self)->new(
return $root->[0];
}
-sub _expand_deps {
- my ($self, $dep_groups) = @_;
- my @exp;
- assert_DependencyGroupList $dep_groups;
- map {
- my ($on, @deps) = @$_;
- my @exp;
- DEP: foreach my $dep (@deps) {
- my ($type, @path) = @$dep;
- push @exp, [
- $type,
- map { ref() ? @{$_->identity_path or next DEP} : $_ } @path
- ];
- }
- (@exp ? [ $on, @exp ] : ());
- } @$dep_groups;
-}
-
-sub _dependents_of {
+sub dependents_of {
my ($self, $event) = @_;
my ($type, @path) = @$event;
my $root = [ $self->deps ];
sub but_expire_dependents_of {
my ($self, @events) = @_;
my @expired = keys %{{
- map +($_ => 1), map $self->_dependents_of($_), @events
+ map +($_ => 1), map $self->dependents_of($_), @events
}};
# Didn't expire anything? Don't clone self
return $self unless @expired;