Commit | Line | Data |
efad53c4 |
1 | package DX::ResolvedPropositionSet; |
2 | |
3 | use DX::DependencyMap; |
4 | use Moo; |
5 | |
6 | has dependency_map => (is => 'ro', required => 1); |
7 | |
8 | has propositions => (is => 'ro', required => 1); |
9 | |
10 | has scope_depth => (is => 'ro', required => 1); |
11 | |
12 | sub new_empty { |
13 | my ($class) = @_; |
14 | $class->new( |
15 | propositions => [], |
16 | dependency_map => DX::DependencyMap->new_empty, |
17 | scope_depth => 0, |
18 | ); |
19 | } |
20 | |
21 | sub with_resolution_for { |
22 | my ($self, $prop, $deps) = @_; |
23 | my $id = my @already = @{$self->propositions}; |
24 | my $new_depmap = $self->dependency_map |
25 | ->with_entry_for($id, $deps); |
26 | ref($self)->new( |
27 | dependency_map => $new_depmap, |
28 | propositions => [ @already, $prop ], |
29 | scope_depth => $self->scope_depth, |
30 | ); |
31 | } |
32 | |
33 | sub with_updated_dependencies_for { |
34 | my ($self, $prop, $deps) = @_; |
35 | my @props = @{$self->propositions}; |
36 | my ($id) = grep $props[$_] eq $prop, 0..$#props; |
37 | die "WHUT" unless $id; |
38 | my $new_depmap = $self->dependency_map |
39 | ->with_entry_for($id, $deps); |
40 | ref($self)->new( |
41 | dependency_map => $new_depmap, |
42 | propositions => \@props, |
43 | scope_depth => $self->scope_depth, |
44 | ); |
45 | } |
46 | |
47 | sub but_expire_for { |
48 | my ($self, @events) = @_; |
49 | my ($depmap, @expired_ids) = $self->dependency_map |
50 | ->but_expire_dependents_of(@events); |
51 | # Didn't expire anything? Don't clone self |
52 | return $self if $depmap eq $self->dependency_map; |
53 | die 'WHUT'; |
54 | } |
55 | |
56 | |
57 | 1; |