code: func interpolationFuncConcat() ast.Function {
  	return ast.Function{
  		ArgTypes:     []ast.Type{ast.TypeList},
  		ReturnType:   ast.TypeList,
  		Variadic:     true,
  		VariadicType: ast.TypeList,
  		Callback: func(args []interface{}) (interface{}, error) {
  			var outputList []ast.Variable
  
  			for _, arg := range args {
  				for _, v := range arg.([]ast.Variable) {
  					switch v.Type {
  					case ast.TypeString:
  						outputList = append(outputList, v)
  					case ast.TypeList:
  						outputList = append(outputList, v)
  					case ast.TypeMap:
  						outputList = append(outputList, v)
  					default:
  						return nil, fmt.Errorf("concat() does not support lists of %s", v.Type.Printable())
  					}
  				}
  			}
  
  			// we don't support heterogeneous types, so make sure all types match the first
  			if len(outputList) > 0 {
  				firstType := outputList[0].Type
  				for _, v := range outputList[1:] {
  					if v.Type != firstType {
  						return nil, fmt.Errorf("unexpected %s in list of %s", v.Type.Printable(), firstType.Printable())
  					}
  				}
  			}
  
  			return outputList, nil
  		},
  	}
  }
docs: // interpolationFuncConcat implements the "concat" function that concatenates
  // multiple lists.