Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V5: Simplify Interpreter + Dev Tools integration #1203

Merged
merged 12 commits into from
Jun 2, 2020
Prev Previous commit
Next Next commit
Remove unused features
davidkpiano committed May 22, 2020
commit 08bdc42981bf6a5e691b110858b1eb9e4bebf8b1
4 changes: 2 additions & 2 deletions packages/core/src/MachineNode.ts
Original file line number Diff line number Diff line change
@@ -257,7 +257,7 @@ export class MachineNode<
* The initial State instance, which includes all actions to be executed from
* entering the initial state.
*/
public get initialState(): State<TContext, TEvent, TStateSchema, TTypestate> {
public get initialState(): State<TContext, TEvent> {
this._init();
const nextState = resolveMicroTransition(this, [], undefined, undefined);
return macrostep(nextState, null as any, this);
@@ -268,7 +268,7 @@ export class MachineNode<
*
* @param self The `ActorRef` instance of this machine, if any.
*/
public getInitialState(self?: ActorRef<TEvent>) {
public getInitialState(self?: ActorRef<TEvent>): State<TContext, TEvent> {
this._init();
const nextState = resolveMicroTransition(
this,
59 changes: 4 additions & 55 deletions packages/core/src/interpreter.ts
Original file line number Diff line number Diff line change
@@ -53,11 +53,6 @@ export type StateListener<
event: TEvent
) => void;

export type ContextListener<TContext = DefaultContext> = (
context: TContext,
prevContext: TContext | undefined
) => void;

export type EventListener<TEvent extends EventObject = EventObject> = (
event: TEvent
) => void;
@@ -114,12 +109,9 @@ export class Interpreter<
private listeners: Set<
StateListener<TContext, TEvent, TStateSchema, TTypestate>
> = new Set();
private contextListeners: Set<ContextListener<TContext>> = new Set();
private stopListeners: Set<Listener> = new Set();
private errorListeners: Set<ErrorListener> = new Set();
private doneListeners: Set<EventListener> = new Set();
private eventListeners: Set<EventListener> = new Set();
private sendListeners: Set<EventListener> = new Set();
private logger: (...args: any[]) => void;
/**
* Whether the service is started.
@@ -222,24 +214,10 @@ export class Interpreter<
this.devTools.send(_event.data, state);
}

// Execute listeners
if (state.event) {
for (const listener of this.eventListeners) {
listener(state.event);
}
}

for (const listener of this.listeners) {
listener(state, state.event);
}

for (const contextListener of this.contextListeners) {
contextListener(
this.state.context,
this.state.history ? this.state.history.context : undefined
);
}

const isDone = isInFinalState(state.configuration || [], this.machine);

if (this.state.configuration && isDone) {
@@ -332,16 +310,6 @@ export class Interpreter<
};
}

/**
* Adds a context listener that is notified whenever the state context changes.
* @param listener The context listener
*/
public onChange(
listener: ContextListener<TContext>
): Interpreter<TContext, TStateSchema, TEvent> {
this.contextListeners.add(listener);
return this;
}
/**
* Adds a listener that is notified when the machine is stopped.
* @param listener The listener
@@ -376,11 +344,8 @@ export class Interpreter<
listener: (...args: any[]) => void
): Interpreter<TContext, TStateSchema, TEvent> {
this.listeners.delete(listener);
this.eventListeners.delete(listener);
this.sendListeners.delete(listener);
this.stopListeners.delete(listener);
this.doneListeners.delete(listener);
this.contextListeners.delete(listener);
return this;
}
/**
@@ -435,9 +400,7 @@ export class Interpreter<
listener();
this.stopListeners.delete(listener);
}
for (const listener of this.contextListeners) {
this.contextListeners.delete(listener);
}
this.doneListeners.clear();
for (const listener of this.doneListeners) {
this.doneListeners.delete(listener);
}
@@ -472,10 +435,10 @@ export class Interpreter<
*/
public send = (
event: SingleOrArray<Event<TEvent>> | SCXML.Event<TEvent>
): State<TContext, TEvent, TStateSchema, TTypestate> => {
): void => {
if (isArray(event)) {
this.batch(event);
return this.state;
return;
}

const _event = toSCXMLEvent(event);
@@ -492,7 +455,7 @@ export class Interpreter<
)}`
);
}
return this.state;
return;
}

if (
@@ -529,9 +492,6 @@ export class Interpreter<

this.update(nextState, _event);
});

return this._state!; // TODO: deprecate (should return void)
// tslint:disable-next-line:semicolon
};

private batch(events: Array<TEvent | TEvent['type']>): void {
@@ -583,17 +543,6 @@ export class Interpreter<
});
}

/**
* Returns a send function bound to this interpreter instance.
*
* @param event The event to be sent by the sender.
*/
public sender(
event: Event<TEvent>
): () => State<TContext, TEvent, TStateSchema, TTypestate> {
return this.send.bind(this, event);
}

private sendTo(
event: SCXML.Event<AnyEventObject>,
to: string | number | ActorRef<any>
10 changes: 7 additions & 3 deletions packages/core/src/stateUtils.ts
Original file line number Diff line number Diff line change
@@ -1672,12 +1672,16 @@ function resolveActionsAndContext<TContext, TEvent extends EventObject>(
};
}

export function macrostep<TContext, TEvent extends EventObject>(
state: State<TContext, TEvent, any, Typestate<TContext>>,
export function macrostep<
TContext,
TEvent extends EventObject,
TTypestate extends Typestate<TContext>
>(
state: State<TContext, TEvent, any, TTypestate>,
event: Event<TEvent> | SCXML.Event<TEvent> | null,
machine: MachineNode<TContext, any, TEvent, any>,
service?: ActorRef<TEvent>
): State<TContext, TEvent> {
): typeof state {
// Assume the state is at rest (no raised events)
// Determine the next state based on the next microstep
const nextState =