private static void ApplyInactivityHeuristics(ActivityStreamStatistic statistic,
                                               TimeSpan shortInactivityLimit,
                                               TimeSpan longInactivityThreshold,
                                               TimeSpan inactivityDuration,
                                               Activity previousActivity,
                                               Activity followingActivity)
 {
     if (WasShortInactivity(inactivityDuration, shortInactivityLimit))
     {
         Add(statistic, Activity.Inactive, -inactivityDuration);
         statistic.NumberOfInactivityPeriods--;
         Add(statistic, previousActivity, inactivityDuration);
     }
     else if (WasLongInactivity(followingActivity, inactivityDuration, longInactivityThreshold))
     {
         Add(statistic, Activity.Inactive, -inactivityDuration);
         statistic.NumberOfInactivityPeriods--;
         Add(statistic, Activity.InactiveLong, inactivityDuration);
         statistic.NumberOfLongInactivityPeriods++;
     }
 }
        public ActivityStreamStatistic Evaluate(TimeSpan shortInactivityLimit, TimeSpan longInactivityThreshold)
        {
            var statistic          = new ActivityStreamStatistic();
            var inactivityDuration = TimeSpan.Zero;
            var previousActivity   = Activity.Other;

            foreach (var activity in _activities)
            {
                if (activity == Activity.Inactive)
                {
                    if (inactivityDuration == TimeSpan.Zero)
                    {
                        statistic.NumberOfInactivityPeriods++;
                    }
                    inactivityDuration += _windowSpan;
                }
                else
                {
                    ApplyInactivityHeuristics(
                        statistic,
                        shortInactivityLimit,
                        longInactivityThreshold,
                        inactivityDuration,
                        previousActivity,
                        activity);
                    inactivityDuration = TimeSpan.Zero;
                    previousActivity   = activity;
                }

                if (IsLeaveOrEnter(activity))
                {
                    Add(statistic, Activity.Away, _windowSpan);
                }
                else
                {
                    Add(statistic, activity, _windowSpan);
                }
            }
            return(statistic);
        }