ts-fsrs 3.0.5 → 3.1.0-beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/default.js CHANGED
@@ -29,7 +29,7 @@ exports.default_w = exports.envParams.FSRS_W || [
29
29
  0.34, 1.26, 0.29, 2.61,
30
30
  ];
31
31
  exports.default_enable_fuzz = exports.envParams.FSRS_ENABLE_FUZZ || false;
32
- exports.FSRSVersion = "3.0.5";
32
+ exports.FSRSVersion = "3.1.0-beta1";
33
33
  const generatorParameters = (props) => {
34
34
  return {
35
35
  request_retention: props?.request_retention || exports.default_request_retention,
@@ -49,6 +49,7 @@ const createEmptyCard = (now) => {
49
49
  reps: 0,
50
50
  lapses: 0,
51
51
  state: index_1.State.New,
52
+ last_review: undefined,
52
53
  };
53
54
  };
54
55
  exports.createEmptyCard = createEmptyCard;
package/dist/fsrs.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { FSRSParameters, Card, CardInput, DateInput, RecordLog } from "./models";
1
+ import { Card, CardInput, DateInput, FSRSParameters, RecordLog, ReviewLogInput } from "./models";
2
2
  import { FSRSAlgorithm } from "./algorithm";
3
3
  export declare class FSRS extends FSRSAlgorithm {
4
4
  constructor(param: Partial<FSRSParameters>);
5
- preProcess(_card: CardInput, _now: DateInput): {
6
- card: Card;
7
- now: Date;
8
- };
5
+ private preProcessCard;
6
+ private preProcessDate;
7
+ private preProcessLog;
9
8
  repeat: (card: CardInput, now: DateInput) => RecordLog;
10
9
  get_retrievability: (card: Card, now: Date) => undefined | string;
10
+ rollback: (card: CardInput, log: ReviewLogInput) => Card;
11
11
  }
package/dist/fsrs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FSRS = void 0;
4
- const index_1 = require("./index");
4
+ const scheduler_1 = require("./scheduler");
5
5
  const help_1 = require("./help");
6
6
  const models_1 = require("./models");
7
7
  const algorithm_1 = require("./algorithm");
@@ -9,26 +9,30 @@ class FSRS extends algorithm_1.FSRSAlgorithm {
9
9
  constructor(param) {
10
10
  super(param);
11
11
  }
12
- preProcess(_card, _now) {
13
- const card = {
12
+ preProcessCard(_card) {
13
+ return {
14
14
  ..._card,
15
15
  state: (0, help_1.fixState)(_card.state),
16
16
  due: (0, help_1.fixDate)(_card.due),
17
17
  last_review: _card.last_review ? (0, help_1.fixDate)(_card.last_review) : undefined,
18
18
  };
19
- const now = (0, help_1.fixDate)(_now);
20
- return { card, now };
19
+ }
20
+ preProcessDate(_date) {
21
+ return (0, help_1.fixDate)(_date);
22
+ }
23
+ preProcessLog(_log) {
24
+ return {
25
+ ..._log,
26
+ rating: (0, help_1.fixRating)(_log.rating),
27
+ state: (0, help_1.fixState)(_log.state),
28
+ review: (0, help_1.fixDate)(_log.review),
29
+ };
21
30
  }
22
31
  repeat = (card, now) => {
23
- const process = this.preProcess(card, now);
24
- card = process.card;
25
- now = process.now;
26
- card.elapsed_days =
27
- card.state === models_1.State.New ? 0 : now.diff(card.last_review, "days"); //相距时间
28
- card.last_review = now; // 上次复习时间
29
- card.reps += 1;
30
- const s = new index_1.SchedulingCard(card).update_state(card.state);
31
- this.seed = String(card.last_review.getTime()) + String(card.elapsed_days);
32
+ card = this.preProcessCard(card);
33
+ now = this.preProcessDate(now);
34
+ const s = new scheduler_1.SchedulingCard(card, now).update_state(card.state);
35
+ this.seed = String(now.getTime()) + String(card.reps);
32
36
  let easy_interval, good_interval, hard_interval;
33
37
  switch (card.state) {
34
38
  case models_1.State.New:
@@ -65,14 +69,46 @@ class FSRS extends algorithm_1.FSRSAlgorithm {
65
69
  return s.record_log(card, now);
66
70
  };
67
71
  get_retrievability = (card, now) => {
68
- const process = this.preProcess(card, now);
69
- card = process.card;
70
- now = process.now;
72
+ card = this.preProcessCard(card);
73
+ now = this.preProcessDate(now);
71
74
  if (card.state !== models_1.State.Review) {
72
75
  return undefined;
73
76
  }
74
77
  const t = Math.max(now.diff(card.last_review, "days"), 0);
75
78
  return ((this.current_retrievability(t, card.stability) * 100).toFixed(2) + "%");
76
79
  };
80
+ rollback = (card, log) => {
81
+ card = this.preProcessCard(card);
82
+ log = this.preProcessLog(log);
83
+ let last_due, last_review, last_lapses;
84
+ switch (log.state) {
85
+ case models_1.State.New:
86
+ last_due = log.due;
87
+ last_review = undefined;
88
+ last_lapses = 0;
89
+ break;
90
+ case models_1.State.Learning:
91
+ case models_1.State.Relearning:
92
+ case models_1.State.Review:
93
+ last_due = log.review;
94
+ last_review = log.due;
95
+ last_lapses =
96
+ card.lapses -
97
+ (log.rating === models_1.Rating.Again && log.state === models_1.State.Review ? 1 : 0);
98
+ break;
99
+ }
100
+ return {
101
+ ...card,
102
+ due: last_due,
103
+ stability: log.stability,
104
+ difficulty: log.difficulty,
105
+ elapsed_days: log.elapsed_days,
106
+ scheduled_days: log.scheduled_days,
107
+ reps: Math.max(0, card.reps - 1),
108
+ lapses: Math.max(0, last_lapses),
109
+ state: log.state,
110
+ last_review: last_review,
111
+ };
112
+ };
77
113
  }
78
114
  exports.FSRS = FSRS;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { SchedulingCard } from "./scheduler";
2
- export { default_request_retention, default_maximum_interval, default_w, default_enable_fuzz, FSRSVersion, generatorParameters, createEmptyCard, fsrs, envParams } from "./default";
2
+ export { default_request_retention, default_maximum_interval, default_w, default_enable_fuzz, FSRSVersion, generatorParameters, createEmptyCard, fsrs, envParams, } from "./default";
3
3
  export { date_scheduler, date_diff, formatDate, show_diff_message, } from "./help";
4
4
  export type { int, double } from "./type";
5
- export type { FSRSParameters, Card, ReviewLog, RecordLog, RecordLogItem, StateType, RatingType, CardInput, DateInput } from "./models";
5
+ export type { FSRSParameters, Card, ReviewLog, RecordLog, RecordLogItem, StateType, RatingType, CardInput, DateInput, } from "./models";
6
6
  export { State, Rating } from "./models";
7
7
  export { FSRS } from "./fsrs";
package/dist/models.d.ts CHANGED
@@ -15,6 +15,9 @@ export declare enum Rating {
15
15
  export interface ReviewLog {
16
16
  rating: Rating;
17
17
  state: State;
18
+ due: Date;
19
+ stability: number;
20
+ difficulty: number;
18
21
  elapsed_days: number;
19
22
  scheduled_days: number;
20
23
  review: Date;
@@ -41,6 +44,10 @@ export type CardInput = Card & {
41
44
  state: StateType | State;
42
45
  };
43
46
  export type DateInput = Date | number | string;
47
+ export type ReviewLogInput = ReviewLog & {
48
+ rating: RatingType | Rating;
49
+ state: StateType | State;
50
+ };
44
51
  export interface FSRSParameters {
45
52
  request_retention: number;
46
53
  maximum_interval: number;
@@ -4,8 +4,10 @@ export declare class SchedulingCard {
4
4
  hard: Card;
5
5
  good: Card;
6
6
  easy: Card;
7
+ last_review: Date;
8
+ elapsed_days: number;
7
9
  private copy;
8
- constructor(card: Card);
10
+ constructor(card: Card, now: Date);
9
11
  update_state(state: State): this;
10
12
  schedule(now: Date, hard_interval: number, good_interval: number, easy_interval: number): SchedulingCard;
11
13
  record_log(card: Card, now: Date): RecordLog;
package/dist/scheduler.js CHANGED
@@ -8,12 +8,20 @@ class SchedulingCard {
8
8
  hard;
9
9
  good;
10
10
  easy;
11
+ last_review;
12
+ elapsed_days;
11
13
  copy(card) {
12
14
  return {
13
15
  ...card,
14
16
  };
15
17
  }
16
- constructor(card) {
18
+ constructor(card, now) {
19
+ this.last_review = card.last_review || card.due;
20
+ this.elapsed_days = card.elapsed_days;
21
+ card.elapsed_days =
22
+ card.state === models_1.State.New ? 0 : now.diff(card.last_review, "days"); //相距时间
23
+ card.last_review = now; // 上次复习时间
24
+ card.reps += 1;
17
25
  this.again = this.copy(card);
18
26
  this.hard = this.copy(card);
19
27
  this.good = this.copy(card);
@@ -63,8 +71,11 @@ class SchedulingCard {
63
71
  log: {
64
72
  rating: models_1.Rating.Again,
65
73
  state: card.state,
66
- elapsed_days: this.again.scheduled_days,
67
- scheduled_days: card.elapsed_days,
74
+ due: this.last_review,
75
+ stability: card.stability,
76
+ difficulty: card.difficulty,
77
+ elapsed_days: this.elapsed_days,
78
+ scheduled_days: card.scheduled_days,
68
79
  review: now,
69
80
  },
70
81
  },
@@ -73,8 +84,11 @@ class SchedulingCard {
73
84
  log: {
74
85
  rating: models_1.Rating.Hard,
75
86
  state: card.state,
76
- elapsed_days: this.hard.scheduled_days,
77
- scheduled_days: card.elapsed_days,
87
+ due: this.last_review,
88
+ stability: card.stability,
89
+ difficulty: card.difficulty,
90
+ elapsed_days: this.elapsed_days,
91
+ scheduled_days: card.scheduled_days,
78
92
  review: now,
79
93
  },
80
94
  },
@@ -83,8 +97,11 @@ class SchedulingCard {
83
97
  log: {
84
98
  rating: models_1.Rating.Good,
85
99
  state: card.state,
86
- elapsed_days: this.good.scheduled_days,
87
- scheduled_days: card.elapsed_days,
100
+ due: this.last_review,
101
+ stability: card.stability,
102
+ difficulty: card.difficulty,
103
+ elapsed_days: this.elapsed_days,
104
+ scheduled_days: card.scheduled_days,
88
105
  review: now,
89
106
  },
90
107
  },
@@ -93,8 +110,11 @@ class SchedulingCard {
93
110
  log: {
94
111
  rating: models_1.Rating.Easy,
95
112
  state: card.state,
96
- elapsed_days: this.easy.scheduled_days,
97
- scheduled_days: card.elapsed_days,
113
+ due: this.last_review,
114
+ stability: card.stability,
115
+ difficulty: card.difficulty,
116
+ elapsed_days: this.elapsed_days,
117
+ scheduled_days: card.scheduled_days,
98
118
  review: now,
99
119
  },
100
120
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-fsrs",
3
- "version": "3.0.5",
3
+ "version": "3.1.0-beta1",
4
4
  "description": "ts-fsrs is a TypeScript package used to implement the Free Spaced Repetition Scheduler (FSRS) algorithm. It helps developers apply FSRS to their flashcard applications, thereby improving the user learning experience.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",