diff --git a/src/mol-state/transformer.ts b/src/mol-state/transformer.ts index a4a824c56f41dec056b0f107942115254525874e..9f94340d18785227fefab4cdfbd9c1000f8792bb 100644 --- a/src/mol-state/transformer.ts +++ b/src/mol-state/transformer.ts @@ -18,6 +18,7 @@ export interface Transformer<A extends StateObject = StateObject, B extends Stat export namespace Transformer { export type Id = string & { '@type': 'transformer-id' } export type Params<T extends Transformer<any, any, any>> = T extends Transformer<any, any, infer P> ? P : unknown; + export type To<T extends Transformer<any, any, any>> = T extends Transformer<any, infer B, any> ? B : unknown; export type ControlsFor<Props> = { [P in keyof Props]?: any } export interface Definition<A extends StateObject = StateObject, B extends StateObject = StateObject, P = unknown> { diff --git a/src/mol-state/tree/builder.ts b/src/mol-state/tree/builder.ts index 4d1a70dc3c7e345335a7cec307426862ce7e1c42..4ed5632bc555c864c0ca194622bd85e4de4f6228 100644 --- a/src/mol-state/tree/builder.ts +++ b/src/mol-state/tree/builder.ts @@ -8,6 +8,7 @@ import { ImmutableTree } from '../util/immutable-tree'; import { TransformTree } from './tree'; import { StateObject } from '../object'; import { Transform } from './transform'; +import { Transformer } from '../transformer'; export interface StateTreeBuilder { getTree(): TransformTree @@ -24,6 +25,7 @@ export namespace StateTreeBuilder { export class Root implements StateTreeBuilder { private state: State; + //to<A extends StateObject>(ref: Transform.Ref) { return new To<A>(this.state, ref); } to<A extends StateObject>(ref: Transform.Ref) { return new To<A>(this.state, ref); } toRoot<A extends StateObject>() { return new To<A>(this.state, this.state.tree.rootRef as any); } getTree(): TransformTree { return this.state.tree.asImmutable(); } @@ -31,7 +33,8 @@ export namespace StateTreeBuilder { } export class To<A extends StateObject> implements StateTreeBuilder { - apply<B extends StateObject>(t: Transform<A, B, any>): To<B> { + apply<T extends Transformer<A, any, any>>(tr: T, params?: Transformer.Params<T>, props?: Partial<Transform.Props>): To<Transformer.To<T>> { + const t = tr.apply(params, props); this.state.tree.add(this.ref, t); return new To(this.state, t.ref); } diff --git a/src/perf-tests/state.ts b/src/perf-tests/state.ts index 72225c541f519c41e0a5c01fe2774752449bb41a..af121c96d5a6e48b508872bf141e8e7495be1188 100644 --- a/src/perf-tests/state.ts +++ b/src/perf-tests/state.ts @@ -82,8 +82,8 @@ export async function testState() { const tree = state.definition.tree; const builder = StateTreeBuilder.create(tree) builder.toRoot<Root>() - .apply(CreateSquare.apply({ a: 10 }, { ref: 'square' })) - .apply(CaclArea.apply()); + .apply(CreateSquare, { a: 10 }, { ref: 'square' }) + .apply(CaclArea); const tree1 = builder.getTree(); printTTree(tree1);