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 | |
14 | sub new_empty { |
15 | my ($class) = @_; |
16 | $class->new( |
17 | propositions => [], |
18 | dependency_map => DX::DependencyMap->new_empty, |
19 | scope_depth => 0, |
20 | ); |
21 | } |
22 | |
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); |
28 | ref($self)->new( |
29 | dependency_map => $new_depmap, |
30 | propositions => [ @already, $prop ], |
31 | scope_depth => $self->scope_depth, |
32 | ); |
33 | } |
34 | |
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; |
3e465d5d |
39 | # 0 is valid, undef means the grep failed |
40 | die "Unable to find $prop in proplist" unless defined $id; |
efad53c4 |
41 | my $new_depmap = $self->dependency_map |
42 | ->with_entry_for($id, $deps); |
43 | ref($self)->new( |
44 | dependency_map => $new_depmap, |
45 | propositions => \@props, |
46 | scope_depth => $self->scope_depth, |
47 | ); |
48 | } |
49 | |
50 | sub but_expire_for { |
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; |
3e465d5d |
56 | my $props = $self->propositions; |
57 | return ( |
58 | $self->but(dependency_map => $depmap), |
59 | map $props->[$_], @expired_ids |
60 | ); |
efad53c4 |
61 | } |
62 | |
3e465d5d |
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; |
4016201b |
69 | return $self->dependency_map->dependencies_for($id)||[]; |
3e465d5d |
70 | } |
efad53c4 |
71 | |
72 | 1; |