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

mol-state: wip, tweak builder

parent f6ef6427
No related branches found
No related tags found
No related merge requests found
...@@ -18,6 +18,7 @@ export interface Transformer<A extends StateObject = StateObject, B extends Stat ...@@ -18,6 +18,7 @@ export interface Transformer<A extends StateObject = StateObject, B extends Stat
export namespace Transformer { export namespace Transformer {
export type Id = string & { '@type': 'transformer-id' } 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 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 type ControlsFor<Props> = { [P in keyof Props]?: any }
export interface Definition<A extends StateObject = StateObject, B extends StateObject = StateObject, P = unknown> { export interface Definition<A extends StateObject = StateObject, B extends StateObject = StateObject, P = unknown> {
......
...@@ -8,6 +8,7 @@ import { ImmutableTree } from '../util/immutable-tree'; ...@@ -8,6 +8,7 @@ import { ImmutableTree } from '../util/immutable-tree';
import { TransformTree } from './tree'; import { TransformTree } from './tree';
import { StateObject } from '../object'; import { StateObject } from '../object';
import { Transform } from './transform'; import { Transform } from './transform';
import { Transformer } from '../transformer';
export interface StateTreeBuilder { export interface StateTreeBuilder {
getTree(): TransformTree getTree(): TransformTree
...@@ -24,6 +25,7 @@ export namespace StateTreeBuilder { ...@@ -24,6 +25,7 @@ export namespace StateTreeBuilder {
export class Root implements StateTreeBuilder { export class Root implements StateTreeBuilder {
private state: State; 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); } 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); } toRoot<A extends StateObject>() { return new To<A>(this.state, this.state.tree.rootRef as any); }
getTree(): TransformTree { return this.state.tree.asImmutable(); } getTree(): TransformTree { return this.state.tree.asImmutable(); }
...@@ -31,7 +33,8 @@ export namespace StateTreeBuilder { ...@@ -31,7 +33,8 @@ export namespace StateTreeBuilder {
} }
export class To<A extends StateObject> implements 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); this.state.tree.add(this.ref, t);
return new To(this.state, t.ref); return new To(this.state, t.ref);
} }
......
...@@ -82,8 +82,8 @@ export async function testState() { ...@@ -82,8 +82,8 @@ export async function testState() {
const tree = state.definition.tree; const tree = state.definition.tree;
const builder = StateTreeBuilder.create(tree) const builder = StateTreeBuilder.create(tree)
builder.toRoot<Root>() builder.toRoot<Root>()
.apply(CreateSquare.apply({ a: 10 }, { ref: 'square' })) .apply(CreateSquare, { a: 10 }, { ref: 'square' })
.apply(CaclArea.apply()); .apply(CaclArea);
const tree1 = builder.getTree(); const tree1 = builder.getTree();
printTTree(tree1); printTTree(tree1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment