initial partial sketch
[scpubgit/DX.git] / lib / DX / Role / Predicate.pm
1 package DX::Role::Predicate;
2
3 use List::Util qw(reduce);
4 use DX::Utils qw(step);
5 use DX::Role;
6
7 sub resolution_step_for {
8   my ($self, @args) = @_;
9   my ($last, @rest) = reverse $self->_possible_resolution_list(@args);
10   return undef unless $last;
11   my $targ = $last;
12   $targ = $_->but_with_alternative_step($targ) for @rest;
13   return $targ;
14 }
15
16 sub _make_equal {
17   my ($self, $left, $right) = @_;
18   if ($left->equals($right)) {
19     return step(
20       actions => [],
21       depends_on => [ $left, $right ],
22     );
23   }
24   return (
25     do {
26       if ($left->is_set and my $set = $right->action_for_set_value($left)) {
27         step(
28           actions => [ $set ],
29           depends_on => [ [ $right => [ $left, $right ] ] ],
30         )
31       } else {
32         ()
33       }
34     },
35     do {
36       if ($right->is_set and my $set = $left->action_for_set_value($right)) {
37         step(
38           actions => [ $set ],
39           depends_on => [ [ $left => [ $left, $right ] ] ],
40         )
41       } else {
42         ()
43       }
44     },
45   );
46 }
47
48 sub selection_depends_on {
49   my ($self, @args) = @_;
50   \@args;
51 }
52
53 1;