@typeonce/effect-machine 0.31.2 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -140
- package/dist/Machine.d.ts +428 -254
- package/dist/Machine.d.ts.map +1 -1
- package/dist/Machine.js +91 -111
- package/dist/Machine.js.map +1 -1
- package/dist/internal/machine/atom.d.ts +3 -4
- package/dist/internal/machine/atom.d.ts.map +1 -1
- package/dist/internal/machine/atom.js +0 -2
- package/dist/internal/machine/atom.js.map +1 -1
- package/dist/internal/machine/childRegistry.d.ts +52 -0
- package/dist/internal/machine/childRegistry.d.ts.map +1 -0
- package/dist/internal/machine/childRegistry.js +74 -0
- package/dist/internal/machine/childRegistry.js.map +1 -0
- package/dist/internal/machine/cluster.d.ts +2 -3
- package/dist/internal/machine/cluster.d.ts.map +1 -1
- package/dist/internal/machine/cluster.js.map +1 -1
- package/dist/internal/machine/configuration.d.ts.map +1 -1
- package/dist/internal/machine/configuration.js +14 -4
- package/dist/internal/machine/configuration.js.map +1 -1
- package/dist/internal/machine/executionPlan.d.ts +1 -0
- package/dist/internal/machine/executionPlan.d.ts.map +1 -1
- package/dist/internal/machine/executionPlan.js +97 -53
- package/dist/internal/machine/executionPlan.js.map +1 -1
- package/dist/internal/machine/invocation.d.ts.map +1 -1
- package/dist/internal/machine/invocation.js +4 -2
- package/dist/internal/machine/invocation.js.map +1 -1
- package/dist/internal/machine/invocationDefinition.d.ts +35 -0
- package/dist/internal/machine/invocationDefinition.d.ts.map +1 -0
- package/dist/internal/machine/invocationDefinition.js +21 -0
- package/dist/internal/machine/invocationDefinition.js.map +1 -0
- package/dist/internal/machine/invocationEvent.d.ts +0 -2
- package/dist/internal/machine/invocationEvent.d.ts.map +1 -1
- package/dist/internal/machine/invocationEvent.js +0 -8
- package/dist/internal/machine/invocationEvent.js.map +1 -1
- package/dist/internal/machine/machine.d.ts +21 -43
- package/dist/internal/machine/machine.d.ts.map +1 -1
- package/dist/internal/machine/machine.js +98 -374
- package/dist/internal/machine/machine.js.map +1 -1
- package/dist/internal/machine/planner.d.ts +13 -19
- package/dist/internal/machine/planner.d.ts.map +1 -1
- package/dist/internal/machine/planner.js +63 -35
- package/dist/internal/machine/planner.js.map +1 -1
- package/dist/internal/machine/process.d.ts +6 -8
- package/dist/internal/machine/process.d.ts.map +1 -1
- package/dist/internal/machine/process.js +1 -0
- package/dist/internal/machine/process.js.map +1 -1
- package/dist/internal/machine/protocol.d.ts +2 -2
- package/dist/internal/machine/protocol.d.ts.map +1 -1
- package/dist/internal/machine/protocol.js +4 -18
- package/dist/internal/machine/protocol.js.map +1 -1
- package/dist/internal/machine/readiness.d.ts +1 -1
- package/dist/internal/machine/readiness.d.ts.map +1 -1
- package/dist/internal/machine/requirements.d.ts +4 -0
- package/dist/internal/machine/requirements.d.ts.map +1 -0
- package/dist/internal/machine/requirements.js +2 -0
- package/dist/internal/machine/requirements.js.map +1 -0
- package/dist/internal/machine/runtime.d.ts +4 -58
- package/dist/internal/machine/runtime.d.ts.map +1 -1
- package/dist/internal/machine/runtime.js +1 -69
- package/dist/internal/machine/runtime.js.map +1 -1
- package/dist/internal/machine/serialization.d.ts.map +1 -1
- package/dist/internal/machine/serialization.js +16 -0
- package/dist/internal/machine/serialization.js.map +1 -1
- package/dist/internal/machine/stateDefinition.d.ts +3 -1
- package/dist/internal/machine/stateDefinition.d.ts.map +1 -1
- package/dist/internal/machine/stateDefinition.js +36 -2
- package/dist/internal/machine/stateDefinition.js.map +1 -1
- package/dist/internal/machine/targetBuilder.d.ts +16 -0
- package/dist/internal/machine/targetBuilder.d.ts.map +1 -0
- package/dist/internal/machine/targetBuilder.js +333 -0
- package/dist/internal/machine/targetBuilder.js.map +1 -0
- package/dist/internal/machine/topology.js +3 -3
- package/dist/internal/machine/topology.js.map +1 -1
- package/dist/internal/machine/transition.d.ts +16 -0
- package/dist/internal/machine/transition.d.ts.map +1 -0
- package/dist/internal/machine/transition.js +2 -0
- package/dist/internal/machine/transition.js.map +1 -0
- package/dist/internal/testing/machine/finiteModel.d.ts.map +1 -1
- package/dist/internal/testing/machine/finiteModel.js +10 -12
- package/dist/internal/testing/machine/finiteModel.js.map +1 -1
- package/dist/internal/testing/machine/format.d.ts +7 -0
- package/dist/internal/testing/machine/format.d.ts.map +1 -0
- package/dist/internal/testing/machine/format.js +104 -0
- package/dist/internal/testing/machine/format.js.map +1 -0
- package/dist/internal/testing/machine/probe.d.ts +1 -1
- package/dist/internal/testing/machine/probe.d.ts.map +1 -1
- package/dist/internal/testing/machine/probe.js +1 -1
- package/dist/internal/testing/machine/probe.js.map +1 -1
- package/dist/internal/testing/machine/referenceModel.d.ts.map +1 -1
- package/dist/internal/testing/machine/referenceModel.js +15 -19
- package/dist/internal/testing/machine/referenceModel.js.map +1 -1
- package/dist/internal/testing/machine/trace.d.ts +1 -1
- package/dist/internal/testing/machine/trace.d.ts.map +1 -1
- package/dist/internal/testing/machine/trace.js +3 -3
- package/dist/internal/testing/machine/trace.js.map +1 -1
- package/dist/internal/testing/machine/value.d.ts +8 -0
- package/dist/internal/testing/machine/value.d.ts.map +1 -0
- package/dist/internal/testing/machine/value.js +82 -0
- package/dist/internal/testing/machine/value.js.map +1 -0
- package/dist/internal/testing/machine/verification.d.ts +2 -13
- package/dist/internal/testing/machine/verification.d.ts.map +1 -1
- package/dist/internal/testing/machine/verification.js +21 -113
- package/dist/internal/testing/machine/verification.js.map +1 -1
- package/dist/testing/MachineTest.d.ts +89 -104
- package/dist/testing/MachineTest.d.ts.map +1 -1
- package/dist/testing/MachineTest.js +70 -84
- package/dist/testing/MachineTest.js.map +1 -1
- package/dist/unstable/cluster/ClusterMachine.d.ts +10 -13
- package/dist/unstable/cluster/ClusterMachine.d.ts.map +1 -1
- package/dist/unstable/cluster/ClusterMachine.js +5 -8
- package/dist/unstable/cluster/ClusterMachine.js.map +1 -1
- package/dist/unstable/reactivity/AtomMachine.d.ts +26 -61
- package/dist/unstable/reactivity/AtomMachine.d.ts.map +1 -1
- package/dist/unstable/reactivity/AtomMachine.js +17 -26
- package/dist/unstable/reactivity/AtomMachine.js.map +1 -1
- package/docs/agent-guide.md +45 -45
- package/docs/effect-atom-react.md +35 -63
- package/docs/machine-review.md +7 -7
- package/docs/root-api.md +214 -0
- package/package.json +1 -1
- package/src/Machine.ts +778 -437
- package/src/internal/machine/atom.ts +3 -13
- package/src/internal/machine/childRegistry.ts +141 -0
- package/src/internal/machine/cluster.ts +5 -14
- package/src/internal/machine/configuration.ts +20 -4
- package/src/internal/machine/executionPlan.ts +109 -52
- package/src/internal/machine/invocation.ts +10 -6
- package/src/internal/machine/invocationDefinition.ts +52 -0
- package/src/internal/machine/invocationEvent.ts +0 -8
- package/src/internal/machine/machine.ts +154 -679
- package/src/internal/machine/planner.ts +74 -62
- package/src/internal/machine/process.ts +14 -21
- package/src/internal/machine/protocol.ts +9 -32
- package/src/internal/machine/readiness.ts +1 -0
- package/src/internal/machine/requirements.ts +11 -0
- package/src/internal/machine/runtime.ts +17 -186
- package/src/internal/machine/serialization.ts +22 -0
- package/src/internal/machine/stateDefinition.ts +36 -3
- package/src/internal/machine/targetBuilder.ts +525 -0
- package/src/internal/machine/topology.ts +3 -3
- package/src/internal/machine/transition.ts +26 -0
- package/src/internal/testing/machine/finiteModel.ts +22 -23
- package/src/internal/testing/machine/format.ts +120 -0
- package/src/internal/testing/machine/probe.ts +4 -4
- package/src/internal/testing/machine/referenceModel.ts +25 -17
- package/src/internal/testing/machine/trace.ts +4 -4
- package/src/internal/testing/machine/value.ts +77 -0
- package/src/internal/testing/machine/verification.ts +904 -1109
- package/src/testing/MachineTest.ts +103 -114
- package/src/unstable/cluster/ClusterMachine.ts +10 -20
- package/src/unstable/reactivity/AtomMachine.ts +42 -79
|
@@ -13,6 +13,10 @@ import type { AsyncResult, Atom, AtomRegistry } from "effect/unstable/reactivity
|
|
|
13
13
|
import * as internal from "../../internal/machine/atom.js"
|
|
14
14
|
import type { ChildNotActiveError, NotReadyError } from "../../internal/machine/atom.js"
|
|
15
15
|
import type { EnsureExecutable } from "../../internal/machine/readiness.js"
|
|
16
|
+
import type {
|
|
17
|
+
ExcludeCompatibleRuntime as ExcludeCompatibleMachineRuntime,
|
|
18
|
+
IsAny
|
|
19
|
+
} from "../../internal/machine/requirements.js"
|
|
16
20
|
import type * as Machine from "../../Machine.js"
|
|
17
21
|
|
|
18
22
|
/**
|
|
@@ -41,15 +45,6 @@ type EnsureNoExternalRequirements<Requirements> = [ExternalRequirements<Requirem
|
|
|
41
45
|
readonly [ExternalRequirementsTypeId]: ExternalRequirements<Requirements>
|
|
42
46
|
}
|
|
43
47
|
|
|
44
|
-
type IsAny<A> = 0 extends (1 & A) ? true : false
|
|
45
|
-
|
|
46
|
-
type ExcludeCompatibleMachineRuntime<Requirements, Events, Emits> = Requirements extends
|
|
47
|
-
Machine.Runtime.Requirement<infer RequiredEvents, infer RequiredEmits> ?
|
|
48
|
-
IsAny<Requirements> extends true ? Requirements
|
|
49
|
-
: [RequiredEvents] extends [Events] ? [RequiredEmits] extends [Emits] ? never : Requirements
|
|
50
|
-
: Requirements
|
|
51
|
-
: Requirements
|
|
52
|
-
|
|
53
48
|
type MachineRequirements<InitialR, R, Events, Emits> = ExcludeCompatibleMachineRuntime<
|
|
54
49
|
Machine.ExecutionServices<InitialR | R>,
|
|
55
50
|
Events,
|
|
@@ -110,17 +105,6 @@ export interface MachineAtom<State, Event, Error = never, Output = never, StartE
|
|
|
110
105
|
AsyncResult.AsyncResult<Machine.RuntimeSnapshot<State, Error, Output>, StartError>
|
|
111
106
|
>
|
|
112
107
|
|
|
113
|
-
/**
|
|
114
|
-
* Atom containing the state value from the latest runtime snapshot.
|
|
115
|
-
*
|
|
116
|
-
* This preserves the historical behavior of exposing a state even when the
|
|
117
|
-
* runtime snapshot reports a terminal error. Use `result` when runtime
|
|
118
|
-
* failures must be represented in the atom failure channel.
|
|
119
|
-
*
|
|
120
|
-
* @since 0.4.0
|
|
121
|
-
*/
|
|
122
|
-
readonly state: Atom.Atom<AsyncResult.AsyncResult<State, StartError>>
|
|
123
|
-
|
|
124
108
|
/**
|
|
125
109
|
* Atom containing the current state, with startup and runtime failures in
|
|
126
110
|
* one typed failure channel.
|
|
@@ -251,17 +235,7 @@ export interface ChildMachineAtom<Child extends Machine.ChildMachine.Any, StartE
|
|
|
251
235
|
StartError
|
|
252
236
|
>
|
|
253
237
|
>
|
|
254
|
-
|
|
255
|
-
* Atom containing the current child state when active.
|
|
256
|
-
*
|
|
257
|
-
* Runtime failures retain the last successful state. Use `result` when they
|
|
258
|
-
* must be represented in the atom failure channel.
|
|
259
|
-
*
|
|
260
|
-
* @since 0.4.0
|
|
261
|
-
*/
|
|
262
|
-
readonly state: Atom.Atom<
|
|
263
|
-
AsyncResult.AsyncResult<Option.Option<RefState<Machine.ChildMachine.Ref<Child>>>, StartError>
|
|
264
|
-
>
|
|
238
|
+
|
|
265
239
|
/**
|
|
266
240
|
* Atom containing the current child state when active, with startup and
|
|
267
241
|
* runtime failures in one typed failure channel.
|
|
@@ -324,16 +298,8 @@ export type ChildOf<
|
|
|
324
298
|
Child extends Machine.ChildMachine.Any
|
|
325
299
|
> = ChildMachineAtom<Child, BridgeStartError<Parent>>
|
|
326
300
|
|
|
327
|
-
type SnapshotNode<State> =
|
|
328
|
-
|
|
329
|
-
| (State extends { readonly state: infer Child } ? SnapshotNode<Child>
|
|
330
|
-
: State extends { readonly states: infer Regions } ? SnapshotNode<Regions[keyof Regions]>
|
|
331
|
-
: never)
|
|
332
|
-
: never
|
|
333
|
-
|
|
334
|
-
type SnapshotIdentifier<State> = SnapshotNode<State> extends infer Node ?
|
|
335
|
-
Node extends { readonly path: infer Path extends string } ? Path : never
|
|
336
|
-
: never
|
|
301
|
+
type SnapshotNode<State> = Machine.Snapshot.Node<State>
|
|
302
|
+
type SnapshotIdentifier<State> = Machine.Snapshot.Path<State>
|
|
337
303
|
|
|
338
304
|
type ValuedSnapshotIdentifier<State> = SnapshotNode<State> extends infer Node ?
|
|
339
305
|
Node extends { readonly path: infer Path extends string; readonly value: infer Value } ?
|
|
@@ -350,7 +316,7 @@ type SnapshotByIdentifier<State, Path extends SnapshotIdentifier<State>> = Snaps
|
|
|
350
316
|
Node extends { readonly path: Path } ? Node : never
|
|
351
317
|
: never
|
|
352
318
|
|
|
353
|
-
type ChildState<Child extends Machine.ChildMachine.Any> =
|
|
319
|
+
type ChildState<Child extends Machine.ChildMachine.Any> = ChildSnapshot<Child>
|
|
354
320
|
|
|
355
321
|
type ChildSnapshot<Child extends Machine.ChildMachine.Any> = Machine.Machine.Snapshot<
|
|
356
322
|
Machine.Machine.States<Child["machine"]>
|
|
@@ -425,15 +391,12 @@ type EnsureValuedSelectorPath<State, Path extends string> = [Path] extends [Valu
|
|
|
425
391
|
* class Count extends Schema.TaggedClass<Count>("Count")("Count", {
|
|
426
392
|
* value: Schema.Number
|
|
427
393
|
* }) {}
|
|
428
|
-
* const States = Machine.
|
|
394
|
+
* const States = Machine.state({ initial: "Count", states: { Count } })
|
|
429
395
|
* const machine = Machine.make({
|
|
430
|
-
*
|
|
431
|
-
* events: Machine.
|
|
432
|
-
*
|
|
433
|
-
*
|
|
434
|
-
* resolve: ({ target }) => target.decoded(new Count({ value: 0 }))
|
|
435
|
-
* }
|
|
436
|
-
* }).handle({ Count: {} })
|
|
396
|
+
* root: States,
|
|
397
|
+
* events: Machine.eventsFromSchemas(),
|
|
398
|
+
* initialConfiguration: root => root.resolve(({ target }) => target.from(tree => tree.Count.decoded(new Count({ value: 0 }))))
|
|
399
|
+
* }).handle({ states: { Count: {} } })
|
|
437
400
|
* const machineAtom = AtomMachine.make(machine)
|
|
438
401
|
*
|
|
439
402
|
* const countAtom = AtomMachine.select(machineAtom, "Count")
|
|
@@ -558,15 +521,18 @@ export const selectSnapshot: {
|
|
|
558
521
|
* @since 0.4.0
|
|
559
522
|
*/
|
|
560
523
|
export const selectChild: {
|
|
561
|
-
<
|
|
562
|
-
Child extends Machine.ChildMachine.Any = never,
|
|
563
|
-
StartError = never,
|
|
564
|
-
const Path extends ValuedSnapshotIdentifier<ChildState<Child>> = ValuedSnapshotIdentifier<ChildState<Child>>
|
|
565
|
-
>(path: Path):
|
|
524
|
+
<const Path extends string = never>(path: NoInfer<Path>):
|
|
566
525
|
& SelectorProjection<"selectChild", Path>
|
|
567
|
-
& (
|
|
526
|
+
& (<
|
|
527
|
+
Child extends Machine.ChildMachine.Any,
|
|
528
|
+
StartError
|
|
529
|
+
>(
|
|
530
|
+
self: ChildMachineAtom<Child, StartError> & EnsureValuedSelectorPath<ChildState<Child>, Path>
|
|
531
|
+
) => Atom.Atom<
|
|
568
532
|
AsyncResult.AsyncResult<
|
|
569
|
-
Option.Option<
|
|
533
|
+
Option.Option<
|
|
534
|
+
SnapshotValueByIdentifier<ChildState<Child>, Extract<Path, ValuedSnapshotIdentifier<ChildState<Child>>>>
|
|
535
|
+
>,
|
|
570
536
|
StartError | RefError<Machine.ChildMachine.Ref<Child>>
|
|
571
537
|
>
|
|
572
538
|
>)
|
|
@@ -663,15 +629,12 @@ export const selectSnapshotChild: {
|
|
|
663
629
|
* import { AtomMachine } from "@typeonce/effect-machine/reactivity"
|
|
664
630
|
*
|
|
665
631
|
* class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
|
|
666
|
-
* const States = Machine.
|
|
632
|
+
* const States = Machine.state({ initial: "Idle", states: { Idle } })
|
|
667
633
|
* const machine = Machine.make({
|
|
668
|
-
*
|
|
669
|
-
* events: Machine.
|
|
670
|
-
*
|
|
671
|
-
*
|
|
672
|
-
* resolve: ({ target }) => target.from()
|
|
673
|
-
* }
|
|
674
|
-
* }).handle({ Idle: {} })
|
|
634
|
+
* root: States,
|
|
635
|
+
* events: Machine.eventsFromSchemas(),
|
|
636
|
+
* initialConfiguration: root => root.resolve(({ target }) => target.from(tree => tree.Idle.from()))
|
|
637
|
+
* }).handle({ states: { Idle: {} } })
|
|
675
638
|
* const machineAtom = AtomMachine.make(machine)
|
|
676
639
|
*
|
|
677
640
|
* const isIdleAtom = AtomMachine.matches(machineAtom, "Idle")
|
|
@@ -796,7 +759,7 @@ type MachineRequirementsOf<M extends Machine.Machine.Any> = MachineRequirements<
|
|
|
796
759
|
Machine.Machine.InitialServices<M>,
|
|
797
760
|
Machine.Machine.Services<M>,
|
|
798
761
|
Machine.Machine.Event<M>,
|
|
799
|
-
Machine.Machine.
|
|
762
|
+
Machine.Machine.EmittedEvent<M>
|
|
800
763
|
>
|
|
801
764
|
|
|
802
765
|
type MissingBoundRequirements<Services, M extends Machine.Machine.Any> = Exclude<
|
|
@@ -815,7 +778,7 @@ type EnsureBoundRequirements<Services, M extends Machine.Machine.Any> = IsAny<Ma
|
|
|
815
778
|
type MachineResumeRequirementsOf<M extends Machine.Machine.Any> = MachineResumeRequirements<
|
|
816
779
|
Machine.Machine.Services<M>,
|
|
817
780
|
Machine.Machine.Event<M>,
|
|
818
|
-
Machine.Machine.
|
|
781
|
+
Machine.Machine.EmittedEvent<M>
|
|
819
782
|
>
|
|
820
783
|
|
|
821
784
|
type MissingBoundResumeRequirements<Services, M extends Machine.Machine.Any> = Exclude<
|
|
@@ -1056,7 +1019,7 @@ export interface Bound<Services, RuntimeError = never> {
|
|
|
1056
1019
|
* const processAtoms = AtomMachine.family(processMachine, {
|
|
1057
1020
|
* atoms: {
|
|
1058
1021
|
* ready: AtomMachine.matches("Ready"),
|
|
1059
|
-
* state: (machine) => machine.
|
|
1022
|
+
* state: (machine) => machine.result,
|
|
1060
1023
|
* send: (machine) => machine.send
|
|
1061
1024
|
* }
|
|
1062
1025
|
* })
|
|
@@ -1104,7 +1067,7 @@ export const family: <
|
|
|
1104
1067
|
* child: (plantId: string) => Plant(plantId),
|
|
1105
1068
|
* atoms: {
|
|
1106
1069
|
* broken: AtomMachine.matchesChild("Broken"),
|
|
1107
|
-
* state: (child) => child.
|
|
1070
|
+
* state: (child) => child.result,
|
|
1108
1071
|
* send: (child) => child.send
|
|
1109
1072
|
* }
|
|
1110
1073
|
* })
|
|
@@ -1117,7 +1080,10 @@ export const familyChild: <
|
|
|
1117
1080
|
Key,
|
|
1118
1081
|
Parent extends MachineAtom<any, never, any, any, any, any> | ChildMachineAtom<any, any>,
|
|
1119
1082
|
Child extends Machine.ChildMachine.Any,
|
|
1120
|
-
const Projections extends FamilyProjectionRecord<
|
|
1083
|
+
const Projections extends FamilyProjectionRecord<
|
|
1084
|
+
ChildOf<Parent, NoInfer<Child>>,
|
|
1085
|
+
ChildFamilySelectorProjection<NoInfer<Child>>
|
|
1086
|
+
>
|
|
1121
1087
|
>(
|
|
1122
1088
|
parent: Parent,
|
|
1123
1089
|
options: {
|
|
@@ -1141,15 +1107,12 @@ export const familyChild: <
|
|
|
1141
1107
|
* import { AtomMachine } from "@typeonce/effect-machine/reactivity"
|
|
1142
1108
|
*
|
|
1143
1109
|
* class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
|
|
1144
|
-
* const States = Machine.
|
|
1110
|
+
* const States = Machine.state({ initial: "Idle", states: { Idle } })
|
|
1145
1111
|
* const machine = Machine.make({
|
|
1146
|
-
*
|
|
1147
|
-
* events: Machine.
|
|
1148
|
-
*
|
|
1149
|
-
*
|
|
1150
|
-
* resolve: ({ target }) => target.from()
|
|
1151
|
-
* }
|
|
1152
|
-
* }).handle({ Idle: {} })
|
|
1112
|
+
* root: States,
|
|
1113
|
+
* events: Machine.eventsFromSchemas(),
|
|
1114
|
+
* initialConfiguration: root => root.resolve(({ target }) => target.from(tree => tree.Idle.from()))
|
|
1115
|
+
* }).handle({ states: { Idle: {} } })
|
|
1153
1116
|
*
|
|
1154
1117
|
* const machineAtom = AtomMachine.make(machine)
|
|
1155
1118
|
* ```
|
|
@@ -1196,7 +1159,7 @@ export const make: {
|
|
|
1196
1159
|
InitialR,
|
|
1197
1160
|
R,
|
|
1198
1161
|
Machine.Machine.EventOf<Events>,
|
|
1199
|
-
Machine.Machine.
|
|
1162
|
+
Machine.Machine.EmittedEventOf<Emits>
|
|
1200
1163
|
>
|
|
1201
1164
|
>
|
|
1202
1165
|
& EnsureExecutable<States, UnhandledStates, OutputStates>
|