pass rspace to backtrack (as yet unused), tweak DependencyMap API
[scpubgit/DX.git] / lib / DX / ResolvedPropositionSet.pm
1 package DX::ResolvedPropositionSet;
2
3 use DX::DependencyMap;
4 use DX::Utils qw(deparse);
5 use DX::Class;
6
7 has dependency_map => (is => 'ro', isa => DependencyMap, required => 1);
8
9 has propositions => (is => 'ro', isa => ArrayRef[Proposition], required => 1);
10
11 has scope_depth => (is => 'ro', isa => Int, required => 1);
12
13 sub resolved_count { scalar @{$_[0]->propositions} }
14
15 sub new_empty {
16   my ($class) = @_;
17   $class->new(
18     propositions => [],
19     dependency_map => DX::DependencyMap->new_empty,
20     scope_depth => 0,
21   );
22 }
23
24 sub with_resolution_for {
25   my ($self, $prop, $deps) = @_;
26   my $id = my @already = @{$self->propositions};
27   my $new_depmap = $self->dependency_map
28                         ->with_dependencies_for($id, $deps);
29   ref($self)->new(
30     dependency_map => $new_depmap,
31     propositions => [ @already, $prop ],
32     scope_depth => $self->scope_depth,
33   );
34 }
35
36 sub with_updated_dependencies_for {
37   my ($self, $prop, $deps) = @_;
38   my @props = @{$self->propositions};
39   my ($id) = grep $props[$_] eq $prop, 0..$#props;
40   # 0 is valid, undef means the grep failed
41   die "Unable to find $prop in proplist" unless defined $id;
42   my $new_depmap = $self->dependency_map
43                         ->with_dependencies_for($id, $deps);
44   ref($self)->new(
45     dependency_map => $new_depmap,
46     propositions => \@props,
47     scope_depth => $self->scope_depth,
48   );
49 }
50
51 sub 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;
57   my $props = $self->propositions;
58   return (
59     $self->but(dependency_map => $depmap),
60     map $props->[$_], @expired_ids
61   );
62 }
63
64 sub 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;
70   return $self->dependency_map->dependencies_for($id)||[];
71 }
72
73 1;