Code/Functions/Mathematical/CountFunction.cs
using Expressive.Expressions;
using System.Collections;

namespace Expressive.Functions.Mathematical
{
    internal class CountFunction : FunctionBase
    {
        #region FunctionBase Members

        /// <inheritdoc />
        public override string Name => "Count";

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

            var count = 0;

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

                if (evaluatedValue is ICollection collection)
                {
                    increment = collection.Count;
                }

                count += increment;
            }

            return count;
        }

        #endregion
    }
}