Commit | Line | Data |
efad53c4 |
1 | package DX::ResolvedPropositionSet; |
2 | |
3 | use DX::DependencyMap; |
3e465d5d |
4 | use Types::Standard qw(ArrayRef); |
4016201b |
5 | use DX::Utils qw(deparse); |
3e465d5d |
6 | use DX::Class; |
efad53c4 |
7 | |
3e465d5d |
8 | has dependency_map => (is => 'ro', isa => DependencyMap, required => 1); |
efad53c4 |
9 | |
3e465d5d |
10 | has propositions => (is => 'ro', isa => ArrayRef[Proposition], required => 1); |
efad53c4 |
11 | |
12 | has scope_depth => (is => 'ro', required => 1); |
13 | |
f25e6894 |
14 | sub resolved_count { scalar @{$_[0]->propositions} } |
15 | |
efad53c4 |
16 | sub new_empty { |
17 | my ($class) = @_; |
18 | $class->new( |
19 | propositions => [], |
20 | dependency_map => DX::DependencyMap->new_empty, |
21 | scope_depth => 0, |
22 | ); |
23 | } |
24 | |
25 | sub with_resolution_for { |
26 | my ($self, $prop, $deps) = @_; |
27 | my $id = my @already = @{$self->propositions}; |
28 | my $new_depmap = $self->dependency_map |
29 | ->with_entry_for($id, $deps); |
30 | ref($self)->new( |
31 | dependency_map => $new_depmap, |
32 | propositions => [ @already, $prop ], |
33 | scope_depth => $self->scope_depth, |
34 | ); |
35 | } |
36 | |
37 | sub with_updated_dependencies_for { |
38 | my ($self, $prop, $deps) = @_; |
39 | my @props = @{$self->propositions}; |
40 | my ($id) = grep $props[$_] eq $prop, 0..$#props; |
3e465d5d |
41 | # 0 is valid, undef means the grep failed |
42 | die "Unable to find $prop in proplist" unless defined $id; |
efad53c4 |
43 | my $new_depmap = $self->dependency_map |
44 | ->with_entry_for($id, $deps); |
45 | ref($self)->new( |
46 | dependency_map => $new_depmap, |
47 | propositions => \@props, |
48 | scope_depth => $self->scope_depth, |
49 | ); |
50 | } |
51 | |
52 | sub but_expire_for { |
53 | my ($self, @events) = @_; |
54 | my ($depmap, @expired_ids) = $self->dependency_map |
55 | ->but_expire_dependents_of(@events); |
56 | # Didn't expire anything? Don't clone self |
57 | return $self if $depmap eq $self->dependency_map; |
3e465d5d |
58 | my $props = $self->propositions; |
59 | return ( |
60 | $self->but(dependency_map => $depmap), |
61 | map $props->[$_], @expired_ids |
62 | ); |
efad53c4 |
63 | } |
64 | |
3e465d5d |
65 | sub dependencies_for { |
66 | my ($self, $prop) = @_; |
67 | my @props = @{$self->propositions}; |
68 | my ($id) = grep $props[$_] eq $prop, 0..$#props; |
69 | # 0 is valid, undef means the grep failed |
70 | die "Unable to find $prop in proplist" unless defined $id; |
4016201b |
71 | return $self->dependency_map->dependencies_for($id)||[]; |
3e465d5d |
72 | } |
efad53c4 |
73 | |
74 | 1; |