4f2747501c325a5c9a2a4e13d95c9c01c06fddc6
[scpubgit/DX.git] / lib / DX / Predicate / Eq.pm
1 package DX::Predicate::Eq;
2
3 use DX::Utils qw(step rspace res CONTENTS_OF);
4 use DX::Class;
5
6 with 'DX::Role::Predicate';
7
8 sub _possible_resolution_list {
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
18 sub _resolution_space_for {
19   my ($self, $left, $right) = @_;
20
21   my $deps = [ [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ] ];
22
23   if ($left->equals($right)) {
24     return rspace(
25       geometry_depends_on => $deps,
26       members => [
27         res(
28           actions => [],
29           veracity_depends_on => $deps,
30         )
31       ]
32     );
33   }
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,
51   );
52 }
53
54 1;