discoIntervals = apiRawDiscos
.sort((p1,p2) => p1.timestamp > p2.timestamp ? 1 : -1)
.map(p => ({ type: p.event, date: luxon.DateTime.fromSeconds(p.timestamp) }))
.reduce((acc, e, i, discos) => {
const from = e.date;
const to = discos[i+1] && discos[i+1].date;
if (!to) { return acc ;};
if (from.startOf('day').equals(to.startOf('day'))) {
acc.push({
from: from,
to: to,
unqiueEvent: `${e.type} ${i}-_`,
event: e.type,
i:i,
duration: luxon.Interval.fromDateTimes(from, to).toDuration().as("seconds")
})
} else {
const numDays = luxon.Interval.fromDateTimes(from, to).count("days") - 1;
acc.push({
from: from,
to: from.endOf("day"),
unqiueEvent: `${e.type} ${i}-from`,
event: e.type,
numDays: numDays,
duration: luxon.Interval.fromDateTimes(from, from.endOf("day")).toDuration().as("seconds")
})
for (const ii in [...Array(numDays).keys()]) {
const lowerBound = from.startOf("day").plus({days: (Number(ii) + 1)});
const upperBound = from.endOf("day").plus({days: (Number(ii) + 1)});
if (ii < (numDays - 1)) {
acc.push({
from: lowerBound,
to: upperBound,
numDays: numDays,
uniqueEvent: `${e.type} ${i}-${ii}-intermediate`,
event: e.type,
duration: luxon.Interval.fromDateTimes(lowerBound, upperBound).toDuration().as("seconds")
});
}
else {
acc.push({
from: lowerBound,
to: to,
numDays: numDays,
unqiueEvent: `${e.type} ${i}-${ii}-to`,
event: e.type,
duration: luxon.Interval.fromDateTimes(lowerBound, to).toDuration().as("seconds")
});
}
};
}
return acc
}, [])