code: func VisitInParallel(visitorOptsSlice ...*VisitorOptions) *VisitorOptions {
  	skipping := map[int]interface{}{}
  
  	return &VisitorOptions{
  		Enter: func(p VisitFuncParams) (string, interface{}) {
  			for i, visitorOpts := range visitorOptsSlice {
  				if _, ok := skipping[i]; !ok {
  					node, ok := p.Node.(ast.Node)
  					if !ok {
  						continue
  					}
  					kind := node.GetKind()
  					fn := GetVisitFn(visitorOpts, kind, false)
  					if fn != nil {
  						action, result := fn(p)
  						if action == ActionSkip {
  							skipping[i] = node
  						} else if action == ActionBreak {
  							skipping[i] = ActionBreak
  						} else if action == ActionUpdate {
  							return ActionUpdate, result
  						}
  					}
  				}
  			}
  			return ActionNoChange, nil
  		},
  		Leave: func(p VisitFuncParams) (string, interface{}) {
  			for i, visitorOpts := range visitorOptsSlice {
  				skippedNode, ok := skipping[i]
  				if !ok {
  					if node, ok := p.Node.(ast.Node); ok {
  						kind := node.GetKind()
  						fn := GetVisitFn(visitorOpts, kind, true)
  						if fn != nil {
  							action, result := fn(p)
  							if action == ActionBreak {
  								skipping[i] = ActionBreak
  							} else if action == ActionUpdate {
  								return ActionUpdate, result
  							}
  						}
  					}
  				} else if skippedNode == p.Node {
  					delete(skipping, i)
  				}
  			}
  			return ActionNoChange, nil
  		},
  	}
  }
docs: // VisitInParallel Creates a new visitor instance which delegates to many visitors to run in
  // parallel. Each visitor will be visited for each node before moving on.
  //
  // If a prior visitor edits a node, no following visitors will see that node.