public IFunction FindFunction(string name, IReadOnlyList <TypeId> arguments) { var normalizedName = NormalizeFunctionName(name); if (!_functions.TryGetValue(normalizedName, out var functions)) { return(null); } // find function with minimal conversion cost var minCost = int.MaxValue; IFunction minFunction = null; foreach (var function in functions) { if (function.Arguments.Count != arguments.Count) { continue; } var cost = _converter.ComputeConversionCost(arguments, function.Arguments); if (cost < minCost) { minCost = cost; minFunction = function; } } return(minFunction); }