export class EnumType<T> {
    public readonly name: string;
    public readonly values: ReadonlyArray<T>;

    public constructor(name: string, values: ReadonlyArray<T>) {
        this.name = name;
        this.values = [...values];
    }

    public intersect(b: ReadonlyArray<T>): EnumType<T> {
        const values = this.values.filter((value: T) => b.indexOf(value) >= 0);
        return new EnumType<T>(this.name, values);
    }

    public complement(b: ReadonlyArray<T>): EnumType<T> {
        const values = this.values.filter((value: T) => b.indexOf(value) < 0);
        return new EnumType<T>(this.name, values);
    }
}
