ff37b41d8e2a87b133db451fccebe9f228e049ea
[scpubgit/DX.git] / lib / DX / ResolvedPropositionSet.pm
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;