4
4
import com .github .dedinc .mindvault .core .objects .State ;
5
5
6
6
import java .util .*;
7
+ import java .util .stream .Collectors ;
7
8
8
9
public class Session {
9
10
private int typeSpeed ;
10
11
private Map <State , List <Card >> cards ;
11
12
private List <Double > grades ;
12
13
private int perSessionCards ;
14
+ private List <Card > allCardsCache ;
15
+
16
+ private PomodoroTimer pomodoroTimer ;
13
17
14
18
public Session () {
15
19
this (Time .getUnix () - 1 , "\n " );
16
20
}
17
21
18
22
public Session (long startTime , String text ) {
19
23
this .typeSpeed = Grades .calculateTypeSpeed (startTime , text );
20
- this .cards = new HashMap <>();
24
+ this .cards = new EnumMap <>(State . class );
21
25
for (State state : State .values ()) {
22
26
this .cards .put (state , new ArrayList <>());
23
27
}
24
28
this .grades = new ArrayList <>();
25
29
this .perSessionCards = 5 ;
30
+ this .allCardsCache = null ;
31
+ this .pomodoroTimer = new PomodoroTimer ();
26
32
}
27
33
28
34
public void addCard (String question , String answer ) {
29
35
Card newCard = new Card (question , answer , 0 , new long [0 ]);
30
36
cards .get (State .LEARN ).add (newCard );
37
+ invalidateAllCardsCache ();
31
38
}
32
39
33
40
public void addCards (List <Card > cards ) {
@@ -40,6 +47,7 @@ public void removeCard(String question) {
40
47
for (List <Card > cardList : cards .values ()) {
41
48
cardList .removeIf (card -> card .getQuestion ().equals (question ));
42
49
}
50
+ invalidateAllCardsCache ();
43
51
}
44
52
45
53
public void removeCards (List <String > questions ) {
@@ -50,32 +58,26 @@ public void removeCards(List<String> questions) {
50
58
51
59
public void moveCard (Card card , State newState ) {
52
60
State currentState = card .getCategory (this );
53
-
54
61
if (currentState == newState ) {
55
62
return ;
56
63
}
57
-
58
64
cards .get (currentState ).removeIf (c -> c .getQuestion ().equals (card .getQuestion ()));
59
65
cards .get (newState ).add (card );
66
+ invalidateAllCardsCache ();
60
67
}
61
68
62
69
public void updateCards () {
63
- Map <State , List <Card >> cardsToMove = new HashMap <>();
64
-
70
+ Map <State , List <Card >> cardsToMove = new EnumMap <>(State .class );
65
71
for (List <Card > cardList : cards .values ()) {
66
72
List <Card > learnCards = new ArrayList <>();
67
73
List <Card > reviseCards = new ArrayList <>();
68
-
69
74
for (Card card : cardList ) {
70
75
State category = card .getCategory (this );
71
-
72
76
if (category == State .LEARN || category == State .REVISE ) {
73
77
continue ;
74
78
}
75
-
76
79
boolean reviseViolated = Intervals .isReviseViolated (card .getLearnDate (), card .getReviseDates ());
77
80
boolean needRevise = Intervals .needRevise (card .getLearnDate (), Arrays .stream (card .getReviseDates ()).max ().orElse (0 ));
78
-
79
81
if (reviseViolated ) {
80
82
card .setLearnDate (0 );
81
83
card .setReviseDates (new long [0 ]);
@@ -84,33 +86,29 @@ public void updateCards() {
84
86
reviseCards .add (card );
85
87
}
86
88
}
87
-
88
89
cardList .removeAll (learnCards );
89
90
cardList .removeAll (reviseCards );
90
-
91
91
cardsToMove .computeIfAbsent (State .LEARN , k -> new ArrayList <>()).addAll (learnCards );
92
92
cardsToMove .computeIfAbsent (State .REVISE , k -> new ArrayList <>()).addAll (reviseCards );
93
93
}
94
-
95
94
for (Map .Entry <State , List <Card >> entry : cardsToMove .entrySet ()) {
96
95
cards .get (entry .getKey ()).addAll (entry .getValue ());
97
96
}
97
+ invalidateAllCardsCache ();
98
98
}
99
99
100
100
public void checkCard (Card card , double grade ) {
101
101
State currentState = card .getCategory (this );
102
-
103
102
if (currentState == State .LEARN ) {
104
103
card .setLearnDate (Time .getUnix ());
105
104
moveCard (card , State .WEAK );
106
105
return ;
107
106
}
108
107
if (currentState == State .REVISE ) {
109
- int revises = card .getReviseDates ().length ;
110
- long [] newReviseDates = Arrays .copyOf (card .getReviseDates (), revises + 1 );
111
- newReviseDates [revises ] = Time .getUnix ();
112
- card .setReviseDates (newReviseDates );
113
- if (revises == 0 ) {
108
+ List <Long > reviseDates = new ArrayList <>(Arrays .asList (Arrays .stream (card .getReviseDates ()).boxed ().toArray (Long []::new )));
109
+ reviseDates .add (Time .getUnix ());
110
+ card .setReviseDates (reviseDates .stream ().mapToLong (Long ::longValue ).toArray ());
111
+ if (reviseDates .size () == 1 ) {
114
112
moveCard (card , State .WEAK );
115
113
} else {
116
114
moveCard (card , grade >= 0.80 ? State .STRONG : grade <= 0.6 ? State .WEAK : State .MIDDLE );
@@ -135,13 +133,15 @@ public void checkCard(Card card, double grade) {
135
133
}
136
134
137
135
public void updateLevel () {
138
- double grade = Grades .calculateTotalGrade (grades .stream ().mapToDouble (Double ::doubleValue ).toArray ());
139
- perSessionCards = Math .min (
140
- grade >= 0.9 ? perSessionCards + 5 : grade >= 0.75 ? perSessionCards + 3 : grade <= 0.6 ? perSessionCards - 5 : perSessionCards ,
141
- 20
142
- );
143
- perSessionCards = Math .max (perSessionCards , 5 );
144
- grades .clear ();
136
+ if (!grades .isEmpty ()) {
137
+ double grade = Grades .calculateTotalGrade (grades );
138
+ perSessionCards = Math .min (
139
+ grade >= 0.9 ? perSessionCards + 3 : grade >= 0.75 ? perSessionCards + 2 : grade <= 0.6 ? perSessionCards - 1 : perSessionCards ,
140
+ 10
141
+ );
142
+ perSessionCards = Math .max (perSessionCards , 5 );
143
+ grades .clear ();
144
+ }
145
145
}
146
146
147
147
public List <Card > getCards () {
@@ -173,13 +173,10 @@ public Map<State, List<Card>> getCategories() {
173
173
}
174
174
175
175
public List <Card > getAllCards () {
176
- List <Card > allCards = new ArrayList <>();
177
- for (List <Card > cards : getCategories ().values ()) {
178
- for (Card card : cards ) {
179
- allCards .add (card );
180
- }
176
+ if (allCardsCache == null ) {
177
+ allCardsCache = cards .values ().stream ().flatMap (List ::stream ).collect (Collectors .toList ());
181
178
}
182
- return allCards ;
179
+ return allCardsCache ;
183
180
}
184
181
185
182
public void setTypeSpeed (int typeSpeed ) {
@@ -188,6 +185,7 @@ public void setTypeSpeed(int typeSpeed) {
188
185
189
186
public void setCards (Map <State , List <Card >> cards ) {
190
187
this .cards = cards ;
188
+ invalidateAllCardsCache ();
191
189
}
192
190
193
191
public void setGrades (List <Double > grades ) {
@@ -197,4 +195,12 @@ public void setGrades(List<Double> grades) {
197
195
public void setPerSessionCards (int perSessionCards ) {
198
196
this .perSessionCards = perSessionCards ;
199
197
}
200
- }
198
+
199
+ private void invalidateAllCardsCache () {
200
+ allCardsCache = null ;
201
+ }
202
+
203
+ public PomodoroTimer getPomodoroTimer () {
204
+ return pomodoroTimer ;
205
+ }
206
+ }
0 commit comments