public IEnumerable <object> skipWhile(TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(skipWhile)); var expr = scope.AssertExpression(nameof(skipWhile), expression, scopeOptions, out var itemBinding); var to = new List <object>(); var i = 0; var keepSkipping = true; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.EvaluateToBool(scope); if (!result) { keepSkipping = false; } if (!keepSkipping) { to.Add(item); } } return(to); }
public IEnumerable <object> takeWhile( TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(takeWhile)); var literal = scope.AssertExpression(nameof(takeWhile), expression); var scopedParams = scope.GetParamsWithItemBinding(nameof(takeWhile), scopeOptions, out var itemBinding); var to = new List <object>(); literal.ParseConditionExpression(out var expr); var i = 0; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.Evaluate(scope); if (result) { to.Add(item); } else { return(to); } } return(to); }
public IEnumerable <object> skipWhile(TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(skipWhile)); var literal = scope.AssertExpression(nameof(skipWhile), expression); var scopedParams = scope.GetParamsWithItemBinding(nameof(skipWhile), scopeOptions, out string itemBinding); var to = new List <object>(); literal.ParseConditionExpression(out ConditionExpression expr); var i = 0; var keepSkipping = true; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.Evaluate(scope); if (!result) { keepSkipping = false; } if (!keepSkipping) { to.Add(item); } } return(to); }
public object reduce(TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(reduce)); Type itemType = null; var literal = scope.AssertExpression(nameof(reduce), expression); var scopedParams = scope.GetParamsWithItemBinding(nameof(reduce), scopeOptions, out string itemBinding); var accumulator = scopedParams.TryGetValue("initialValue", out object initialValue) ? initialValue.ConvertTo <double>() : 1; var bindAccumlator = scopedParams.TryGetValue("accumulator", out object accumulatorName) ? (string)accumulatorName : "accumulator"; literal.ToStringSegment().ParseNextToken(out object value, out JsBinding binding); var i = 0; foreach (var item in items) { if (item == null) { continue; } scope.AddItemToScope(bindAccumlator, accumulator); scope.AddItemToScope("index", i++); scope.AddItemToScope(itemBinding, item); var result = scope.Evaluate(value, binding); if (result == null) { continue; } if (itemType == null) { itemType = result.GetType(); } accumulator = result.ConvertTo <double>(); } if (expression == null && itemType == null) { itemType = target.GetType().FirstGenericType()?.GetGenericArguments().FirstOrDefault(); } return(itemType == null || itemType == typeof(double) ? accumulator : accumulator.ConvertTo(itemType)); }
public static JsToken AssertExpression(this TemplateScopeContext scope, string filterName, object expression, object scopeOptions, out string itemBinding) { if (expression is JsArrowFunctionExpression arrowExpr) { itemBinding = arrowExpr.Params[0].Name; return(arrowExpr.Body); } var literal = scope.AssertExpression(filterName, expression); var scopedParams = scope.GetParamsWithItemBinding(filterName, scopeOptions, out itemBinding); var token = literal.GetCachedJsExpression(scope); return(token); }
public bool all(TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(all)); var expr = scope.AssertExpression(nameof(all), expression, scopeOptions, out var itemBinding); var i = 0; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.EvaluateToBool(scope); if (!result) { return(false); } } return(true); }
public int count(TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(count)); var expr = scope.AssertExpression(nameof(count), expression, scopeOptions, out var itemBinding); var total = 0; var i = 0; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.EvaluateToBool(scope); if (result) { total++; } } return(total); }
public bool all(TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(all)); var literal = scope.AssertExpression(nameof(all), expression); var scopedParams = scope.GetParamsWithItemBinding(nameof(where), scopeOptions, out string itemBinding); literal.ParseConditionExpression(out ConditionExpression expr); var i = 0; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.Evaluate(scope); if (!result) { return(false); } } return(true); }
public object first(TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(first)); var literal = scope.AssertExpression(nameof(first), expression); var scopedParams = scope.GetParamsWithItemBinding(nameof(first), scopeOptions, out var itemBinding); literal.ParseConditionExpression(out var expr); var i = 0; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.Evaluate(scope); if (result) { return(item); } } return(null); }
public IEnumerable <object> where (TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(where)); var literal = scope.AssertExpression(nameof(where), expression); var scopedParams = scope.GetParamsWithItemBinding(nameof(where), scopeOptions, out string itemBinding); var to = new List <object>(); var expr = literal.GetCachedJsExpression(scope); var i = 0; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.EvaluateToBool(scope); if (result) { to.Add(item); } } return(to); }
public bool any(TemplateScopeContext scope, object target, object expression, object scopeOptions) { var items = target.AssertEnumerable(nameof(any)); var literal = scope.AssertExpression(nameof(any), expression); var scopedParams = scope.GetParamsWithItemBinding(nameof(any), scopeOptions, out string itemBinding); var expr = literal.GetCachedJsExpression(scope); var i = 0; foreach (var item in items) { scope.AddItemToScope(itemBinding, item, i++); var result = expr.EvaluateToBool(scope); if (result) { return(true); } } return(false); }
private object applyInternal(string filterName, TemplateScopeContext scope, object target, object expression, object scopeOptions, Func <double, double, double> fn) { if (target is double d) { return(fn(d, expression.ConvertTo <double>())); } if (target is int i) { return((int)fn(i, expression.ConvertTo <double>())); } if (target is long l) { return((long)fn(l, expression.ConvertTo <double>())); } var items = target.AssertEnumerable(filterName); var total = filterName == nameof(min) ? double.MaxValue : 0; Type itemType = null; if (expression != null) { var expr = scope.AssertExpression(filterName, expression, scopeOptions, out var itemBinding); foreach (var item in items) { if (item == null) { continue; } scope.AddItemToScope(itemBinding, item); var result = expr.Evaluate(scope); if (result == null) { continue; } if (itemType == null) { itemType = result.GetType(); } total = fn(total, result.ConvertTo <double>()); } } else { foreach (var item in items) { if (item == null) { continue; } if (itemType == null) { itemType = item.GetType(); } total = fn(total, item.ConvertTo <double>()); } } if (filterName == nameof(min) && itemType == null) { return(0); } if (expression == null && itemType == null) { itemType = target.GetType().FirstGenericType()?.GetGenericArguments().FirstOrDefault(); } return(itemType == null || itemType == typeof(double) ? total : total.ConvertTo(itemType)); }