Skip to content
Snippets Groups Projects
Commit ac40a2b8 authored by David Sehnal's avatar David Sehnal
Browse files

Data model

parent c3a5760d
No related branches found
No related tags found
No related merge requests found
...@@ -9,16 +9,28 @@ export interface File { ...@@ -9,16 +9,28 @@ export interface File {
readonly blocks: ReadonlyArray<Block> readonly blocks: ReadonlyArray<Block>
} }
export function File(blocks: ArrayLike<Block>, name?: string): File {
return { name, blocks: blocks as any };
}
export interface Block { export interface Block {
readonly header?: string, readonly header?: string,
readonly categories: { readonly [name: string]: Category } readonly categories: { readonly [name: string]: Category }
} }
export function Block(categories: { readonly [name: string]: Category }, header?: string): Block {
return { header, categories };
}
export interface Category { export interface Category {
readonly rowCount: number, readonly rowCount: number,
getField(name: string): Field | undefined getField(name: string): Field | undefined
} }
export function Category(rowCount: number, fields: { [name: string]: Field }): Category {
return { rowCount, getField(name) { return fields[name]; } };
}
export namespace Category { export namespace Category {
export const Empty: Category = { rowCount: 0, getField(name: string) { return void 0; } }; export const Empty: Category = { rowCount: 0, getField(name: string) { return void 0; } };
} }
...@@ -29,7 +41,7 @@ export const enum ValuePresence { ...@@ -29,7 +41,7 @@ export const enum ValuePresence {
Unknown = 2 Unknown = 2
} }
export type FieldArray = number[] | Float32Array | Float64Array | Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array export type FieldArray = string[] | number[] | Float32Array | Float64Array | Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array
/** /**
* Implementation note: * Implementation note:
......
...@@ -23,10 +23,11 @@ import * as Data from './data' ...@@ -23,10 +23,11 @@ import * as Data from './data'
export type BlockDefinition = { [category: string]: CategoryDefinition } export type BlockDefinition = { [category: string]: CategoryDefinition }
export type CategoryDefinition = { '@alias'?: string } & { [field: string]: Field.Schema<any> } export type CategoryDefinition = { '@alias'?: string } & { [field: string]: Field.Schema<any> }
export type Schema<Definition extends BlockDefinition> = Block<{ [C in keyof Definition]: Category<{ [F in keyof Definition[C]]: Field<Definition[C][F]['type']> }> }> export type BlockInstance<Definition extends BlockDefinition> = Block<{ [C in keyof Definition]: CategoryInstance<Definition[C]> }>
export type CategoryInstance<Definition extends CategoryDefinition> = Category<{ [F in keyof Definition]: Field<Definition[F]['type']> }>
export function apply<T extends BlockDefinition>(schema: T, block: Data.Block): Schema<T> { export function apply<Definition extends BlockDefinition>(schema: Definition, block: Data.Block): BlockInstance<Definition> {
return createBlock(schema, block) as Schema<T>; return createBlock(schema, block) as BlockInstance<Definition>;
} }
export type Block<Categories> = Categories & { export type Block<Categories> = Categories & {
......
...@@ -34,17 +34,8 @@ function Field(values: any[]): Data.Field { ...@@ -34,17 +34,8 @@ function Field(values: any[]): Data.Field {
} }
} }
class Category implements Data.Category { const testBlock = Data.Block({
getField(name: string) { return this.fields[name]; } 'atoms': Data.Category(2, {
constructor(public rowCount: number, private fields: any) { }
}
class Block implements Data.Block {
constructor(public categories: { readonly [name: string]: Data.Category }, public header?: string) { }
}
const testBlock = new Block({
'atoms': new Category(2, {
x: Field([1, 2]), x: Field([1, 2]),
name: Field(['C', 'O']) name: Field(['C', 'O'])
}) })
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment