slightly less incomplete deparse output
[scpubgit/DX.git] / lib / DX / ResolvedPropositionSet.pm
CommitLineData
efad53c4 1package DX::ResolvedPropositionSet;
2
3use DX::DependencyMap;
3e465d5d 4use Types::Standard qw(ArrayRef);
5use DX::Class;
efad53c4 6
3e465d5d 7has dependency_map => (is => 'ro', isa => DependencyMap, required => 1);
efad53c4 8
3e465d5d 9has propositions => (is => 'ro', isa => ArrayRef[Proposition], required => 1);
efad53c4 10
11has scope_depth => (is => 'ro', required => 1);
12
13sub new_empty {
14 my ($class) = @_;
15 $class->new(
16 propositions => [],
17 dependency_map => DX::DependencyMap->new_empty,
18 scope_depth => 0,
19 );
20}
21
22sub 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
34sub 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
49sub 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 62sub 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
711;