class Repetition::Flashcard

Attributes

due_at[R]
due_on[R]
easiness_factor[R]
interval[R]
repetitions[R]

Public Class Methods

new(easiness_factor: 2.5, interval: 0, repetitions: 0) click to toggle source
# File lib/repetition/flashcard.rb, line 22
def initialize(easiness_factor: 2.5, interval: 0, repetitions: 0)
  @easiness_factor = easiness_factor
  @interval = interval
  @repetitions = repetitions
end

Public Instance Methods

recall(quality) click to toggle source
# File lib/repetition/flashcard.rb, line 28
def recall(quality)
  raise ArgumentError, 'Invalid quality of recall. Should be in range from 0 to 5.' unless (0..5).cover?(quality)

  if quality < 3
    # An incorrect recall is reset back to the beginning
    @repetitions = 0
    @interval = 0
  elsif quality == 3
    # The item was correctly recalled but should be tested again quickly
    @interval = 0
  else
    # The item was correctly recalled and we can review later on
    @repetitions += 1

    case @repetitions
    when 1
      @interval = 1
    when 2
      @interval = 6
    else
      @easiness_factor = calculate_easiness_factor(@easiness_factor, quality)
      @interval = @interval * @easiness_factor
    end
  end

  @due_at = DateTime.now + @interval
  @due_on = Date.today + @interval
end

Private Instance Methods

calculate_easiness_factor(easiness_factor, quality) click to toggle source
# File lib/repetition/flashcard.rb, line 59
def calculate_easiness_factor(easiness_factor, quality)
  result = easiness_factor - 0.8 + (0.28 * quality) - (0.02 * quality * quality)
  result < 1.3 ? 1.3 : result
end