Skip to content

Commit 69289bb

Browse files
committed
feat: add utilities for sorting tasks by their start time
1 parent 11e76e6 commit 69289bb

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { describe, expect, it } from "vitest";
2+
import { DateTime } from "luxon";
3+
import { DeepPartial } from "utility-types";
4+
import { Task } from "@/data/task";
5+
import { byStartTime } from "@/utils/task-sort-utils";
6+
import { sortBy } from "lodash";
7+
8+
describe("Sorting tasks", () => {
9+
it("should sort by start time", () => {
10+
const unorderedTasks: DeepPartial<Task>[] = [
11+
{ times: { start: DateTime.fromISO("13:00") } },
12+
{ times: { start: DateTime.fromISO("09:00") } },
13+
{ times: { start: DateTime.fromISO("20:00") } },
14+
{ times: { start: DateTime.fromISO("16:30") } },
15+
];
16+
17+
expect(sortBy(unorderedTasks, byStartTime)).toEqual([
18+
{ times: { start: DateTime.fromISO("09:00") } },
19+
{ times: { start: DateTime.fromISO("13:00") } },
20+
{ times: { start: DateTime.fromISO("16:30") } },
21+
{ times: { start: DateTime.fromISO("20:00") } },
22+
]);
23+
});
24+
25+
it("should place invalid starts at the end", () => {
26+
const unorderedTasks: DeepPartial<Task>[] = [
27+
{ times: { start: DateTime.invalid("uh-oh!") } },
28+
{ times: { start: DateTime.fromISO("13:00") } },
29+
{ times: { start: DateTime.fromISO("09:00") } },
30+
{ times: { start: DateTime.fromISO("20:00") } },
31+
];
32+
33+
expect(sortBy(unorderedTasks, byStartTime)).toEqual([
34+
{ times: { start: DateTime.fromISO("09:00") } },
35+
{ times: { start: DateTime.fromISO("13:00") } },
36+
{ times: { start: DateTime.fromISO("20:00") } },
37+
{ times: { start: DateTime.invalid("uh-oh!") } },
38+
]);
39+
});
40+
});

src/utils/task-sort-utils.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { Task } from "@/data/task";
2+
3+
export function byStartTime(task: Task) {
4+
const start = task.times.start;
5+
return start.isValid ? start.toMillis() : Number.MAX_VALUE;
6+
}

0 commit comments

Comments
 (0)