1 package DX::ResolvedPropositionSet;
4 use Types::Standard qw(ArrayRef);
5 use DX::Utils qw(deparse);
8 has dependency_map => (is => 'ro', isa => DependencyMap, required => 1);
10 has propositions => (is => 'ro', isa => ArrayRef[Proposition], required => 1);
12 has scope_depth => (is => 'ro', required => 1);
18 dependency_map => DX::DependencyMap->new_empty,
23 sub with_resolution_for {
24 my ($self, $prop, $deps) = @_;
25 my $id = my @already = @{$self->propositions};
26 my $new_depmap = $self->dependency_map
27 ->with_entry_for($id, $deps);
29 dependency_map => $new_depmap,
30 propositions => [ @already, $prop ],
31 scope_depth => $self->scope_depth,
35 sub with_updated_dependencies_for {
36 my ($self, $prop, $deps) = @_;
37 my @props = @{$self->propositions};
38 my ($id) = grep $props[$_] eq $prop, 0..$#props;
39 # 0 is valid, undef means the grep failed
40 die "Unable to find $prop in proplist" unless defined $id;
41 my $new_depmap = $self->dependency_map
42 ->with_entry_for($id, $deps);
44 dependency_map => $new_depmap,
45 propositions => \@props,
46 scope_depth => $self->scope_depth,
51 my ($self, @events) = @_;
52 my ($depmap, @expired_ids) = $self->dependency_map
53 ->but_expire_dependents_of(@events);
54 # Didn't expire anything? Don't clone self
55 return $self if $depmap eq $self->dependency_map;
56 my $props = $self->propositions;
58 $self->but(dependency_map => $depmap),
59 map $props->[$_], @expired_ids
63 sub dependencies_for {
64 my ($self, $prop) = @_;
65 my @props = @{$self->propositions};
66 my ($id) = grep $props[$_] eq $prop, 0..$#props;
67 # 0 is valid, undef means the grep failed
68 die "Unable to find $prop in proplist" unless defined $id;
69 return $self->dependency_map->dependencies_for($id)||[];