ts-05-state-machine
0.571
Proposed solution
```typescript
export interface Machine<S extends string, E extends string> {
state: S;
send(event: E): void;
can(event: E): boolean;
}
export function createMachine<S extends string, E extends string>(config: {
initial: S;
states: Record<S, Partial<Record<E, S>>>;
}): Machine<S, E> {
let currentState: S = config.initial;
const machine: Machine<S, E> = {
state: currentState,
send(event: E): void {
const nextState = config.states[currentState]?.[event];
if (nextState) {
currentState = nextState;
}
},
can(event: E): boolean {
return config.states[currentState]?.[event] !== undefined;
},
};
return machine;
}
```Test output (stdout)
TAP version 13
# Subtest: starts in the initial state
ok 1 - starts in the initial state
---
duration_ms: 0.369754
type: 'test'
...
# Subtest: valid transition changes state
not ok 2 - valid transition changes state
---
duration_ms: 0.878899
type: 'test'
location: '/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:1:483'
failureType: 'testCodeFailure'
error: |-
Expected values to be strictly equal:
'idle' !== 'running'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: 'running'
actual: 'idle'
operator: 'strictEqual'
stack: |-
TestContext.<anonymous> (/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:26:10)
Test.runInAsyncScope (node:async_hooks:227:14)
Test.run (node:internal/test_runner/test:1306:25)
Test.processPendingSubtests (node:internal/test_runner/test:897:18)
Test.postRun (node:internal/test_runner/test:1447:19)
Test.run (node:internal/test_runner/test:1372:12)
async startSubtestAfterBootstrap (node:internal/test_runner/harness:385:3)
...
# Subtest: invalid transition is ignored
ok 3 - invalid transition is ignored
---
duration_ms: 0.05862
type: 'test'
...
# Subtest: can reflects available transitions
ok 4 - can reflects available transitions
---
duration_ms: 0.07474
type: 'test'
...
# Subtest: can updates after a transition
ok 5 - can updates after a transition
---
duration_ms: 0.04595
type: 'test'
...
# Subtest: multi-step sequence
not ok 6 - multi-step sequence
---
duration_ms: 0.138972
type: 'test'
location: '/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:1:1040'
failureType: 'testCodeFailure'
error: |-
Expected values to be strictly equal:
'idle' !== 'paused'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: 'paused'
actual: 'idle'
operator: 'strictEqual'
stack: |-
TestContext.<anonymous> (/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:54:10)
Test.runInAsyncScope (node:async_hooks:227:14)
Test.run (node:internal/test_runner/test:1306:25)
Test.processPendingSubtests (node:internal/test_runner/test:897:18)
Test.postRun (node:internal/test_runner/test:1447:19)
Test.run (node:internal/test_runner/test:1372:12)
async Test.processPendingSubtests (node:internal/test_runner/test:897:7)
...
# Subtest: self / terminal states with no outgoing events ignore everything
not ok 7 - self / terminal states with no outgoing events ignore everything
---
duration_ms: 0.094711
type: 'test'
location: '/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:1:1212'
failureType: 'testCodeFailure'
error: |-
Expected values to be strictly equal:
'on' !== 'done'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: 'done'
actual: 'on'
operator: 'strictEqual'
stack: |-
TestContext.<anonymous> (/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:69:10)
Test.runInAsyncScope (node:async_hooks:227:14)
Test.run (node:internal/test_runner/test:1306:25)
Test.processPendingSubtests (node:internal/test_runner/test:897:18)
Test.postRun (node:internal/test_runner/test:1447:19)
Test.run (node:internal/test_runner/test:1372:12)
async Test.processPendingSubtests (node:internal/test_runner/test:897:7)
...
1..7
# tests 7
# suites 0
# pass 4
# fail 3
# cancelled 0
# skipped 0
# todo 0
# duration_ms 78.534674
Self-repair attempts
[
{
"total": 7,
"answer": "```typescript\nexport interface Machine<S extends string, E extends string> {\n state: S;\n send(event: E): void;\n can(event: E): boolean;\n}\n\nexport function createMachine<S extends string, E extends string>(config: {\n initial: S;\n states: Record<S, Partial<Record<E, S>>>;\n}): Machine<S, E> {\n let currentState: S = config.initial;\n\n const machine: Machine<S, E> = {\n state: currentState,\n send(event: E): void {\n const nextState = config.states[currentState]?.[event];\n if (nextState) {\n currentState = nextState;\n }\n },\n can(event: E): boolean {\n return config.states[currentState]?.[event] !== undefined;\n },\n };\n\n return machine;\n}\n```",
"passed": 4,
"test_error": "ode:internal/test_runner/test:1372:12)\n async startSubtestAfterBootstrap (node:internal/test_runner/harness:385:3)\n ...\n# Subtest: invalid transition is ignored\nok 3 - invalid transition is ignored\n ---\n duration_ms: 0.05862\n type: 'test'\n ...\n# Subtest: can reflects available transitions\nok 4 - can reflects available transitions\n ---\n duration_ms: 0.07474\n type: 'test'\n ...\n# Subtest: can updates after a transition\nok 5 - can updates after a transition\n ---\n duration_ms: 0.04595\n type: 'test'\n ...\n# Subtest: multi-step sequence\nnot ok 6 - multi-step sequence\n ---\n duration_ms: 0.138972\n type: 'test'\n location: '/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:1:1040'\n failureType: 'testCodeFailure'\n error: |-\n Expected values to be strictly equal:\n \n 'idle' !== 'paused'\n \n code: 'ERR_ASSERTION'\n name: 'AssertionError'\n expected: 'paused'\n actual: 'idle'\n operator: 'strictEqual'\n stack: |-\n TestContext.<anonymous> (/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:54:10)\n Test.runInAsyncScope (node:async_hooks:227:14)\n Test.run (node:internal/test_runner/test:1306:25)\n Test.processPendingSubtests (node:internal/test_runner/test:897:18)\n Test.postRun (node:internal/test_runner/test:1447:19)\n Test.run (node:internal/test_runner/test:1372:12)\n async Test.processPendingSubtests (node:internal/test_runner/test:897:7)\n ...\n# Subtest: self / terminal states with no outgoing events ignore everything\nnot ok 7 - self / terminal states with no outgoing events ignore everything\n ---\n duration_ms: 0.094711\n type: 'test'\n location: '/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:1:1212'\n failureType: 'testCodeFailure'\n error: |-\n Expected values to be strictly equal:\n \n 'on' !== 'done'\n \n code: 'ERR_ASSERTION'\n name: 'AssertionError'\n expected: 'done'\n actual: 'on'\n operator: 'strictEqual'\n stack: |-\n TestContext.<anonymous> (/tmp/llmlab-ts-05-state-machine-u2db8lxk/solution.test.ts:69:10)\n Test.runInAsyncScope (node:async_hooks:227:14)\n Test.run (node:internal/test_runner/test:1306:25)\n Test.processPendingSubtests (node:internal/test_runner/test:897:18)\n Test.postRun (node:internal/test_runner/test:1447:19)\n Test.run (node:internal/test_runner/test:1372:12)\n async Test.processPendingSubtests (node:internal/test_runner/test:897:7)\n ...\n1..7\n# tests 7\n# suites 0\n# pass 4\n# fail 3\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms 78.534674"
},
{
"total": 7,
"answer": "```typescript\nexport interface Machine<S extends string, E extends string> {\n state: S;\n send(event: E): void;\n can(event: E): boolean;\n}\n\nexport function createMachine<S extends string, E extends string>(config: {\n initial: S;\n states: Record<S, Partial<Record<E, S>>>;\n}): Machine<S, E> {\n let currentState: S = config.initial;\n\n const machine: Machine<S, E> = {\n state: currentState,\n send(event: E): void {\n const nextState = config.states[currentState]?.[event];\n if (nextState) {\n currentState = nextState;\n }\n },\n can(event: E): boolean {\n return config.states[currentState]?.[event] !== undefined;\n },\n };\n\n return machine;\n}\n```",
"passed": 4,
"test_error": "e:internal/test_runner/test:1372:12)\n async startSubtestAfterBootstrap (node:internal/test_runner/harness:385:3)\n ...\n# Subtest: invalid transition is ignored\nok 3 - invalid transition is ignored\n ---\n duration_ms: 0.058061\n type: 'test'\n ...\n# Subtest: can reflects available transitions\nok 4 - can reflects available transitions\n ---\n duration_ms: 0.047691\n type: 'test'\n ...\n# Subtest: can updates after a transition\nok 5 - can updates after a transition\n ---\n duration_ms: 0.04605\n type: 'test'\n ...\n# Subtest: multi-step sequence\nnot ok 6 - multi-step sequence\n ---\n duration_ms: 0.129581\n type: 'test'\n location: '/tmp/llmlab-ts-05-state-machine-otxj8yq8/solution.test.ts:1:1040'\n failureType: 'testCodeFailure'\n error: |-\n Expected values to be strictly equal:\n \n 'idle' !== 'paused'\n \n code: 'ERR_ASSERTION'\n name: 'AssertionError'\n expected: 'paused'\n actual: 'idle'\n operator: 'strictEqual'\n stack: |-\n TestContext.<anonymous> (/tmp/llmlab-ts-05-state-machine-otxj8yq8/solution.test.ts:54:10)\n Test.runInAsyncScope (node:async_hooks:227:14)\n Test.run (node:internal/test_runner/test:1306:25)\n Test.processPendingSubtests (node:internal/test_runner/test:897:18)\n Test.postRun (node:internal/test_runner/test:1447:19)\n Test.run (node:internal/test_runner/test:1372:12)\n async Test.processPendingSubtests (node:internal/test_runner/test:897:7)\n ...\n# Subtest: self / terminal states with no outgoing events ignore everything\nnot ok 7 - self / terminal states with no outgoing events ignore everything\n ---\n duration_ms: 0.140081\n type: 'test'\n location: '/tmp/llmlab-ts-05-state-machine-otxj8yq8/solution.test.ts:1:1212'\n failureType: 'testCodeFailure'\n error: |-\n Expected values to be strictly equal:\n \n 'on' !== 'done'\n \n code: 'ERR_ASSERTION'\n name: 'AssertionError'\n expected: 'done'\n actual: 'on'\n operator: 'strictEqual'\n stack: |-\n TestContext.<anonymous> (/tmp/llmlab-ts-05-state-machine-otxj8yq8/solution.test.ts:69:10)\n Test.runInAsyncScope (node:async_hooks:227:14)\n Test.run (node:internal/test_runner/test:1306:25)\n Test.processPendingSubtests (node:internal/test_runner/test:897:18)\n Test.postRun (node:internal/test_runner/test:1447:19)\n Test.run (node:internal/test_runner/test:1372:12)\n async Test.processPendingSubtests (node:internal/test_runner/test:897:7)\n ...\n1..7\n# tests 7\n# suites 0\n# pass 4\n# fail 3\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms 77.938257"
},
{
"total": 7,
"answer": "```typescript\nexport interface Machine<S extends string, E extends string> {\n state: S;\n send(event: E): void;\n can(event: E): boolean;\n}\n\nexport function createMachine<S extends string, E extends string>(config: {\n initial: S;\n states: Record<S, Partial<Record<E, S>>>;\n}): Machine<S, E> {\n let currentState: S = config.initial;\n\n const machine: Machine<S, E> = {\n state: currentState,\n send(event: E): void {\n const nextState = config.states[currentState]?.[event];\n if (nextState) {\n currentState = nextState;\n }\n },\n can(event: E): boolean {\n return config.states[currentState]?.[event] !== undefined;\n },\n };\n\n return machine;\n}\n```",
"passed": 4,
"test_error": ""
}
]System prompt
You are an expert programmer. Solve the task exactly as specified. Output your solution as fenced code blocks using the required file name(s) and the exact function/type signatures requested. Prefer correctness; do not include prose outside code unless asked.