1 package DX::Predicate::MemberAt;
3 use DX::Utils qw(step INDICES_OF EXISTENCE_OF CONTENTS_OF string);
4 use DX::ActionBuilder::ProxySetToAdd;
5 use DX::ActionBuilder::Null;
8 with 'DX::Role::Predicate';
10 sub _possible_resolution_list {
11 my ($self, $coll, $key, $value) = @_;
12 die "First argument to member_at must be a structured value"
13 unless $coll->does('DX::Role::StructuredValue');
16 ? map $_->but_with_dependencies_on(
18 [ EXISTENCE_OF ,=> $coll, $key->string_value ],
19 [ CONTENTS_OF ,=> $key ],
22 if (my $cur_val = $coll->get_member_at($key)) {
23 $self->_make_equal($cur_val, $value);
26 and my $add = $coll->action_for_add_member($key, $value)
32 [ CONTENTS_OF ,=> $coll, $key->string_value ],
33 [ CONTENTS_OF ,=> $value ],
39 and $value->action_builder->isa('DX::ActionBuilder::UnsetValue')
40 and my $p = $coll->value_path
42 my @path = (@$p, $key->string_value);
43 my $ab = DX::ActionBuilder::ProxySetToAdd->new(
44 target_path => \@path,
45 proxy_to => $coll->action_builder,
47 my $set = $value->action_for_set_value(
56 [ CONTENTS_OF ,=> $coll, $key->string_value ],
57 [ CONTENTS_OF ,=> $value ],
68 && $key->action_builder->isa('DX::ActionBuilder::UnsetValue')
70 my $set_key = DX::Action::SetValue->new(
71 target_path => $key->action_builder->target_path,
72 new_value => DX::ActionBuilder::Null->new(
73 target_path => $key->action_builder->target_path,
74 )->apply_to_value(string(my $kstr = $_))
76 map $_->but_first($set_key)
77 ->but_with_dependencies_on(
79 [ EXISTENCE_OF ,=> $coll, $kstr ],
80 [ CONTENTS_OF ,=> $key ],
83 $self->_make_equal($coll->get_member_at($_), $value);
90 sub selection_depends_on {
91 my ($self, $coll, $key, $value) = @_;
93 [ [ $coll => ($key->can_set_value ? INDICES_OF : (EXISTENCE_OF ,=> $key)) ],