-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
93 lines (86 loc) · 2.37 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
'use strict';
module.exports = class {
constructor(maxRange, usedSlots) {
this.usedSlots = usedSlots;
this.availableTimeSlots = this.getAvailableTimeSlots([maxRange], usedSlots);
}
get freeSlots() {
return this.availableTimeSlots;
}
addUsedSlots(usedSlotsArray) {
this.usedSlots = this.usedSlots.concat(usedSlotsArray);
this.availableTimeSlots = this.getAvailableTimeSlots(this.availableTimeSlots, usedSlotsArray);
}
getFreeSlotsBetween(range) {
let availableSlots = [];
this.availableTimeSlots.forEach(slot => {
if (slot.start >= range.end || slot.end <= range.start) {
return;
} else if (slot.start >= range.start && slot.end <= range.end) {
availableSlots.push(slot);
} else if (slot.start <= range.start && slot.end >= range.end) {
availableSlots.push(range);
} else if (slot.start < range.start && slot.end < range.end) {
availableSlots.push({
'start': range.start,
'end': slot.end,
});
} else if (slot.start > range.start && slot.end > range.end) {
availableSlots.push({
'start': slot.start,
'end': range.end,
});
}
});
return availableSlots;
}
getAvailableTimeSlots(availableTimeSlots, usedSlots) {
usedSlots.forEach(usedSlot => {
let tempSlots = [];
availableTimeSlots.forEach(range => {
tempSlots = tempSlots.concat(this.getAvailablePatches(range, usedSlot));
});
availableTimeSlots = tempSlots;
});
return availableTimeSlots;
}
getAvailablePatches(range, usedSlot) {
let timeSlotArray = [];
if (range.start > usedSlot.end || range.end < usedSlot.start) {
timeSlotArray.push(range);
} else {
if (range.start < usedSlot.start) {
timeSlotArray.push({
'start': range.start,
'end': usedSlot.start,
});
}
if (range.end > usedSlot.end) {
timeSlotArray.push({
'start': usedSlot.end,
'end': range.end,
});
}
}
return timeSlotArray;
}
getOverlappingUsedSlots() {
let slots = this.usedSlots;
let arrayToReturn = [];
for (let index = 0; index < slots.length; index++) {
let arr = [];
let slot1 = slots[index];
for (let index2 = index + 1; index2 < slots.length; index2++) {
let slot2 = slots[index2];
if (!(slot1.start >= slot2.end || slot1.end <= slot2.start)) {
arr.push(slots[index2]);
}
}
if (arr.length) {
arr.splice(0, 0, slot1);
arrayToReturn.push(arr);
}
}
return arrayToReturn;
}
};