Commit | Line | Data |
efad53c4 |
1 | package DX::ResolvedPropositionSet; |
2 | |
3 | use DX::DependencyMap; |
3e465d5d |
4 | use Types::Standard qw(ArrayRef); |
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 | |
11 | has scope_depth => (is => 'ro', required => 1); |
12 | |
13 | sub new_empty { |
14 | my ($class) = @_; |
15 | $class->new( |
16 | propositions => [], |
17 | dependency_map => DX::DependencyMap->new_empty, |
18 | scope_depth => 0, |
19 | ); |
20 | } |
21 | |
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); |
27 | ref($self)->new( |
28 | dependency_map => $new_depmap, |
29 | propositions => [ @already, $prop ], |
30 | scope_depth => $self->scope_depth, |
31 | ); |
32 | } |
33 | |
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; |
3e465d5d |
38 | # 0 is valid, undef means the grep failed |
39 | die "Unable to find $prop in proplist" unless defined $id; |
efad53c4 |
40 | my $new_depmap = $self->dependency_map |
41 | ->with_entry_for($id, $deps); |
42 | ref($self)->new( |
43 | dependency_map => $new_depmap, |
44 | propositions => \@props, |
45 | scope_depth => $self->scope_depth, |
46 | ); |
47 | } |
48 | |
49 | sub but_expire_for { |
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; |
3e465d5d |
55 | my $props = $self->propositions; |
56 | return ( |
57 | $self->but(dependency_map => $depmap), |
58 | map $props->[$_], @expired_ids |
59 | ); |
efad53c4 |
60 | } |
61 | |
3e465d5d |
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); |
69 | } |
efad53c4 |
70 | |
71 | 1; |