pass rspace to backtrack (as yet unused), tweak DependencyMap API
[scpubgit/DX.git] / lib / DX / ResolvedPropositionSet.pm
CommitLineData
efad53c4 1package DX::ResolvedPropositionSet;
2
3use DX::DependencyMap;
4016201b 4use DX::Utils qw(deparse);
3e465d5d 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
80d78e1b 11has scope_depth => (is => 'ro', isa => Int, required => 1);
efad53c4 12
f25e6894 13sub resolved_count { scalar @{$_[0]->propositions} }
14
efad53c4 15sub new_empty {
16 my ($class) = @_;
17 $class->new(
18 propositions => [],
19 dependency_map => DX::DependencyMap->new_empty,
20 scope_depth => 0,
21 );
22}
23
24sub with_resolution_for {
25 my ($self, $prop, $deps) = @_;
26 my $id = my @already = @{$self->propositions};
27 my $new_depmap = $self->dependency_map
77bc0c6e 28 ->with_dependencies_for($id, $deps);
efad53c4 29 ref($self)->new(
30 dependency_map => $new_depmap,
31 propositions => [ @already, $prop ],
32 scope_depth => $self->scope_depth,
33 );
34}
35
36sub with_updated_dependencies_for {
37 my ($self, $prop, $deps) = @_;
38 my @props = @{$self->propositions};
39 my ($id) = grep $props[$_] eq $prop, 0..$#props;
3e465d5d 40 # 0 is valid, undef means the grep failed
41 die "Unable to find $prop in proplist" unless defined $id;
efad53c4 42 my $new_depmap = $self->dependency_map
77bc0c6e 43 ->with_dependencies_for($id, $deps);
efad53c4 44 ref($self)->new(
45 dependency_map => $new_depmap,
46 propositions => \@props,
47 scope_depth => $self->scope_depth,
48 );
49}
50
51sub but_expire_for {
52 my ($self, @events) = @_;
53 my ($depmap, @expired_ids) = $self->dependency_map
54 ->but_expire_dependents_of(@events);
55 # Didn't expire anything? Don't clone self
56 return $self if $depmap eq $self->dependency_map;
3e465d5d 57 my $props = $self->propositions;
58 return (
59 $self->but(dependency_map => $depmap),
60 map $props->[$_], @expired_ids
61 );
efad53c4 62}
63
3e465d5d 64sub dependencies_for {
65 my ($self, $prop) = @_;
66 my @props = @{$self->propositions};
67 my ($id) = grep $props[$_] eq $prop, 0..$#props;
68 # 0 is valid, undef means the grep failed
69 die "Unable to find $prop in proplist" unless defined $id;
4016201b 70 return $self->dependency_map->dependencies_for($id)||[];
3e465d5d 71}
efad53c4 72
731;