Created
January 5, 2021 23:01
-
-
Save tsandall/9bfd09fff6b23e601710283e1d9b825c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/topdown/eval.go b/topdown/eval.go | |
index b51f5a65..f0de1d3e 100644 | |
--- a/topdown/eval.go | |
+++ b/topdown/eval.go | |
@@ -2455,17 +2455,35 @@ func (e evalTerm) next(iter unifyIterator, plugged *ast.Term) error { | |
return cpy.eval(iter) | |
} | |
+func (e evalTerm) next2(iter unifyIterator, term *ast.Term) error { | |
+ | |
+ term, bindings := e.termbindings.apply(term) | |
+ cpy := e | |
+ cpy.term = term | |
+ cpy.termbindings = bindings | |
+ cpy.pos++ | |
+ return cpy.eval(iter) | |
+} | |
+ | |
func (e evalTerm) enumerate(iter unifyIterator) error { | |
switch v := e.term.Value.(type) { | |
case *ast.Array: | |
- for i := 0; i < v.Len(); i++ { | |
- k := ast.IntNumberTerm(i) | |
- err := e.e.biunify(k, e.ref[e.pos], e.bindings, e.bindings, func() error { | |
- return e.next(iter, k) | |
- }) | |
- if err != nil { | |
- return err | |
+ if name, ok := e.ref[e.pos].Value.(ast.Var); ok && name.IsWildcard() { | |
+ for i := 0; i < v.Len(); i++ { | |
+ if err := e.next2(iter, v.Elem(i)); err != nil { | |
+ return err | |
+ } | |
+ } | |
+ } else { | |
+ for i := 0; i < v.Len(); i++ { | |
+ k := ast.IntNumberTerm(i) | |
+ err := e.e.biunify(k, e.ref[e.pos], e.bindings, e.bindings, func() error { | |
+ return e.next(iter, k) | |
+ }) | |
+ if err != nil { | |
+ return err | |
+ } | |
} | |
} | |
case ast.Object: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment