From a0b2003c65b164d9606f0c8338ca0fa5a46dd46c Mon Sep 17 00:00:00 2001 From: hypercross Date: Sat, 25 Apr 2026 17:58:16 +0800 Subject: [PATCH] refactor(samples/tic-tac-toe): simplify Client implementation Remove generic EntityMap and TriggerMap types in favor of explicit selector methods. This simplifies the Client class by removing unnecessary interface implementations and conditional logic in selectors. --- src/samples/tic-tac-toe.ts | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/src/samples/tic-tac-toe.ts b/src/samples/tic-tac-toe.ts index ba13d68..844ac97 100644 --- a/src/samples/tic-tac-toe.ts +++ b/src/samples/tic-tac-toe.ts @@ -1,7 +1,7 @@ import { Part } from "@/core/part"; import { createRegion, Region } from "@/core/region"; import { createPromptDef, IGameContext } from "@/core/game"; -import { BaseGameClient, GameClient } from "@/core/game-client"; +import { BaseGameClient } from "@/core/game-client"; import { createMiddlewareChain } from "@/utils/middleware"; const BOARD_SIZE = 3; @@ -186,14 +186,7 @@ export async function placePiece( }); } -type EntityMap = { parts: TicTacToePart; board: Region }; -type TriggerMap = { - turn: { player: PlayerType; turn: number }; -}; -export class Client - extends BaseGameClient - implements GameClient -{ +export class Client extends BaseGameClient { private onTurn = createMiddlewareChain( async (ctx: { player: PlayerType; turn: number }) => { return await turn(this._context, ctx.player, ctx.turn); @@ -225,22 +218,13 @@ export class Client return game.value; } - select( - type: K, - id: string, - callback: (t: EntityMap[K]) => void, - ): () => void { - if (type === "parts") - return this.assignSelector((state) => state.parts[id], callback); - return function () {}; + selectPart(id: string, callback: (t: TicTacToePart) => void): () => void { + return this.assignSelector((state) => state.parts[id], callback); } - use( - trigger: K, - callback: (ctx: TriggerMap[K], next: () => Promise) => Promise, - ): () => void { - if (trigger === "turn") { - return this.onTurn.use(callback); - } - return function () {}; + selectTurn(callback: (turns: number) => void): () => void { + return this.assignSelector((s) => s.turn, callback); + } + selectCurrentPlayer(callback: (player: PlayerType) => void) { + return this.assignSelector((s) => s.currentPlayer, callback); } }