Commit | Line | Data |
efad53c4 |
1 | package DX::ResolvedPropositionSet; |
2 | |
3 | use DX::DependencyMap; |
4016201b |
4 | use DX::Utils qw(deparse); |
3e465d5d |
5 | use DX::Class; |
efad53c4 |
6 | |
3e465d5d |
7 | has dependency_map => (is => 'ro', isa => DependencyMap, required => 1); |
efad53c4 |
8 | |
3e465d5d |
9 | has propositions => (is => 'ro', isa => ArrayRef[Proposition], required => 1); |
efad53c4 |
10 | |
80d78e1b |
11 | has scope_depth => (is => 'ro', isa => Int, required => 1); |
efad53c4 |
12 | |
f25e6894 |
13 | sub resolved_count { scalar @{$_[0]->propositions} } |
14 | |
efad53c4 |
15 | sub new_empty { |
16 | my ($class) = @_; |
17 | $class->new( |
18 | propositions => [], |
19 | dependency_map => DX::DependencyMap->new_empty, |
20 | scope_depth => 0, |
21 | ); |
22 | } |
23 | |
24 | sub with_resolution_for { |
25 | my ($self, $prop, $deps) = @_; |
26 | my $id = my @already = @{$self->propositions}; |
27 | my $new_depmap = $self->dependency_map |
77bc0c6e |
28 | ->with_dependencies_for($id, $deps); |
efad53c4 |
29 | ref($self)->new( |
30 | dependency_map => $new_depmap, |
31 | propositions => [ @already, $prop ], |
32 | scope_depth => $self->scope_depth, |
33 | ); |
34 | } |
35 | |
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; |
3e465d5d |
40 | # 0 is valid, undef means the grep failed |
41 | die "Unable to find $prop in proplist" unless defined $id; |
efad53c4 |
42 | my $new_depmap = $self->dependency_map |
77bc0c6e |
43 | ->with_dependencies_for($id, $deps); |
efad53c4 |
44 | ref($self)->new( |
45 | dependency_map => $new_depmap, |
46 | propositions => \@props, |
47 | scope_depth => $self->scope_depth, |
48 | ); |
49 | } |
50 | |
51 | sub but_expire_for { |
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; |
3e465d5d |
57 | my $props = $self->propositions; |
58 | return ( |
59 | $self->but(dependency_map => $depmap), |
60 | map $props->[$_], @expired_ids |
61 | ); |
efad53c4 |
62 | } |
63 | |
3e465d5d |
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; |
4016201b |
70 | return $self->dependency_map->dependencies_for($id)||[]; |
3e465d5d |
71 | } |
efad53c4 |
72 | |
73 | 1; |