export interface CacheCollection<RecordType> {
    [key: string]: RecordType
}


export abstract class Cache<RecordType> {
    protected cache: CacheCollection<RecordType> = {};

    get(name: string): RecordType | null {
        const key = Cache.nameKey(name);

        if (key in this.cache) {
            return this.cache[key];
        }

        return null;
    }

    // tslint:disable-next-line: no-any
    abstract register(record: any): void;

    has(name: string): boolean {
        return (name in this.cache);
    }

    static nameKey(name: string): string {
        return name.toLowerCase();
    }
}