1 package DX::Predicate::MemberAt;
3 use DX::Utils qw(step INDICES_OF EXISTENCE_OF CONTENTS_OF string);
4 use DX::ActionBuilder::ProxySetToAdd;
7 with 'DX::Role::Predicate';
9 sub _possible_resolution_list {
10 my ($self, $coll, $key, $value) = @_;
11 die "First argument to member_at must be a structured value"
12 unless $coll->does('DX::Role::StructuredValue');
15 ? map $_->but_with_dependencies_on(
17 [ EXISTENCE_OF ,=> $coll, $key->string_value ],
18 [ CONTENTS_OF ,=> $key ],
21 if (my $cur_val = $coll->get_member_at($key)) {
22 $self->_make_equal($cur_val, $value);
25 and my $add = $coll->action_for_add_member($key, $value)
31 [ CONTENTS_OF ,=> $coll, $key->string_value ],
32 [ CONTENTS_OF ,=> $value ],
38 and $value->action_builder->isa('DX::ActionBuilder::UnsetValue')
39 and my $p = $coll->identity_path
41 my @path = (@$p, $key->string_value);
42 my $ab = DX::ActionBuilder::ProxySetToAdd->new(
43 target_path => \@path,
44 proxy_to => $coll->action_builder,
46 my $set = $value->action_for_set_value(
48 identity_path => \@path,
56 [ CONTENTS_OF ,=> $coll, $key->string_value ],
57 [ CONTENTS_OF ,=> $value ],
69 my $set_key = $key->action_for_set_value(string(my $kstr = $_));
70 map $_->but_first($set_key)
71 ->but_with_dependencies_on(
73 [ EXISTENCE_OF ,=> $coll, $kstr ],
74 [ CONTENTS_OF ,=> $key ],
77 $self->_make_equal($coll->get_member_at($_), $value);
84 sub selection_depends_on {
85 my ($self, $coll, $key, $value) = @_;
87 [ [ $coll => ($key->can_set_value ? INDICES_OF : (EXISTENCE_OF ,=> $key)) ],