first cut of rspace/rstrat code with eq semi cut over
[scpubgit/DX.git] / lib / DX / Predicate / Eq.pm
CommitLineData
2e93f662 1package DX::Predicate::Eq;
9d759b64 2
7f385fb2 3use DX::Utils qw(step rspace res CONTENTS_OF);
9d759b64 4use DX::Class;
5
6with 'DX::Role::Predicate';
7
8sub _possible_resolution_list {
7f385fb2 9 my ($self, @args) = @_;
10 my $rspace = $self->_resolution_space_for(@args);
11 return () unless my @members = @{$rspace->members};
12 return map step(
13 actions => $_->actions,
14 depends_on => $_->veracity_depends_on
15 ), @members;
16}
17
18sub _resolution_space_for {
255e1884 19 my ($self, $left, $right) = @_;
7f385fb2 20
21 my $deps = [ [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ] ];
22
255e1884 23 if ($left->equals($right)) {
7f385fb2 24 return rspace(
25 geometry_depends_on => $deps,
26 members => [
27 res(
28 actions => [],
29 veracity_depends_on => $deps,
30 )
31 ]
255e1884 32 );
33 }
7f385fb2 34
35 my @members = map {
36 my ($set_this, $to_this) = @$_;
37 res(
38 actions => [ $set_this->action_for_set_value($to_this) ],
39 veracity_depends_on => $deps,
40 );
41 } grep {
42 $_->[0]->can_set_value
43 } (
44 [ $left, $right ],
45 [ $right, $left ],
46 );
47
48 return rspace(
49 geometry_depends_on => $deps,
50 members => \@members,
255e1884 51 );
9d759b64 52}
53
541;