Skip to content

Commit

Permalink
v1.3
Browse files Browse the repository at this point in the history
  • Loading branch information
DedInc committed Mar 21, 2024
1 parent 66ca2e8 commit 97269ef
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 33 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ tasks.withType(JavaCompile) {
}

group 'com.github.dedinc.mindvault'
version '1.2'
version '1.3'

repositories {
mavenCentral()
Expand Down
25 changes: 17 additions & 8 deletions src/main/java/com/github/dedinc/mindvault/core/Intervals.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,27 @@ public static boolean isReviseViolated(long learnDate, long[] reviseDates) {
return false;
}

public static boolean needRevise(long learnDate, long reviseDate) {
public static boolean needRevise(long learnDate, long[] reviseDates) {
long currentDate = Time.getUnix();
long daysSinceLearning = (currentDate - learnDate) / 86400;
long daysSinceLastRevision = (currentDate - reviseDate) / 86400;
long daysSinceLearningToRevision = daysSinceLearning - daysSinceLastRevision;

int currentInterval = 0;
for (int interval : intervals) {
if (daysSinceLearningToRevision <= interval) {
currentInterval = interval;
break;
int revisionCount = reviseDates.length;

if (revisionCount > 0) {
long lastRevisionDate = reviseDates[revisionCount - 1];
long daysSinceLastRevision = (currentDate - lastRevisionDate) / 86400;

if (revisionCount < intervals.length) {
currentInterval = intervals[revisionCount];
} else {
currentInterval = intervals[intervals.length - 1];
}

return daysSinceLastRevision >= currentInterval;
} else {
currentInterval = intervals[0];
return daysSinceLearning >= currentInterval;
}
return daysSinceLastRevision >= currentInterval;
}
}
58 changes: 35 additions & 23 deletions src/main/java/com/github/dedinc/mindvault/core/Session.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,44 +53,36 @@ public void removeCards(List<String> questions) {

public void moveCard(Card card, State newState) {
State currentState = card.getCategory(this);

if (currentState == newState) {
return;
}

for (State category : Arrays.asList(State.REVISE, State.WEAK, State.MIDDLE, State.LEARN)) {
cards.get(category).removeIf(c -> c.getQuestion().equals(card.getQuestion()));
}
cards.get(newState).add(card);
}

public void updateCards() {
Map<State, List<Card>> cardsToMove = new EnumMap<>(State.class);
for (List<Card> cardList : cards.values()) {
List<Card> learnCards = new ArrayList<>();
List<Card> reviseCards = new ArrayList<>();
for (Card card : cardList) {
State category = card.getCategory(this);
for (State category : cards.keySet()) {
List<Card> categoryCards = cards.get(category);
List<Card> tempCards = new ArrayList<>();
for (Card tempCard : categoryCards) {
tempCards.add(tempCard);
}
for (Card card : tempCards) {
if (category == State.LEARN || category == State.REVISE) {
continue;
}
boolean reviseViolated = Intervals.isReviseViolated(card.getLearnDate(), card.getReviseDates());
boolean needRevise = Intervals.needRevise(card.getLearnDate(), Arrays.stream(card.getReviseDates()).max().orElse(0));
boolean needRevise = Intervals.needRevise(card.getLearnDate(), card.getReviseDates());
if (reviseViolated) {
card.setLearnDate(0);
card.setReviseDates(new long[0]);
learnCards.add(card);
moveCard(card, State.LEARN);
} else if (needRevise) {
reviseCards.add(card);
moveCard(card, State.REVISE);
}
}
cardList.removeAll(learnCards);
cardList.removeAll(reviseCards);
cardsToMove.computeIfAbsent(State.LEARN, k -> new ArrayList<>()).addAll(learnCards);
cardsToMove.computeIfAbsent(State.REVISE, k -> new ArrayList<>()).addAll(reviseCards);
}
for (Map.Entry<State, List<Card>> entry : cardsToMove.entrySet()) {
cards.get(entry.getKey()).addAll(entry.getValue());
}
}

Expand Down Expand Up @@ -140,13 +132,33 @@ public void updateLevel() {

public List<Card> getCards() {
List<Card> selectedCards = new ArrayList<>();
for (State category : Arrays.asList(State.REVISE, State.WEAK, State.MIDDLE, State.LEARN)) {
List<Card> sourceCards = new ArrayList<>(cards.get(category));
int limit = Math.min(perSessionCards - selectedCards.size(), sourceCards.size());
if (selectedCards.size() < perSessionCards && !sourceCards.isEmpty()) {
selectedCards.addAll(sourceCards.subList(0, limit));
boolean hasCardsToReview = !cards.get(State.REVISE).isEmpty() || !cards.get(State.WEAK).isEmpty() || !cards.get(State.MIDDLE).isEmpty();

if (hasCardsToReview) {
for (State category : Arrays.asList(State.REVISE, State.WEAK, State.MIDDLE)) {
List<Card> sourceCards = new ArrayList<>(cards.get(category));
int limit = Math.min(perSessionCards - selectedCards.size(), sourceCards.size());
if (selectedCards.size() < perSessionCards && !sourceCards.isEmpty()) {
selectedCards.addAll(sourceCards.subList(0, limit));
}
}
} else {
List<Card> sourceCards = new ArrayList<>(cards.get(State.LEARN));
int learnedToday = (int) sourceCards.stream()
.filter(card -> Time.isToday(card.getLearnDate()))
.count();

if (learnedToday < 100) {
int limit = Math.min(perSessionCards - selectedCards.size(), sourceCards.size());
int remainingQuota = 100 - learnedToday;
int newCardsToLearn = Math.min(limit, remainingQuota);

if (selectedCards.size() < perSessionCards && !sourceCards.isEmpty()) {
selectedCards.addAll(sourceCards.subList(0, newCardsToLearn));
}
}
}

return selectedCards;
}

Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/github/dedinc/mindvault/core/Time.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package com.github.dedinc.mindvault.core;

import java.time.LocalDate;

public class Time {
public static long getUnix() {
return System.currentTimeMillis() / 1000;
}

public static boolean isToday(long timestamp) {
LocalDate date = LocalDate.ofEpochDay(timestamp / 86400);
LocalDate today = LocalDate.now();
return date.equals(today);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ private void updatePomodoroStatus() {

private void createSession() {
session = FileUtils.createNewSession();
session.updateCards();
manageCardsButton.setEnabled(true);
startSessionButton.setEnabled(true);
saveSessionButton.setEnabled(true);
Expand Down

0 comments on commit 97269ef

Please sign in to comment.