"use strict"; class NoteSet { constructor(notes = []) { /** @type {Note[]} */ this.notes = notes; this.noteIdSet = new Set(notes.map(note => note.noteId)); /** @type {boolean} */ this.sorted = false; } add(note) { if (!this.hasNote(note)) { this.notes.push(note); this.noteIdSet.add(note.noteId); } } addAll(notes) { for (const note of notes) { this.add(note); } } hasNote(note) { return this.hasNoteId(note.noteId); } hasNoteId(noteId) { return this.noteIdSet.has(noteId); } mergeIn(anotherNoteSet) { for (const note of anotherNoteSet.notes) { if (!this.noteIdSet.has(note.noteId)) { this.noteIdSet.add(note.noteId); this.notes.push(note); } } } minus(anotherNoteSet) { const newNoteSet = new NoteSet(); for (const note of this.notes) { if (!anotherNoteSet.hasNoteId(note.noteId)) { newNoteSet.add(note); } } return newNoteSet; } intersection(anotherNoteSet) { const newNoteSet = new NoteSet(); for (const note of this.notes) { if (anotherNoteSet.hasNote(note)) { newNoteSet.add(note); } } return newNoteSet; } } module.exports = NoteSet;