lift some of the rspace handling into the Resolution* classes
[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 _resolution_space_for {
9   my ($self, $left, $right) = @_;
10
11   my $deps = [ [ CONTENTS_OF ,=> $left ], [ CONTENTS_OF ,=> $right ] ];
12
13   if ($left->equals($right)) {
14     return rspace(
15       geometry_depends_on => $deps,
16       members => [
17         res(
18           actions => [],
19           veracity_depends_on => $deps,
20         )
21       ]
22     );
23   }
24
25   my @members = map {
26     my ($set_this, $to_this) = @$_;
27     res(
28       actions => [ $set_this->action_for_set_value($to_this) ],
29       veracity_depends_on => $deps,
30     );
31   } grep {
32     $_->[0]->can_set_value
33   } (
34     [ $left, $right ],
35     [ $right, $left ],
36   );
37
38   return rspace(
39     geometry_depends_on => $deps,
40     members => \@members,
41   );
42 }
43
44 1;