1 package DX::ResolvedPropositionSet;
4 use DX::Utils qw(deparse);
7 has dependency_map => (is => 'ro', isa => DependencyMap, required => 1);
9 has propositions => (is => 'ro', isa => ArrayRef[Proposition], required => 1);
11 has scope_depth => (is => 'ro', isa => Int, required => 1);
13 sub resolved_count { scalar @{$_[0]->propositions} }
19 dependency_map => DX::DependencyMap->new_empty,
24 sub with_resolution_for {
25 my ($self, $prop, $deps) = @_;
26 my $id = my @already = @{$self->propositions};
27 my $new_depmap = $self->dependency_map
28 ->with_dependencies_for($id, $deps);
30 dependency_map => $new_depmap,
31 propositions => [ @already, $prop ],
32 scope_depth => $self->scope_depth,
36 sub with_updated_dependencies_for {
37 my ($self, $prop, $deps) = @_;
38 my @props = @{$self->propositions};
39 my ($id) = grep $props[$_] eq $prop, 0..$#props;
40 # 0 is valid, undef means the grep failed
41 die "Unable to find $prop in proplist" unless defined $id;
42 my $new_depmap = $self->dependency_map
43 ->with_dependencies_for($id, $deps);
45 dependency_map => $new_depmap,
46 propositions => \@props,
47 scope_depth => $self->scope_depth,
52 my ($self, @events) = @_;
53 my ($depmap, @expired_ids) = $self->dependency_map
54 ->but_expire_dependents_of(@events);
55 # Didn't expire anything? Don't clone self
56 return $self if $depmap eq $self->dependency_map;
57 my $props = $self->propositions;
59 $self->but(dependency_map => $depmap),
60 map $props->[$_], @expired_ids
64 sub dependencies_for {
65 my ($self, $prop) = @_;
66 my @props = @{$self->propositions};
67 my ($id) = grep $props[$_] eq $prop, 0..$#props;
68 # 0 is valid, undef means the grep failed
69 die "Unable to find $prop in proplist" unless defined $id;
70 return $self->dependency_map->dependencies_for($id)||[];