From 60e43d0aef13f078771ad68ad4ce6a80d69c8c5f Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Wed, 17 Oct 2018 18:12:13 +0200 Subject: [PATCH] mol-state: wip --- src/mol-state/model/reconcile.ts | 12 ------------ src/mol-state/{model => }/object.ts | 8 ++++++-- src/mol-state/state.ts | 15 +++++++++++++++ src/mol-state/{tree => }/transformer.ts | 11 +++++++---- src/mol-state/transformer/manager.ts | 7 +++++++ src/mol-state/tree/action.ts | 7 +++++++ .../{model/tree.ts => tree/transation.ts} | 4 +--- src/mol-state/tree/transform.ts | 18 ++++++++++++------ src/mol-state/util/immutable-tree.ts | 2 ++ 9 files changed, 57 insertions(+), 27 deletions(-) delete mode 100644 src/mol-state/model/reconcile.ts rename src/mol-state/{model => }/object.ts (78%) create mode 100644 src/mol-state/state.ts rename src/mol-state/{tree => }/transformer.ts (87%) create mode 100644 src/mol-state/transformer/manager.ts create mode 100644 src/mol-state/tree/action.ts rename src/mol-state/{model/tree.ts => tree/transation.ts} (83%) diff --git a/src/mol-state/model/reconcile.ts b/src/mol-state/model/reconcile.ts deleted file mode 100644 index 16b439438..000000000 --- a/src/mol-state/model/reconcile.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. - * - * @author David Sehnal <david.sehnal@gmail.com> - */ - -import { TransformTree } from '../tree/tree'; -import { ModelTree } from './tree'; - -export function reconcileTree(transform: TransformTree, model: ModelTree, root?: number) { - // TODO -} \ No newline at end of file diff --git a/src/mol-state/model/object.ts b/src/mol-state/object.ts similarity index 78% rename from src/mol-state/model/object.ts rename to src/mol-state/object.ts index 9665765e4..391f1e1d0 100644 --- a/src/mol-state/model/object.ts +++ b/src/mol-state/object.ts @@ -4,9 +4,11 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -export interface StateObject<T = any> { +/** A mutable state object */ +export interface StateObject<T extends StateObject.Type = any> { '@type': T, - readonly label: string + label: string, + version: number } export namespace StateObject { @@ -26,4 +28,6 @@ export namespace StateObject { // The object is currently being created Processing } + + export type Type = string & { '@type': 'state-object-type' } } \ No newline at end of file diff --git a/src/mol-state/state.ts b/src/mol-state/state.ts new file mode 100644 index 000000000..0dc9aa8e4 --- /dev/null +++ b/src/mol-state/state.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author David Sehnal <david.sehnal@gmail.com> + */ + +import { StateObject } from './object'; +import { TransformTree } from './tree/tree'; +import { Transform } from './tree/transform'; + +export interface State { + tree: TransformTree, + objects: Map<Transform.InstanceId, StateObject>, + history: TransformTree[] +} \ No newline at end of file diff --git a/src/mol-state/tree/transformer.ts b/src/mol-state/transformer.ts similarity index 87% rename from src/mol-state/tree/transformer.ts rename to src/mol-state/transformer.ts index 29d1f97c7..e621fcf49 100644 --- a/src/mol-state/tree/transformer.ts +++ b/src/mol-state/transformer.ts @@ -5,16 +5,16 @@ */ import { Task } from 'mol-task'; -import { StateObject } from '../model/object'; -import { TransformContext } from './context'; +import { StateObject } from './object'; +import { TransformContext } from './tree/context'; export interface Transformer<A extends StateObject, B extends StateObject, P = any> { readonly id: Transformer.Id, readonly name: string, readonly namespace: string, readonly description?: string, - readonly from: StateObject.TypeOf<A>[], - readonly to: StateObject.TypeOf<B>[], + readonly from: StateObject.Type[], + readonly to: StateObject.Type[], /** * Apply the actual transformation. It must be pure (i.e. with no side effects). @@ -40,6 +40,9 @@ export interface Transformer<A extends StateObject, B extends StateObject, P = a /** Check the parameters and return a list of errors if the are not valid. */ validateParams?(a: A, params: P, context: TransformContext): string[] | undefined, + /** Optional custom parameter equality. Use deep structural equal by default. */ + areParamsEqual?(oldParams: P, newParams: P): boolean, + /** Test if the transform can be applied to a given node */ isApplicable?(a: A, context: TransformContext): boolean, diff --git a/src/mol-state/transformer/manager.ts b/src/mol-state/transformer/manager.ts new file mode 100644 index 000000000..fc0450955 --- /dev/null +++ b/src/mol-state/transformer/manager.ts @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author David Sehnal <david.sehnal@gmail.com> + */ + +// TODO: index for registered transformers \ No newline at end of file diff --git a/src/mol-state/tree/action.ts b/src/mol-state/tree/action.ts new file mode 100644 index 000000000..f5216c5ab --- /dev/null +++ b/src/mol-state/tree/action.ts @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author David Sehnal <david.sehnal@gmail.com> + */ + +// TODO: tree actions: Add, Update, Delete; action queue \ No newline at end of file diff --git a/src/mol-state/model/tree.ts b/src/mol-state/tree/transation.ts similarity index 83% rename from src/mol-state/model/tree.ts rename to src/mol-state/tree/transation.ts index 601f3be43..7c7fe8338 100644 --- a/src/mol-state/model/tree.ts +++ b/src/mol-state/tree/transation.ts @@ -4,6 +4,4 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -export interface ModelTree { - -} \ No newline at end of file +// TODO \ No newline at end of file diff --git a/src/mol-state/tree/transform.ts b/src/mol-state/tree/transform.ts index fd3569665..e0ea9dd2a 100644 --- a/src/mol-state/tree/transform.ts +++ b/src/mol-state/tree/transform.ts @@ -4,24 +4,30 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -import { Transform } from './transform'; -import { StateObject } from '../model/object'; -import { Transformer } from './transformer'; +import { StateObject } from '../object'; +import { Transformer } from '../transformer'; export interface Transform<A extends StateObject, B extends StateObject, P = any> { - readonly instanceId: number, + readonly instanceId: Transform.InstanceId, readonly transformer: Transformer<A, B, P>, readonly props: Transform.Props, readonly transformerId: string, readonly params: P, - readonly ref: string, - readonly version: number, + readonly ref: string + // version is part of the tree } export namespace Transform { + export type InstanceId = number & { '@type': 'transform-instance-id' } + export interface Props { } + + export enum Flags { + // Indicates that the transform was generated by a behaviour and should not be automatically updated + Generated + } } \ No newline at end of file diff --git a/src/mol-state/util/immutable-tree.ts b/src/mol-state/util/immutable-tree.ts index e0d04147d..d0ca43c4f 100644 --- a/src/mol-state/util/immutable-tree.ts +++ b/src/mol-state/util/immutable-tree.ts @@ -6,6 +6,8 @@ import { Map as ImmutableMap, OrderedSet } from 'immutable'; +// TODO: use generic "node keys" instead of string + /** * An immutable tree where each node requires a unique reference. * Represented as an immutable map. -- GitLab