mirror of
https://github.com/multipleof4/lynchmark.git
synced 2026-01-14 00:27:55 +00:00
44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
async function findAvailableSlots(a,b,c){
|
|
const {DateTime}=await import('https://cdn.skypack.dev/luxon')
|
|
const {durationMinutes:d,searchRange:s,workHours:w}=c
|
|
const r=[DateTime.fromISO(s.start),DateTime.fromISO(s.end)]
|
|
const hm=q=>q.split(':').map(Number)
|
|
const [sh,sm]=hm(w.start)
|
|
const [eh,em]=hm(w.end)
|
|
const clamp=o=>{
|
|
let x=DateTime.fromISO(o.start)
|
|
let y=DateTime.fromISO(o.end)
|
|
if(+y<=+r[0]||+x>=+r[1])return
|
|
if(+x<+r[0])x=r[0]
|
|
if(+y>+r[1])y=r[1]
|
|
if(+y<=+x)return
|
|
return{ s:x,e:y}
|
|
}
|
|
const merged=[]
|
|
;[...a,...b].map(clamp).filter(Boolean).sort((x,y)=>+x.s-+y.s).forEach(v=>{
|
|
const last=merged.at(-1)
|
|
if(!last||+v.s>+last.e)merged.push({s:v.s,e:v.e})
|
|
else if(+v.e>+last.e)last.e=v.e
|
|
})
|
|
const gaps=[]
|
|
let cur=r[0]
|
|
merged.forEach(v=>{
|
|
if(+v.s>+cur)gaps.push({s:cur,e:v.s})
|
|
if(+v.e>+cur)cur=v.e
|
|
})
|
|
if(+cur<+r[1])gaps.push({s:cur,e:r[1]})
|
|
const slots=[]
|
|
const step={minutes:d}
|
|
gaps.forEach(g=>{
|
|
for(let day=g.s.startOf('day');+day<+g.e;day=day.plus({days:1})){
|
|
const ws=day.set({hour:sh,minute:sm,second:0,millisecond:0})
|
|
const we=day.set({hour:eh,minute:em,second:0,millisecond:0})
|
|
let u=+ws>+g.s?ws:g.s
|
|
const limit=+we<+g.e?we:g.e
|
|
if(+limit<=+u)continue
|
|
for(;+u.plus(step)<=+limit;u=u.plus(step))slots.push({start:u.toISO(),end:u.plus(step).toISO()})
|
|
}
|
|
})
|
|
return slots
|
|
}
|
|
export default findAvailableSlots; |