make MemberOf handle a bound RHS
[scpubgit/DKit.git] / lib / DX / Op / MemberOf.pm
index e5e9ca4..cb9239d 100644 (file)
@@ -1,6 +1,7 @@
 package DX::Op::MemberOf;
 
 use DX::ArrayStream;
+use DX::RefSet;
 use Moo;
 
 with 'DX::Role::Op';
@@ -15,11 +16,25 @@ sub run {
     of => $self->coll_var
   );
   my ($member, $of) = @args{qw(member of)};
-  die "member bound" if $member->is_bound;
-  my $set = $state->facts->{$of->bound_value};
+  my $type = $state->resolve_value($of);
+  my $set = ref($type) ? $type : $state->facts->{$type};
+  if ($member->is_bound) {
+    my $test = $state->resolve_value($member);
+    if (grep { $_ eq $test } $set->all) {
+      return $state->then($self->next);
+    }
+    return $state->backtrack;
+  }
+  my $ref_set = (
+    ref($type)
+      ? $set
+      : DX::RefSet->new(
+          target => $type, names => [ $set->key_list ],
+        )
+  );
   return $state->then($self->next)
                ->add_dependencies($member->id, $of->id)
-               ->bind_root_set($member->id, $set)
+               ->bind_root_set($member->id, $ref_set)
 }
 
 1;