// Helper to eval an arg that might be a lambda. internal DValue <T> EvalArg <T>(FormulaValue arg, SymbolContext context, IRContext irContext) where T : ValidFormulaValue { if (arg is LambdaFormulaValue lambda) { var val = lambda.Eval(this, context); return(val switch { T t => DValue <T> .Of(t), BlankValue b => DValue <T> .Of(b), ErrorValue e => DValue <T> .Of(e), _ => DValue <T> .Of(CommonErrors.RuntimeTypeMismatch(irContext)) });
private bool BlankItemNeeded() { if (Items.Count < 1) { return(true); } if (OmitBlankItem) { return(false); } return(Items[0].Value != BlankValue.ToString()); }
public static Func <EvalVisitor, SymbolContext, IRContext, TableValue[], FormulaValue> StandardSingleColumnTable <T>(Func <EvalVisitor, SymbolContext, IRContext, T[], FormulaValue> targetFunction) where T : FormulaValue { return((runner, symbolContext, irContext, args) => { var tableType = (TableType)irContext.ResultType; var resultType = tableType.ToRecord(); var itemType = resultType.GetFieldType(BuiltinFunction.OneColumnTableResultNameStr); var arg0 = args[0]; var resultRows = new List <DValue <RecordValue> >(); foreach (var row in arg0.Rows) { if (row.IsValue) { var value = row.Value.GetField(BuiltinFunction.ColumnName_ValueStr); NamedValue namedValue; namedValue = value switch { T t => new NamedValue(BuiltinFunction.OneColumnTableResultNameStr, targetFunction(runner, symbolContext, IRContext.NotInSource(itemType), new T[] { t })), BlankValue bv => new NamedValue(BuiltinFunction.OneColumnTableResultNameStr, bv), ErrorValue ev => new NamedValue(BuiltinFunction.OneColumnTableResultNameStr, ev), _ => new NamedValue(BuiltinFunction.OneColumnTableResultNameStr, CommonErrors.RuntimeTypeMismatch(IRContext.NotInSource(itemType))) }; var record = new InMemoryRecordValue(IRContext.NotInSource(resultType), new List <NamedValue>() { namedValue }); resultRows.Add(DValue <RecordValue> .Of(record)); } else if (row.IsBlank) { resultRows.Add(DValue <RecordValue> .Of(row.Blank)); } else { resultRows.Add(DValue <RecordValue> .Of(row.Error)); } } return new InMemoryTableValue(irContext, resultRows); }); }
public static DValue <T> Of(BlankValue blank) { return(new DValue <T>(null, blank, null)); }
private DValue(T value, BlankValue blank, ErrorValue error) { _value = value; _blank = blank; _error = error; }