export default class Bag { private items = new Map>() serialize(): { [name: string]: Array } { const result = {} this.items.forEach((value: T[], key) => { // @ts-ignore result[key] = value }) return result } static fromObject(items: object): Bag { const result = new Bag() Object.keys(items).forEach((key) => { // @ts-ignore result.addMany(key as K, items[key]) }) return result } add(key: string, value: T): this { let messages: Array | undefined = this.items.get(key) if (messages === undefined) { messages = [] } if (!messages.includes(value)) { messages.push(value) } this.items.set(key, messages) return this } addMany(key: string, values: Array): this { values.forEach((value: T) => { this.add(key, value) }) return this } has(key: string): boolean { return this.items.has(key) } first(key: string): T | undefined { if (this.has(key)) { return this.get(key)[0] ?? undefined } return undefined } get(key: string): Array { const result = this.items.get(key) if (result === undefined) { return [] } return result } size(): number { return this.items.size } }