There is my implementation in typescript:
export class FlagEnumService { constructor(private value: number = 0) { } public get() { return this.value; } public set(value: number): this { this.value = value; return this; } public has(key: number): boolean { return !!(this.value & key); } public add(key: number): this { this.value |= key; return this; } public delete(key: number): this { this.value &= ~key; return this; } public toggle(key: number): this { this.has(key) ? this.delete(key) : this.add(key); return this; } }
And tests for clarification
import { FlagEnumService } from './flag-enum.service'; enum Test { None = 0, First = 1, Second = 2, Third = 4, Four = 8 } describe('FlagEnumService', () => { let service: FlagEnumService; beforeEach(() => service = new FlagEnumService()); it('should create with initial value', () => { service = new FlagEnumService(Test.First); expect(service.get()).toBe(Test.First); }); it('should return true if has flag', () => { service = new FlagEnumService(Test.First); expect(service.has(Test.First)).toBe(true); }); it('should return false if doesn\'t have flag', () => { service = new FlagEnumService(Test.First); expect(service.has(Test.Second)).toBe(false); }); it('should add', () => { expect(service.add(Test.First).add(Test.Second).get()).toBe(Test.First + Test.Second); }); it('should not add the same value twice', () => { expect(service.add(Test.First).add(Test.First).get()).toBe(Test.First); }); it('should remove', () => { expect( service .add(Test.First) .add(Test.Second) .delete(Test.Second) .get() ) .toBe(Test.First); }); it('should return 0 when add then remove the same value', () => { expect(service.add(Test.First).delete(Test.First).get()).toBe(0); }); it('should not remove not added values', () => { expect(service.add(Test.First).delete(Test.Second).get()).toBe(Test.First); }); });