export default class Month { constructor(month, year) { this.month = month; this.year = year; } next(n) { n = n ?? 1; const month = this.month + n - 1; this.month = (month % 12) + 1; this.year += Math.floor(month / 12); return this; } previous(n) { n = n ?? 1; let month = this.month - n - 1; if (month < 0) { month += 12; } this.month = (month % 12) + 1; this.year += Math.floor(month / 12); return this; } to(other) { const inner = []; const current = this.copy(); while (current.is_same(other) || current.is_before(other)) { inner.push(current.copy()); current.next(); } return inner; } copy() { return new Month(this.month, this.year); } is_before(other) { return this.year < other.year || (this.year == other.year && this.month < other.month); } is_after(other) { return this.year > other.year || (this.year == other.year && this.month > other.month); } is_same(other) { return this.year == other.year || this.month == other.month; } is_same_year(other) { return this.year == other.year; } get name() { const date = new Date(); date.setMonth(this.month - 1); return date.toLocaleDateString('default', { month: 'long' }) } static from_date(date) { return new Month(date.getMonth() - 1, date.getFullYear()); } static from_string(string) { const [ year, month ] = string.split('-'); return new Month(parseInt(month), parseInt(year)) } static literal(strings) { return Month.from_string(strings[0]); } } export const literal = Month.literal;