Skip to content

Instantly share code, notes, and snippets.

@tsandall
Created January 5, 2021 23:01
Show Gist options
  • Save tsandall/9bfd09fff6b23e601710283e1d9b825c to your computer and use it in GitHub Desktop.
Save tsandall/9bfd09fff6b23e601710283e1d9b825c to your computer and use it in GitHub Desktop.
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