diff --git a/src/main/java/seedu/todo/models/Task.java b/src/main/java/seedu/todo/models/Task.java index 194355ce43c4..088eabf54bfc 100644 --- a/src/main/java/seedu/todo/models/Task.java +++ b/src/main/java/seedu/todo/models/Task.java @@ -2,6 +2,9 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; +import java.util.regex.Pattern; /** * @@author A0093907W @@ -106,5 +109,45 @@ public boolean addTag(String tagName) { public boolean removeTag(String tagName) { return tagList.remove(tagName); } + + + /** + * @@author A0093907W + * + * Filtering methods intended to replace hacky one-filter-method-per-permutation from Yaocong. + * Seriously, why??!! + */ + public static List where(List> predicates) { + List result = TodoListDB.getInstance().getAllTasks(); + for (Predicate predicate : predicates) { + filter(predicate, result); + } + return result; + } + + public static Predicate predByName(String name) { + return (Task task) -> Pattern.compile(String.format("\\b%s\\b", name), Pattern.CASE_INSENSITIVE) + .matcher(task.getName()).find(); + } + + public static Predicate predBeforeDueDate(LocalDateTime date) { + return (Task task) -> task.getDueDate().isBefore(date); + } + + public static Predicate predAfterDueDate(LocalDateTime date) { + return (Task task) -> task.getDueDate().isAfter(date); + } + + public static Predicate predCompleted(boolean completed) { + return (Task task) -> task.isCompleted() == completed; + } + + public static void filter(Predicate predicate, List taskList) { + for (int i = taskList.size() - 1; i >= 0; i--) { + if (!predicate.test(taskList.get(i))) { + taskList.remove(i); + } + } + } }