feat: 新增 GraphTracer 并重构 ArrayTracer 的初始化方式

- 新增 GraphTracer 及其类型定义,支持图的创建和操作命令
- 重构 ArrayTracer 的 create 函数,使用 walker/commit 模式替代直接的 array 参数,提高灵活性
- 更新类型导出和命令联合类型以包含 GraphTracer
- 调整示例代码以使用新的初始化方式
This commit is contained in:
2026-02-14 01:30:30 +08:00
parent 9d5a46129e
commit 4929ca496b
8 changed files with 160 additions and 7 deletions

View File

@@ -9,7 +9,12 @@ const controlTracer = createControlTracer({ description: 'ControlTracer' });
const arrayTracer = createArrayTracer({ const arrayTracer = createArrayTracer({
description: 'ArrayTracer', description: 'ArrayTracer',
array: [1, 2, 3], // array: [1, 2, 3],
walker: (commit) => {
commit(1);
commit(2);
commit(3);
},
}); });
arrayTracer.patch(0, 100); arrayTracer.patch(0, 100);

View File

@@ -1,15 +1,32 @@
import { getTracerContext } from '../context'; import { getTracerContext } from '../context';
import type { JsonValue } from '../types'; import type { JsonValue } from '../types';
interface ArrayTracerCreateOptions<T extends JsonValue[]> { interface BaseArrayTracerCreateOptions {
description?: string; description?: string;
array?: T;
} }
interface ArrayTracerCreateOptionsFromArray<
T extends JsonValue[],
> extends BaseArrayTracerCreateOptions {
array: T;
walker?: never;
}
interface ArrayTracerCreateOptionsFromWalker<
T extends JsonValue[],
> extends BaseArrayTracerCreateOptions {
array?: never;
walker: (commit: (item: T[number]) => void) => void;
}
type ArrayTracerCreateOptions<T extends JsonValue[]> =
| ArrayTracerCreateOptionsFromArray<T>
| ArrayTracerCreateOptionsFromWalker<T>;
export const createArrayTracer = <T extends JsonValue[]>( export const createArrayTracer = <T extends JsonValue[]>(
options: ArrayTracerCreateOptions<T>, options: ArrayTracerCreateOptions<T>,
) => { ) => {
const { description, array } = options; const { description, array, walker } = options;
const tracer = crypto.randomUUID(); const tracer = crypto.randomUUID();
// 优化:仅维护数组长度作为影子状态,这在 C++/Java 等强类型语言中也极易实现(仅需一个 int 变量) // 优化:仅维护数组长度作为影子状态,这在 C++/Java 等强类型语言中也极易实现(仅需一个 int 变量)

View File

@@ -0,0 +1,33 @@
import { getTracerContext } from '../context';
import type { GraphTracerGraph } from '../types';
interface GraphTracerCreateOptions {
description?: string;
graph?: GraphTracerGraph;
}
// 不要了,改为 walker/commit 方案
// TODO: 后续我们会添加创建图的辅助函数
// export const createGraphTracerHelper = () => {};
export const createGraphTracer = (options: GraphTracerCreateOptions) => {
const { description, graph } = options;
const tracer = crypto.randomUUID();
const { command } = getTracerContext();
command({
type: 'GraphTracer',
tracer: tracer,
action: 'create',
params: {
description: description ?? 'GraphTracer',
graph: graph ?? {
directed: false,
weighted: false,
nodes: [],
edges: [],
},
},
});
};

View File

@@ -1,3 +1,4 @@
export * from './array-tracer'; export * from './array-tracer';
export * from './control-tracer'; export * from './control-tracer';
export * from './graph-tracer';
export * from './log-tracer'; export * from './log-tracer';

View File

@@ -1,8 +1,10 @@
import type { ArrayTracerCommand } from './array-tracer'; import type { ArrayTracerCommand } from './array-tracer';
import type { ControlTracerCommand } from './control-tracer'; import type { ControlTracerCommand } from './control-tracer';
import type { GraphTracerCommand } from './graph-tracer';
import type { LogTracerCommand } from './log-tracer'; import type { LogTracerCommand } from './log-tracer';
export type TracerCommand = export type TracerCommand =
| ArrayTracerCommand
| LogTracerCommand | LogTracerCommand
| ControlTracerCommand; | ControlTracerCommand
| ArrayTracerCommand
| GraphTracerCommand;

View File

@@ -6,7 +6,7 @@ export type JsonValue =
| JsonValue[] | JsonValue[]
| { [key: string]: JsonValue }; | { [key: string]: JsonValue };
export type TracerType = 'ArrayTracer' | 'LogTracer' | 'ControlTracer'; export type TracerType = 'LogTracer' | 'ControlTracer' | 'ArrayTracer' | 'GraphTracer';
export type TracerId = ReturnType<typeof crypto.randomUUID>; export type TracerId = ReturnType<typeof crypto.randomUUID>;

View File

@@ -0,0 +1,94 @@
import type { BaseTracerCommand, JsonValue } from './common';
export type GraphTracerGraphNode = {
id: string;
value: JsonValue;
};
export type GraphTracerGraphEdge = {
source: string;
target: string;
weight: JsonValue;
};
export type GraphTracerGraph = {
directed: boolean;
weighted: boolean;
nodes: GraphTracerGraphNode[];
edges: GraphTracerGraphEdge[];
};
type BaseGraphTracerCommand = BaseTracerCommand & {
type: 'GraphTracer';
};
type GraphTracerCreateCommand = BaseGraphTracerCommand & {
action: 'create';
params: {
description: string;
graph: GraphTracerGraph;
};
};
type GraphTracerInsertCommand = BaseGraphTracerCommand & {
action: 'insert';
params: {};
};
type GraphTracerRemoveCommand = BaseGraphTracerCommand & {
action: 'remove';
params: {};
};
type GraphTracerUpdateCommand = BaseGraphTracerCommand & {
action: 'update';
params: {};
};
type GraphTracerConnectCommand = BaseGraphTracerCommand & {
action: 'connect';
params: {};
};
type GraphTracerDisconnectCommand = BaseGraphTracerCommand & {
action: 'disconnect';
params: {};
};
type GraphTracerWeightCommand = BaseGraphTracerCommand & {
action: 'weight';
params: {};
};
type GraphTracerVisitCommand = BaseGraphTracerCommand & {
action: 'visit';
params: {};
};
type GraphTracerLeaveCommand = BaseGraphTracerCommand & {
action: 'leave';
params: {};
};
type GraphTracerPickCommand = BaseGraphTracerCommand & {
action: 'pick';
params: {};
};
type GraphTracerDropCommand = BaseGraphTracerCommand & {
action: 'drop';
params: {};
};
export type GraphTracerCommand =
| GraphTracerCreateCommand
| GraphTracerInsertCommand
| GraphTracerRemoveCommand
| GraphTracerUpdateCommand
| GraphTracerConnectCommand
| GraphTracerDisconnectCommand
| GraphTracerWeightCommand
| GraphTracerVisitCommand
| GraphTracerLeaveCommand
| GraphTracerPickCommand
| GraphTracerDropCommand;

View File

@@ -2,4 +2,5 @@ export * from './array-tracer';
export * from './command'; export * from './command';
export * from './common'; export * from './common';
export * from './control-tracer'; export * from './control-tracer';
export * from './graph-tracer';
export * from './log-tracer'; export * from './log-tracer';