import { Task } from "../takker99%2Ftakker-scheduler/deps.ts"; import { startOfDay } from "../date-fns/startOfDay.ts"; import { addDays } from "../date-fns/addDays.ts"; import { addSeconds } from "../date-fns/addSeconds.ts"; import { isBefore } from "../date-fns/isBefore.ts"; export const hasRecord = (task: Task): task is Omit & { record: Required; } => task.record.start !== undefined && task.record.end !== undefined; /** タスクを特定日時で分割する * * まず記録時間で分割できるか試す。もし記録がなければ予定時刻から分割を試す * * - 記録で分割するときは、予定を分割しないので注意 * - そのうち予定も分割するように変更するかも * * 記録時間も予定時間もないか、分割時刻を跨いでいなければ分割せずに返す * * @param task 分割したいタスク * @param separator 分割時刻 * @return 分割したタスクのリスト */ export const split = (task: T, separator: Date) : [undefined, T] | [T, undefined] | [T, T] => { // 予定時刻から区切る if(!hasRecord(task)) { // 予定時刻が設定されていないとき if(!task.plan.duration || !task.plan.start) { return isBefore(task.plan.start ?? task.base, separator) ? [task, undefined] : [undefined, task]; } const end = addSeconds(task.plan.start, task.plan.duration); if (isBefore(end, separator)) return [task, undefined]; if (isBefore(separator, task.plan.start)) return [undefined, task]; const head = structuredClone(task); head.plan.duration = Math.floor((separator.getTime() - task.plan.start.getTime()) / 1000); const tail = structuredClone(task); tail.base = startOfDay(separator); tail.plan.start = new Date(separator); tail.plan.duration = Math.floor((end.getTime() - separator.getTime()) / 1000); return [head, tail]; } // 記録から区切る if (isBefore(task.record.end, separator)) return [task, undefined]; if (isBefore(separator, task.record.start)) return [undefined, task]; const head = structuredClone(task); head.record.end =new Date(separator); const tail = structuredClone(task); tail.record.start = new Date(separator); return [head, tail]; };