timeperiodjs
Version:
Time Period Library
74 lines (73 loc) • 3.35 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const DateFilter_1 = __importDefault(require("../filters/DateFilter"));
const Period_1 = __importDefault(require("../Period"));
const PeriodConstants_1 = require("../PeriodConstants");
const PeriodTimeChanger_1 = __importDefault(require("../PeriodTimeChanger"));
const DateSorter_1 = __importDefault(require("../sorters/DateSorter"));
class IPeriod {
constructor(start, end) {
this._start = new Date(start);
this._end = new Date(end);
this._timeChanger = new PeriodTimeChanger_1.default(this._start, this._end);
}
getDates() {
return [new Date(this._start), new Date(this._end)];
}
getOverlappingDates(dates) {
return dates.filter(date => date >= this._start && date <= this._end);
}
isDateOverlapping(date) {
return this.getOverlappingDates([date]).length > 0;
}
isPeriodOverlapping(period, conf) {
return this.getOverlappingPeriods([period], conf).length > 0;
}
// eslint-disable-next-line class-methods-use-this
getOverlappingPeriods(periods, conf) {
if (conf === null || conf === void 0 ? void 0 : conf.onlyFullOverlaps) {
return periods.filter(period => period.start >= this._start && period.end <= this._end);
}
return periods.filter(period => period.end >= this._start && period.start <= this._end);
}
comparePeriod(period) {
const periodComparisonsDTO = [];
const allDates = new DateSorter_1.default([...this.getDates(), ...period.getDates()]).sort();
const dates = new DateFilter_1.default(allDates).filterDuplicates();
const conf = {
onlyFullOverlaps: true,
};
let lastEntry;
for (let i = 0; i < dates.length; i++) {
const date = dates[i];
if (lastEntry) {
const tempPeriod = new Period_1.default(lastEntry, date);
const periodComparisonDTO = {
status: PeriodConstants_1.PeriodComparisonStatuses.EXACT,
start: tempPeriod.start,
end: tempPeriod.end
};
if (this.isPeriodOverlapping(tempPeriod, conf) && !period.isPeriodOverlapping(tempPeriod, conf))
periodComparisonDTO.status = PeriodConstants_1.PeriodComparisonStatuses.REMOVED;
else if (!this.isPeriodOverlapping(tempPeriod, conf) && period.isPeriodOverlapping(tempPeriod, conf))
periodComparisonDTO.status = PeriodConstants_1.PeriodComparisonStatuses.ADDED;
periodComparisonsDTO.push(periodComparisonDTO);
}
lastEntry = new Date(date);
}
return periodComparisonsDTO;
}
cutBoundaries(periods) {
return this.getOverlappingPeriods(periods).map(period => {
if (period._start < this._start)
period.setStart = this._start;
if (period._end > this._end)
period.setEnd = this._end;
return period;
});
}
}
exports.default = IPeriod;