diff --git a/src/data/data.ts b/src/data/data.ts index 49452e5e347973ab66b1b4ce61bd1b0deb645217..5f1c08cb96510feda4ed6d94620d3fc5dc985b5a 100644 --- a/src/data/data.ts +++ b/src/data/data.ts @@ -9,16 +9,28 @@ export interface File { readonly blocks: ReadonlyArray<Block> } +export function File(blocks: ArrayLike<Block>, name?: string): File { + return { name, blocks: blocks as any }; +} + export interface Block { readonly header?: string, readonly categories: { readonly [name: string]: Category } } +export function Block(categories: { readonly [name: string]: Category }, header?: string): Block { + return { header, categories }; +} + export interface Category { readonly rowCount: number, 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 const Empty: Category = { rowCount: 0, getField(name: string) { return void 0; } }; } @@ -29,7 +41,7 @@ export const enum ValuePresence { 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: diff --git a/src/data/schema.ts b/src/data/schema.ts index 69184e0b5bd3444c0cfe7f1aaa5c44cdd6cdf577..83f9a98906db64a4a70fee340ff1aa70e7570a81 100644 --- a/src/data/schema.ts +++ b/src/data/schema.ts @@ -23,10 +23,11 @@ import * as Data from './data' export type BlockDefinition = { [category: string]: CategoryDefinition } 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> { - return createBlock(schema, block) as Schema<T>; +export function apply<Definition extends BlockDefinition>(schema: Definition, block: Data.Block): BlockInstance<Definition> { + return createBlock(schema, block) as BlockInstance<Definition>; } export type Block<Categories> = Categories & { diff --git a/src/data/spec/schema.spec.ts b/src/data/spec/schema.spec.ts index 8ca0e7c8a5a3731315d6981e68e4f0f5e623ac98..1918453bf6ea97c8d0b55f17321bd8b74ffd857b 100644 --- a/src/data/spec/schema.spec.ts +++ b/src/data/spec/schema.spec.ts @@ -34,17 +34,8 @@ function Field(values: any[]): Data.Field { } } -class Category implements Data.Category { - getField(name: string) { return this.fields[name]; } - 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, { +const testBlock = Data.Block({ + 'atoms': Data.Category(2, { x: Field([1, 2]), name: Field(['C', 'O']) }) diff --git a/src/reader/common/data.ts b/src/reader/common/data.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/reader/gro/parser.ts b/src/reader/gro/parser.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/reader/gro/schema.ts b/src/reader/gro/schema.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391