/* eslint-disable @typescript-eslint/no-namespace */ import { SwarmProtocol } from '@actyx/machine-runner' import { MachineEvent } from '@actyx/machine-runner' const pickUp = MachineEvent.design('pickUp').withPayload<{ id: string chassisId: string fromPos: string }>() const deliver = MachineEvent.design('deliver').withPayload<{ toPos: string }>() const reserved = MachineEvent.design('reserved').withPayload<{ id: string; score: number }>() const confirmed = MachineEvent.design('confirmed').withPayload<{ delay: number }>() const atSource = MachineEvent.design('atSource').withoutPayload() const placed = MachineEvent.design('placed').withoutPayload() const atDestination = MachineEvent.design('atDestination').withoutPayload() const taken = MachineEvent.design('taken').withoutPayload() const transportOrderEvents = [ pickUp, deliver, reserved, confirmed, atSource, placed, atDestination, taken, ] as const const transportOrder = SwarmProtocol.make('transportOrder', transportOrderEvents) const TOForRobot = transportOrder.makeMachine('robot') namespace ForRobot { type Order = { id: string; chassisId: string; fromPos: string; toPos: string } type OrderScores = Order & { scores: { robot: string; score: number }[] } export const Initial = TOForRobot.designEmpty('Initial').finish() export const Open = TOForRobot.designState('Open').withPayload().finish() export const Assigned = TOForRobot.designState('Assigned').withPayload().finish() export const Transporting = TOForRobot.designState('Transporting').withPayload().finish() export const Done = TOForRobot.designEmpty('Done').finish() Initial.react([pickUp, deliver], Open, (_ctx, p, d) => ({ ...p.payload, ...d.payload, scores: [], })) Open.react([reserved], Open, (ctx, r) => { ctx.self.scores.push(r.payload) return ctx.self }) }