public CalculationResult ProcessCalculation(string expression)
        {
            //1. run the evaluation
            var processingResult = calculatorProcessor.Calculate(expression);

            //2. parse the error if failed
            IEnumerable <int> failingIndex = null;

            if (processingResult.HasError)
            {
                failingIndex = ParseErrorForForFailingIndexes(processingResult.Error);
            }

            //3. construct response
            var calculationResult = new CalculationResult
            {
                Result           = processingResult.Result,
                IsSuccessfull    = !processingResult.HasError,
                CalculationError = processingResult.HasError
                    ? new CalculationError
                {
                    ErrorText = processingResult.Error,
                    Indexes   = failingIndex
                }
                    : null
            };

            var expressionCalculation = new ExpressionCalculation
            {
                DateGenerated     = DateTime.Now,
                Expression        = expression,
                CalculationResult = calculationResult
            };

            //4. store in history
            calculationDataProvider.Save(expressionCalculation);

            return(calculationResult);
        }
 public void Save(ExpressionCalculation expressionCalculation)
 {
     dataProvider.Save(expressionCalculation);
 }