Code/Functions/Statistical/MeanFunction.cs
using Expressive.Expressions;
using Expressive.Helpers;
using System;
using System.Collections;
using System.Collections.Generic;

namespace Expressive.Functions.Statistical
{
    internal class MeanFunction : FunctionBase
    {
        public override string Name => "Mean";

        public override object Evaluate(IExpression[] parameters, Context context)
        {
            this.ValidateParameterCount(parameters, -1, 1);

            return Evaluate(parameters, Variables);
        }

        internal static object Evaluate(IExpression[] parameters, IDictionary<string, object> variables)
        {
            var count = 0;
            object result = 0;

            foreach (var value in parameters)
            {
                var increment = 1;
                var evaluatedValue = value.Evaluate(variables);

                if (evaluatedValue is IEnumerable enumerable)
                {
                    var enumerableCount = 0;
                    object enumerableSum = 0;

                    foreach (var item in enumerable)
                    {
                        if (item is null)
                        {
                            continue;
                        }

                        enumerableCount++;
                        enumerableSum = Numbers.Add(enumerableSum, item);
                    }

                    increment = enumerableCount;
                    evaluatedValue = enumerableSum;
                }
                else if (evaluatedValue is null)
                {
                    continue;
                }

                result = Numbers.Add(result, evaluatedValue);
                count += increment;
            }

            return Convert.ToDouble(result) / count;
        }
    }
}