block.ts 909 B

123456789101112131415161718192021222324
  1. /*
  2. * Copyright (c) 2017 molio contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Category, UndefinedCategory } from './category'
  7. export abstract class Block<T> {
  8. abstract getCategory(name: string): T|undefined
  9. abstract addCategory(category: T): void
  10. getCategoriesFromSchema<T extends object> (schema: T) {
  11. return BlockCategories(this, schema)
  12. }
  13. }
  14. export type BlockCategories<Categories extends string> = { readonly [name in Categories]: Category }
  15. export function BlockCategories<T extends object>(block: Block<any> | undefined, categories: T): BlockCategories<keyof T> {
  16. const ret = Object.create(null);
  17. if (!block) for (const c of Object.keys(categories)) ret[c] = UndefinedCategory;
  18. else for (const c of Object.keys(categories)) ret[c] = block.getCategory(c);
  19. return ret;
  20. }