applyToReviewingCardState method

dynamic applyToReviewingCardState (ReviewingCardState prev, DateTime ts, Rating rating)

Implementation

static applyToReviewingCardState(
    ReviewingCardState prev, DateTime ts, Rating rating) {
  if (rating == Rating.Again) {
    return LapsedCardState(
        master: prev.master,
        combination: prev.combination,
        consecutiveCorrect: 0,
        factor: constrainWithin(
            MIN_FACTOR.toDouble(), MAX_FACTOR, prev.factor.toDouble() - 200),
        lapses: prev.lapses + 1,
        interval: prev.interval,
        lastReviewed: ts);
  }

  double factorAdj = (rating == Rating.Hard
      ? -150
      : rating == Rating.Good ? 0 : rating == Rating.Easy ? 150 : double.nan);

  double daysLate = calculateDaysLate(prev, ts);

  double fact = rating == Rating.Hard
      ? (prev.interval + (daysLate / 4)) * 1.2
      : rating == Rating.Good
          ? ((prev.interval + (daysLate / 2)) * prev.factor) / 1000
          : rating == Rating.Easy
              ? (((prev.interval + daysLate) * prev.factor) / 1000) *
                  EASY_BONUS
              : double.nan;
  double ival = constrainWithin(prev.interval + 1, MAX_INTERVAL, fact);

  return ReviewingCardState(
      master: prev.master,
      combination: prev.combination,
      factor: constrainWithin(
          MIN_FACTOR.toDouble(), MAX_FACTOR, prev.factor + factorAdj),
      lapses: prev.lapses,
      interval: ival,
      lastReviewed: ts);
}