Class: ActiveRecall::FSRS

Inherits:
Object
  • Object
show all
Defined in:
lib/active_recall/algorithms/fsrs.rb,
lib/active_recall/algorithms/fsrs/internal.rb

Defined Under Namespace

Modules: Internal

Constant Summary collapse

REQUIRED_ATTRIBUTES =
[
  :box,
  :stability,
  :difficulty,
  :state,
  :lapses,
  :elapsed_days,
  :scheduled_days,
  :times_right,
  :times_wrong,
  :last_reviewed,
  :grade
].freeze
GRADE_TO_RATING =
{
  1 => Internal::Rating::AGAIN,
  2 => Internal::Rating::HARD,
  3 => Internal::Rating::GOOD,
  4 => Internal::Rating::EASY
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(box:, stability:, difficulty:, state:, lapses:, elapsed_days:, scheduled_days:, times_right:, times_wrong:, last_reviewed:, grade:, current_time: Time.current) ⇒ FSRS

Returns a new instance of FSRS.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/active_recall/algorithms/fsrs.rb', line 40

def initialize(box:, stability:, difficulty:, state:, lapses:,
  elapsed_days:, scheduled_days:, times_right:, times_wrong:,
  last_reviewed:, grade:, current_time: Time.current)
  @box = box || 0
  @stability = stability
  @difficulty = difficulty
  @state = state || Internal::State::NEW
  @lapses = lapses || 0
  @elapsed_days = elapsed_days || 0
  @scheduled_days = scheduled_days || 0
  @times_right = times_right || 0
  @times_wrong = times_wrong || 0
  @last_reviewed = last_reviewed
  @grade = grade
  @current_time = current_time
end

Class Method Details

.required_attributesObject



28
29
30
# File 'lib/active_recall/algorithms/fsrs.rb', line 28

def self.required_attributes
  REQUIRED_ATTRIBUTES
end

.score(**kwargs) ⇒ Object



36
37
38
# File 'lib/active_recall/algorithms/fsrs.rb', line 36

def self.score(**kwargs)
  new(**kwargs).score
end

.typeObject



32
33
34
# File 'lib/active_recall/algorithms/fsrs.rb', line 32

def self.type
  :gradable
end

Instance Method Details

#scoreObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/active_recall/algorithms/fsrs.rb', line 57

def score
  raise "Grade must be between 1-4!" unless GRADE_TO_RATING.key?(@grade)

  now = to_utc_datetime(@current_time)
  scheduling = scheduler.repeat(build_card, now)
  result = scheduling[GRADE_TO_RATING[@grade]].card

  {
    box: result.reps,
    stability: result.stability,
    difficulty: result.difficulty,
    state: result.state,
    lapses: result.lapses,
    elapsed_days: result.elapsed_days,
    scheduled_days: result.scheduled_days,
    last_reviewed: result.last_review,
    next_review: result.due,
    times_right: @times_right + ((@grade >= 2) ? 1 : 0),
    times_wrong: @times_wrong + ((@grade == 1) ? 1 : 0)
  }
end