public void Do(ReplacementBuilderImpl replacementBuilder)
 {
     var insulinTotal = new Insulin();
     var patterns = replacementBuilder.replacement.Items.Select(item => item.Pattern);
     foreach (var pattern in patterns)
     {
         var meal = pattern.From;
         var totalCuInMeal = meal.Items.Sum(item => item.Cu);
         var percentOfCu = totalCuInMeal == 0 ? 0 : pattern.Match.Cu / totalCuInMeal;
         insulinTotal.NormalBolus
             += (float)Math.Round(percentOfCu * pattern.Insulin.NormalBolus * pattern.Factor, 1);
         var totalFpuInMeal = meal.Items.Sum(item => item.Fpu);
         var percentOfFpu = totalFpuInMeal == 0 ? 0 : pattern.Match.Fpu / totalFpuInMeal;
         insulinTotal.SquareWaveBolus
             += (float)Math.Round(percentOfFpu * pattern.Insulin.SquareWaveBolus * pattern.Factor, 1);
         insulinTotal.SquareWaveBolusHours
             += (float)Math.Round(percentOfFpu * pattern.Insulin.SquareWaveBolusHours * pattern.Factor, 1);
     }
     replacementBuilder.replacement.InsulinTotal = insulinTotal;
 }
 public void Do(ReplacementBuilderImpl replacementBuilder)
 {
     short energySum = replacementBuilder.meal.Energy;
     float replacementEnergySum = replacementBuilder.replacement.Items
         .Sum(replacement => replacement.Pattern.Match.Energy * replacement.Pattern.Factor);
     float notReplacedEnergy = Math.Abs(energySum - replacementEnergySum);
     double notReplacedEnergyPercent = notReplacedEnergy / energySum * 100;
     replacementBuilder.replacement.IsComplete
         = notReplacedEnergyPercent <= MAX_NOT_REPLACED_PERCENT_OF_ENERGY;
 }