change order of operations, add originalContext param to SideEffects

This commit is contained in:
Avraham Sakal
2023-05-17 09:39:58 -04:00
parent 7c4b48c391
commit 37aa932956
3 changed files with 76 additions and 64 deletions
+4 -4
View File
@@ -1,7 +1,7 @@
import { Machine, State, On, SideEffect, Goto, Spawn, Unspawn, Interpreter, Interpreter_T, send, Event_T } from '../index';
import { Machine, State, On, SideEffect, Goto, Interpreter, send, SideEffectFunction_T } from '../index';
const beginTimer = (ctx:C, e:Event_T, self:Interpreter_T)=>{ setTimeout(()=>{ send(self, ['timer-finished',null]); }, 800); };
const log = (ctx:C, e:Event_T, self:Interpreter_T)=>{ console.log(self.state); };
const beginTimer : SideEffectFunction_T<C> = (ctx, e, self)=>{ setTimeout(()=>{ send(self, ['timer-finished',null]); }, 800); };
const log : SideEffectFunction_T<C> = (ctx, e, self)=>{ console.log(self.state); };
type S =
| 'green'
@@ -43,4 +43,4 @@ const machine =
),
);
const actor = Interpreter(machine, {context:{}});
const actor = Interpreter<C>(machine, {context:{}});
+29 -20
View File
@@ -1,15 +1,24 @@
import { Machine, State, On, SideEffect, Goto, Spawn, Unspawn, Interpreter, Interpreter_T, send, Event_T, Context } from '../index';
import { Machine, State, On, SideEffect, Goto, Spawn, Unspawn, Interpreter, Interpreter_T, send, Event_T, Context, SideEffectFunction_T } from '../index';
const wait = (ms:number)=>new Promise((resolve)=>{ setTimeout(()=>{ resolve(1); }, ms); });
const makeRequest = (ctx,e,self)=>{ send(ctx.serverActor, ['received-request',self]); };
const sendResponse = (ctx,e,self)=>{ send(ctx.clientActor, ['received-response',self]); };
const startTimer = async (ctx,e,self)=>{ await wait(1500); send(self, ['timer-finished',null]); }
const log = (ctx, e, self:Interpreter_T)=>{ console.log(self.state, ctx); };
const makeRequest : SideEffectFunction_T<Cc> = (ctx,e,self)=>{ send(ctx.serverActor, ['received-request',self]); };
const sendResponse : SideEffectFunction_T<Cs> = (ctx,e,self)=>{ send(ctx.clientActor, ['received-response',self]); };
const startTimer : SideEffectFunction_T<Cs> = async (ctx,e,self)=>{ await wait(1500); send(self, ['timer-finished',null]); }
const log : SideEffectFunction_T<Cc|Cs> = (ctx, e, self)=>{ console.log(self.state, ctx); };
type Cc = {
requestsMade: number;
responsesReceived: number;
serverActor: Interpreter_T<Cs>;
};
type Cs = {
clientActor: Interpreter_T<Cc>
};
const client =
Machine(
State('idle',
On('entry',
Machine<Cc>(
State<Cc>('idle',
On<Cc>('entry',
SideEffect(log),
),
On('server-created',
@@ -17,30 +26,30 @@ const client =
Goto('making-request')
)
),
State('making-request',
On('entry',
State<Cc>('making-request',
On<Cc>('entry',
SideEffect(log),
SideEffect(makeRequest),
Context((ctx)=>({...ctx, requestsMade: ctx.requestsMade+1})),
Context<Cc>((ctx)=>({...ctx, requestsMade: ctx.requestsMade+1})),
Goto('awaiting-response')
),
),
State('awaiting-response',
On('entry',
State<Cc>('awaiting-response',
On<Cc>('entry',
SideEffect(log),
),
On('received-response',
On<Cc>('received-response',
SideEffect(log),
Context((ctx)=>({...ctx, responsesReceived: ctx.responsesReceived+1})),
Context<Cc>((ctx)=>({...ctx, responsesReceived: ctx.responsesReceived+1})),
Goto('making-request')
),
),
);
const server =
Machine(
State('awaiting-request',
On('entry',
Machine<Cs>(
State<Cs>('awaiting-request',
On<Cs>('entry',
SideEffect(log),
),
On('received-request',
@@ -48,8 +57,8 @@ const server =
Goto('sending-response')
),
),
State('sending-response',
On('entry',
State<Cs>('sending-response',
On<Cs>('entry',
SideEffect(log),
SideEffect(startTimer)
),