1 package DX::ResolvedPropositionSet;
4 use Types::Standard qw(ArrayRef);
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', required => 1);
17 dependency_map => DX::DependencyMap->new_empty,
22 sub with_resolution_for {
23 my ($self, $prop, $deps) = @_;
24 my $id = my @already = @{$self->propositions};
25 my $new_depmap = $self->dependency_map
26 ->with_entry_for($id, $deps);
28 dependency_map => $new_depmap,
29 propositions => [ @already, $prop ],
30 scope_depth => $self->scope_depth,
34 sub with_updated_dependencies_for {
35 my ($self, $prop, $deps) = @_;
36 my @props = @{$self->propositions};
37 my ($id) = grep $props[$_] eq $prop, 0..$#props;
38 # 0 is valid, undef means the grep failed
39 die "Unable to find $prop in proplist" unless defined $id;
40 my $new_depmap = $self->dependency_map
41 ->with_entry_for($id, $deps);
43 dependency_map => $new_depmap,
44 propositions => \@props,
45 scope_depth => $self->scope_depth,
50 my ($self, @events) = @_;
51 my ($depmap, @expired_ids) = $self->dependency_map
52 ->but_expire_dependents_of(@events);
53 # Didn't expire anything? Don't clone self
54 return $self if $depmap eq $self->dependency_map;
55 my $props = $self->propositions;
57 $self->but(dependency_map => $depmap),
58 map $props->[$_], @expired_ids
62 sub dependencies_for {
63 my ($self, $prop) = @_;
64 my @props = @{$self->propositions};
65 my ($id) = grep $props[$_] eq $prop, 0..$#props;
66 # 0 is valid, undef means the grep failed
67 die "Unable to find $prop in proplist" unless defined $id;
68 return $self->dependency_map->dependencies_for($id);