mirror of
https://github.com/multipleof4/lynchmark.git
synced 2026-09-25 14:55:28 +00:00
Docs: Update Gemini benchmark results
This commit is contained in:
@@ -1,59 +1,32 @@
|
||||
const findAvailableSlots = async (calA, calB, { durationMinutes, searchRange, workHours }) => {
|
||||
const { parseISO, formatISO, addMinutes } = await import('https://cdn.jsdelivr.net/npm/date-fns@3.6.0/+esm');
|
||||
|
||||
const rangeStart = parseISO(searchRange.start).getTime();
|
||||
const rangeEnd = parseISO(searchRange.end).getTime();
|
||||
const durationMs = durationMinutes * 60 * 1000;
|
||||
const { DateTime, Interval } = await import('https://cdn.jsdelivr.net/npm/luxon@3/+esm');
|
||||
const z = { zone: 'utc' };
|
||||
const parse = t => DateTime.fromISO(t, z);
|
||||
const range = Interval.fromDateTimes(parse(searchRange.start), parse(searchRange.end));
|
||||
const [wsH, wsM] = workHours.start.split(':');
|
||||
const [weH, weM] = workHours.end.split(':');
|
||||
|
||||
const busy = [...calA, ...calB]
|
||||
.map(s => ({ start: parseISO(s.start).getTime(), end: parseISO(s.end).getTime() }))
|
||||
.sort((a, b) => a.start - b.start);
|
||||
|
||||
const merged = [];
|
||||
if (busy.length) {
|
||||
let curr = busy[0];
|
||||
for (const next of busy.slice(1)) {
|
||||
if (curr.end >= next.start) {
|
||||
curr.end = Math.max(curr.end, next.end);
|
||||
} else {
|
||||
merged.push(curr);
|
||||
curr = next;
|
||||
}
|
||||
}
|
||||
merged.push(curr);
|
||||
}
|
||||
.map(s => Interval.fromDateTimes(parse(s.start), parse(s.end)))
|
||||
.filter(i => i.isValid)
|
||||
.sort((a, b) => a.start - b.start)
|
||||
.reduce((acc, cur) => {
|
||||
const last = acc[acc.length - 1];
|
||||
return last && last.end >= cur.start ? (acc[acc.length - 1] = last.union(cur), acc) : [...acc, cur];
|
||||
}, []);
|
||||
|
||||
const slots = [];
|
||||
let now = rangeStart;
|
||||
|
||||
while (now + durationMs <= rangeEnd) {
|
||||
const currentDate = new Date(now);
|
||||
const dateStr = currentDate.toISOString().split('T')[0];
|
||||
const workStart = parseISO(`${dateStr}T${workHours.start}:00Z`).getTime();
|
||||
const workEnd = parseISO(`${dateStr}T${workHours.end}:00Z`).getTime();
|
||||
|
||||
if (now < workStart) {
|
||||
now = workStart;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (now + durationMs > workEnd) {
|
||||
now = addMinutes(workStart, 24 * 60).getTime();
|
||||
continue;
|
||||
}
|
||||
|
||||
const conflict = merged.find(b => now < b.end && (now + durationMs) > b.start);
|
||||
|
||||
if (conflict) {
|
||||
now = conflict.end;
|
||||
} else {
|
||||
const start = new Date(now);
|
||||
const end = new Date(now + durationMs);
|
||||
slots.push({ start: formatISO(start), end: formatISO(end) });
|
||||
now += durationMs;
|
||||
for (const free of range.difference(...busy)) {
|
||||
let cur = free.start;
|
||||
while (cur < free.end) {
|
||||
const next = cur.plus({ minutes: durationMinutes });
|
||||
if (next > free.end) break;
|
||||
const ws = cur.set({ hour: wsH, minute: wsM, second: 0, millisecond: 0 });
|
||||
const we = cur.set({ hour: weH, minute: weM, second: 0, millisecond: 0 });
|
||||
if (cur >= ws && next <= we) slots.push({ start: cur.toISO(), end: next.toISO() });
|
||||
cur = next;
|
||||
}
|
||||
}
|
||||
|
||||
return slots;
|
||||
};
|
||||
export default findAvailableSlots;
|
||||
Reference in New Issue
Block a user