public T Review(T item, ReviewOutcome outcome)
        {
            _revisionList.Remove(item);

            var nextReview = new T();

            if (outcome != ReviewOutcome.Incorrect)
            {
                nextReview.CorrectReviewStreak   = item.CorrectReviewStreak + 1;
                nextReview.PreviousCorrectReview = item.ReviewDate;
            }
            else
            {
                nextReview.CorrectReviewStreak   = 0;
                nextReview.PreviousCorrectReview = DateTime.MinValue;

                _revisionList.Add(nextReview);
            }

            nextReview.ReviewDate       = Clock.Now();
            nextReview.DifficultyRating = ReviewStrategy.AdjustDifficulty(item, outcome);
            nextReview.ReviewOutcome    = outcome;

            return(nextReview);
        }
        public bool IsDue(IReviewItem item)
        {
            var nextReview = ReviewStrategy.NextReview(item);

            return(nextReview <= Clock.Now());
        }