github.com/expr-lang/expr@v1.16.9/optimizer/optimizer.go (about)

     1  package optimizer
     2  
     3  import (
     4  	. "github.com/expr-lang/expr/ast"
     5  	"github.com/expr-lang/expr/conf"
     6  )
     7  
     8  func Optimize(node *Node, config *conf.Config) error {
     9  	Walk(node, &inArray{})
    10  	for limit := 1000; limit >= 0; limit-- {
    11  		fold := &fold{}
    12  		Walk(node, fold)
    13  		if fold.err != nil {
    14  			return fold.err
    15  		}
    16  		if !fold.applied {
    17  			break
    18  		}
    19  	}
    20  	if config != nil && len(config.ConstFns) > 0 {
    21  		for limit := 100; limit >= 0; limit-- {
    22  			constExpr := &constExpr{
    23  				fns: config.ConstFns,
    24  			}
    25  			Walk(node, constExpr)
    26  			if constExpr.err != nil {
    27  				return constExpr.err
    28  			}
    29  			if !constExpr.applied {
    30  				break
    31  			}
    32  		}
    33  	}
    34  	Walk(node, &inRange{})
    35  	Walk(node, &filterMap{})
    36  	Walk(node, &filterLen{})
    37  	Walk(node, &filterLast{})
    38  	Walk(node, &filterFirst{})
    39  	Walk(node, &predicateCombination{})
    40  	Walk(node, &sumArray{})
    41  	Walk(node, &sumMap{})
    42  	return nil
    43  }