type allergyMap = { [key: number]: string };

let allergies:allergyMap = {
    1: 'eggs',
    2: 'peanuts',
    4: 'shellfish',
    8: 'strawberries',
    16: 'tomatoes',
    32: 'chocolate',
    64: 'pollen',
    128: 'cats',
};

export class Allergies {
    private ids = 0;

    constructor(allergenIndex: number) {
        allergenIndex &= 255;
        let i = 1;
        while (i <= 128) {
            if ((i & allergenIndex) !== 0) {
                this.ids |= i;
            }
            i <<= 1;
        }
    }

    public list(): string[] {
        let i = 1;
        let res: string[] = [];
        while (i <= 128) {
            if ((i & this.ids) !== 0) {
                res.push(allergies[i])
            }
            i <<= 1;
        }
        return res;
    }

    public allergicTo(allergen: string): boolean {
        return this.list().indexOf(allergen) >= 0;
    }
}
