provide and preserve aperture information
[scpubgit/DX.git] / lib / DX / Predicate / Eq.pm
1 package DX::Predicate::Eq;
2
3 use DX::Utils qw(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   my $aperture = [ map @{$_->aperture_for_set_value}, $left, $right ];
14
15   if ($left->equals($right)) {
16     return rspace(
17       geometry_depends_on => $deps,
18       aperture => $aperture,
19       members => [
20         res(
21           actions => [],
22           veracity_depends_on => $deps,
23         )
24       ]
25     );
26   }
27
28   my @members = map {
29     my ($set_this, $to_this) = @$_;
30     res(
31       actions => [ $set_this->action_for_set_value($to_this) ],
32       veracity_depends_on => $deps,
33     );
34   } grep {
35     $_->[0]->can_set_value
36   } (
37     [ $left, $right ],
38     [ $right, $left ],
39   );
40
41   return rspace(
42     geometry_depends_on => $deps,
43     aperture => $aperture,
44     members => \@members,
45   );
46 }
47
48 1;