1 package DX::Predicate::MemberAt;
3 use DX::Utils qw(step INDICES_OF EXISTENCE_OF CONTENTS_OF);
6 with 'DX::Role::Predicate';
8 # Thing I've ignored for the moment: set key, unset value
9 # which for an add should result in an _make_equal style
10 # bind-with-add-action I suspect, but I don't have a current use
11 # case so punting while I get everything-the-fuck-else done
13 sub _possible_resolution_list {
14 my ($self, $coll, $key, $value) = @_;
15 die "First argument to member_at must be a structured value"
16 unless $coll->does('DX::Role::StructuredValue');
19 ? map $_->but_with_dependencies_on(
21 [ EXISTENCE_OF ,=> $coll, $key->string_value ],
22 [ CONTENTS_OF ,=> $key ],
25 if (my $cur_val = $coll->get_member_at($key)) {
26 $self->_make_equal($cur_val, $value);
29 and my $add = $coll->action_for_add_member($key, $value)
35 [ CONTENTS_OF ,=> $coll, $key->string_value ],
36 [ CONTENTS_OF ,=> $value ],
48 my $set_key = $key->action_for_set_value($_);
49 map $_->but_first($set_key)
50 ->but_with_dependencies_on(
52 [ EXISTENCE_OF ,=> $coll, $key->string_value ]
55 $self->_make_equal($coll->get_member_at($_), $value);
62 sub selection_depends_on {
63 my ($self, $coll, $key, $value) = @_;
65 [ [ $coll => ($key->can_set_value ? INDICES_OF : (EXISTENCE_OF ,=> $key)) ],