@turing-machine-js/library-binary-numbers 6.4.0 → 7.0.0-alpha.2

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/dist/index.cjs CHANGED
@@ -72,11 +72,11 @@ const goToNumbersStart = new machine.State({
72
72
  },
73
73
  },
74
74
  }, 'goToNumberStart');
75
- // deleteNumber — 5 nodes
75
+ // deleteNumber — 4 nodes
76
76
  //
77
77
  // Composition: go to the number's '^', then sweep right erasing every cell
78
78
  // (digits, '^', '$') until the number is gone. Implemented as
79
- // goToNumbersStart.withOverrodeHaltState(deleteNumberInternal): when
79
+ // goToNumbersStart.withOverriddenHaltState(deleteNumberInternal): when
80
80
  // goToNumbersStart would halt at '^', it falls through to the eraser instead.
81
81
  const deleteNumberInternal = new machine.State({
82
82
  [symbol('$')]: {
@@ -94,16 +94,16 @@ const deleteNumberInternal = new machine.State({
94
94
  }, 'deleteNumberInternal');
95
95
  const deleteNumber = new machine.State({
96
96
  [symbol('^10$')]: {
97
- nextState: goToNumbersStart.withOverrodeHaltState(deleteNumberInternal),
97
+ nextState: goToNumbersStart.withOverriddenHaltState(deleteNumberInternal),
98
98
  },
99
99
  [machine.ifOtherSymbol]: {
100
100
  nextState: machine.haltState,
101
101
  },
102
102
  }, 'deleteNumber');
103
- // invertNumber — 5 nodes
103
+ // invertNumber — 4 nodes
104
104
  //
105
105
  // Composition: go to '^', then sweep right flipping each bit until '$'.
106
- // Same shape as deleteNumber (goToNumbersStart.withOverrodeHaltState(...)) but
106
+ // Same shape as deleteNumber (goToNumbersStart.withOverriddenHaltState(...)) but
107
107
  // the inner state writes the complement instead of erasing.
108
108
  const invertNumberGoToNumberWithInversion = new machine.State({
109
109
  [symbol('^')]: {
@@ -129,13 +129,13 @@ const invertNumberGoToNumberWithInversion = new machine.State({
129
129
  }, 'invertNumberGoToNumberWithInversion');
130
130
  const invertNumber = new machine.State({
131
131
  [symbol('^10$')]: {
132
- nextState: goToNumbersStart.withOverrodeHaltState(invertNumberGoToNumberWithInversion),
132
+ nextState: goToNumbersStart.withOverriddenHaltState(invertNumberGoToNumberWithInversion),
133
133
  },
134
134
  [machine.ifOtherSymbol]: {
135
135
  nextState: machine.haltState,
136
136
  },
137
137
  }, 'invertNumber');
138
- // normalizeNumber — 7 nodes
138
+ // normalizeNumber — 6 nodes
139
139
  //
140
140
  // Strips leading zeros by erasing them and re-planting '^' just before the first
141
141
  // '1' (or before '$' if the entire number was zero — preserving "0" as "^$").
@@ -165,7 +165,7 @@ const normalizeNumberMoveNumberStart = new machine.State({
165
165
  }, 'normalizeNumberMoveNumberStart');
166
166
  const normalizeNumber = new machine.State({
167
167
  [symbol('^10$')]: {
168
- nextState: goToNumbersStart.withOverrodeHaltState(normalizeNumberMoveNumberStart),
168
+ nextState: goToNumbersStart.withOverriddenHaltState(normalizeNumberMoveNumberStart),
169
169
  },
170
170
  [machine.ifOtherSymbol]: {
171
171
  nextState: machine.haltState,
@@ -244,16 +244,18 @@ const plusOne = new machine.State({
244
244
  nextState: machine.haltState,
245
245
  },
246
246
  }, 'plusOne');
247
- // minusOne — 17 nodes (the largest in this library)
247
+ // minusOne — 15 nodes (the largest in this library, per `summarize().stateCount`)
248
248
  //
249
249
  // Computes x − 1 via the two's-complement identity: x − 1 == ~(~x + 1)
250
250
  // (every step is a state we already have), composed with three nested
251
- // withOverrodeHaltState calls to chain invert → plusOne → invert → normalize.
251
+ // withOverriddenHaltState calls to chain invert → plusOne → invert → normalize.
252
+ // The chain has 4 state names but 3 wrapper hops — `normalizeNumber` at the
253
+ // inner end is the terminal override target, not another wrapper level.
252
254
  //
253
255
  // This is *deliberately* the heavy version. It exists side-by-side with
254
- // minusOneFast (10 nodes, direct borrow) to make the cost of "compose existing
256
+ // minusOneFast (8 nodes, direct borrow) to make the cost of "compose existing
255
257
  // pieces" vs "write a dedicated algorithm" visible. See ../states.md for the
256
- // dotted onHalt edges that show the four-deep subroutine chain.
258
+ // dotted onHalt edges that show the three-deep wrapper chain.
257
259
  const minusOne = new machine.State({
258
260
  [symbol('^10')]: {
259
261
  command: {
@@ -262,15 +264,15 @@ const minusOne = new machine.State({
262
264
  },
263
265
  [symbol('$')]: {
264
266
  nextState: invertNumber
265
- .withOverrodeHaltState(plusOne
266
- .withOverrodeHaltState(invertNumber
267
- .withOverrodeHaltState(normalizeNumber))),
267
+ .withOverriddenHaltState(plusOne
268
+ .withOverriddenHaltState(invertNumber
269
+ .withOverriddenHaltState(normalizeNumber))),
268
270
  },
269
271
  [machine.ifOtherSymbol]: {
270
272
  nextState: machine.haltState,
271
273
  },
272
274
  }, 'minusOne');
273
- // minusOneFast — 10 nodes (direct borrow propagation)
275
+ // minusOneFast — 8 nodes (direct borrow propagation)
274
276
  //
275
277
  // Walks left from the LSB: 0→1 keeps borrowing; 1→0 stops; ^ is underflow.
276
278
  // Falls through to normalizeNumber to strip the leading zero introduced when the
@@ -278,7 +280,7 @@ const minusOne = new machine.State({
278
280
  //
279
281
  // Same algorithm as minusOne in @turing-machine-js/library-binary-numbers-bare
280
282
  // (which is 3 nodes there). The extra 7 nodes here are the cost of: scanning
281
- // past '^' on entry, the goToNumberStart path and its withOverrodeHaltState
283
+ // past '^' on entry, the goToNumberStart path and its withOverriddenHaltState
282
284
  // wrapper for normalize, and normalizeNumber's own marker-relocation chain.
283
285
  const minusOneFastBorrow = new machine.State({
284
286
  [symbol('1')]: {
@@ -307,7 +309,7 @@ const minusOneFast = new machine.State({
307
309
  command: {
308
310
  movement: machine.movements.left,
309
311
  },
310
- nextState: minusOneFastBorrow.withOverrodeHaltState(normalizeNumber),
312
+ nextState: minusOneFastBorrow.withOverriddenHaltState(normalizeNumber),
311
313
  },
312
314
  [machine.ifOtherSymbol]: {
313
315
  nextState: machine.haltState,
package/dist/index.mjs CHANGED
@@ -70,11 +70,11 @@ const goToNumbersStart = new State({
70
70
  },
71
71
  },
72
72
  }, 'goToNumberStart');
73
- // deleteNumber — 5 nodes
73
+ // deleteNumber — 4 nodes
74
74
  //
75
75
  // Composition: go to the number's '^', then sweep right erasing every cell
76
76
  // (digits, '^', '$') until the number is gone. Implemented as
77
- // goToNumbersStart.withOverrodeHaltState(deleteNumberInternal): when
77
+ // goToNumbersStart.withOverriddenHaltState(deleteNumberInternal): when
78
78
  // goToNumbersStart would halt at '^', it falls through to the eraser instead.
79
79
  const deleteNumberInternal = new State({
80
80
  [symbol('$')]: {
@@ -92,16 +92,16 @@ const deleteNumberInternal = new State({
92
92
  }, 'deleteNumberInternal');
93
93
  const deleteNumber = new State({
94
94
  [symbol('^10$')]: {
95
- nextState: goToNumbersStart.withOverrodeHaltState(deleteNumberInternal),
95
+ nextState: goToNumbersStart.withOverriddenHaltState(deleteNumberInternal),
96
96
  },
97
97
  [ifOtherSymbol]: {
98
98
  nextState: haltState,
99
99
  },
100
100
  }, 'deleteNumber');
101
- // invertNumber — 5 nodes
101
+ // invertNumber — 4 nodes
102
102
  //
103
103
  // Composition: go to '^', then sweep right flipping each bit until '$'.
104
- // Same shape as deleteNumber (goToNumbersStart.withOverrodeHaltState(...)) but
104
+ // Same shape as deleteNumber (goToNumbersStart.withOverriddenHaltState(...)) but
105
105
  // the inner state writes the complement instead of erasing.
106
106
  const invertNumberGoToNumberWithInversion = new State({
107
107
  [symbol('^')]: {
@@ -127,13 +127,13 @@ const invertNumberGoToNumberWithInversion = new State({
127
127
  }, 'invertNumberGoToNumberWithInversion');
128
128
  const invertNumber = new State({
129
129
  [symbol('^10$')]: {
130
- nextState: goToNumbersStart.withOverrodeHaltState(invertNumberGoToNumberWithInversion),
130
+ nextState: goToNumbersStart.withOverriddenHaltState(invertNumberGoToNumberWithInversion),
131
131
  },
132
132
  [ifOtherSymbol]: {
133
133
  nextState: haltState,
134
134
  },
135
135
  }, 'invertNumber');
136
- // normalizeNumber — 7 nodes
136
+ // normalizeNumber — 6 nodes
137
137
  //
138
138
  // Strips leading zeros by erasing them and re-planting '^' just before the first
139
139
  // '1' (or before '$' if the entire number was zero — preserving "0" as "^$").
@@ -163,7 +163,7 @@ const normalizeNumberMoveNumberStart = new State({
163
163
  }, 'normalizeNumberMoveNumberStart');
164
164
  const normalizeNumber = new State({
165
165
  [symbol('^10$')]: {
166
- nextState: goToNumbersStart.withOverrodeHaltState(normalizeNumberMoveNumberStart),
166
+ nextState: goToNumbersStart.withOverriddenHaltState(normalizeNumberMoveNumberStart),
167
167
  },
168
168
  [ifOtherSymbol]: {
169
169
  nextState: haltState,
@@ -242,16 +242,18 @@ const plusOne = new State({
242
242
  nextState: haltState,
243
243
  },
244
244
  }, 'plusOne');
245
- // minusOne — 17 nodes (the largest in this library)
245
+ // minusOne — 15 nodes (the largest in this library, per `summarize().stateCount`)
246
246
  //
247
247
  // Computes x − 1 via the two's-complement identity: x − 1 == ~(~x + 1)
248
248
  // (every step is a state we already have), composed with three nested
249
- // withOverrodeHaltState calls to chain invert → plusOne → invert → normalize.
249
+ // withOverriddenHaltState calls to chain invert → plusOne → invert → normalize.
250
+ // The chain has 4 state names but 3 wrapper hops — `normalizeNumber` at the
251
+ // inner end is the terminal override target, not another wrapper level.
250
252
  //
251
253
  // This is *deliberately* the heavy version. It exists side-by-side with
252
- // minusOneFast (10 nodes, direct borrow) to make the cost of "compose existing
254
+ // minusOneFast (8 nodes, direct borrow) to make the cost of "compose existing
253
255
  // pieces" vs "write a dedicated algorithm" visible. See ../states.md for the
254
- // dotted onHalt edges that show the four-deep subroutine chain.
256
+ // dotted onHalt edges that show the three-deep wrapper chain.
255
257
  const minusOne = new State({
256
258
  [symbol('^10')]: {
257
259
  command: {
@@ -260,15 +262,15 @@ const minusOne = new State({
260
262
  },
261
263
  [symbol('$')]: {
262
264
  nextState: invertNumber
263
- .withOverrodeHaltState(plusOne
264
- .withOverrodeHaltState(invertNumber
265
- .withOverrodeHaltState(normalizeNumber))),
265
+ .withOverriddenHaltState(plusOne
266
+ .withOverriddenHaltState(invertNumber
267
+ .withOverriddenHaltState(normalizeNumber))),
266
268
  },
267
269
  [ifOtherSymbol]: {
268
270
  nextState: haltState,
269
271
  },
270
272
  }, 'minusOne');
271
- // minusOneFast — 10 nodes (direct borrow propagation)
273
+ // minusOneFast — 8 nodes (direct borrow propagation)
272
274
  //
273
275
  // Walks left from the LSB: 0→1 keeps borrowing; 1→0 stops; ^ is underflow.
274
276
  // Falls through to normalizeNumber to strip the leading zero introduced when the
@@ -276,7 +278,7 @@ const minusOne = new State({
276
278
  //
277
279
  // Same algorithm as minusOne in @turing-machine-js/library-binary-numbers-bare
278
280
  // (which is 3 nodes there). The extra 7 nodes here are the cost of: scanning
279
- // past '^' on entry, the goToNumberStart path and its withOverrodeHaltState
281
+ // past '^' on entry, the goToNumberStart path and its withOverriddenHaltState
280
282
  // wrapper for normalize, and normalizeNumber's own marker-relocation chain.
281
283
  const minusOneFastBorrow = new State({
282
284
  [symbol('1')]: {
@@ -305,7 +307,7 @@ const minusOneFast = new State({
305
307
  command: {
306
308
  movement: movements.left,
307
309
  },
308
- nextState: minusOneFastBorrow.withOverrodeHaltState(normalizeNumber),
310
+ nextState: minusOneFastBorrow.withOverriddenHaltState(normalizeNumber),
309
311
  },
310
312
  [ifOtherSymbol]: {
311
313
  nextState: haltState,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turing-machine-js/library-binary-numbers",
3
- "version": "6.4.0",
3
+ "version": "7.0.0-alpha.2",
4
4
  "description": "A standard library for working with binary numbers",
5
5
  "engines": {
6
6
  "npm": ">=7.0.0"
@@ -27,7 +27,7 @@
27
27
  "numbers"
28
28
  ],
29
29
  "peerDependencies": {
30
- "@turing-machine-js/machine": "^6.0.0"
30
+ "@turing-machine-js/machine": "^7.0.0-alpha.2"
31
31
  },
32
32
  "scripts": {
33
33
  "build": "tsc --build --verbose tsconfig.build.json && node ../../scripts/build-node-entries.mjs --package=@turing-machine-js/library-binary-numbers",
@@ -44,5 +44,5 @@
44
44
  "default": "./dist/index.mjs"
45
45
  }
46
46
  },
47
- "gitHead": "a8228b8a5f7f9acd1f6219af80db86368848cdbc"
47
+ "gitHead": "163c0f818365241bac2c2de5e489124056703d8b"
48
48
  }
package/states.md CHANGED
@@ -2,139 +2,162 @@
2
2
 
3
3
  ## goToNumber
4
4
 
5
- *2 states (including `haltState`)*
5
+ *2 states; 2 transitions; has cycles*
6
6
 
7
7
  ```mermaid
8
8
  flowchart TD
9
9
  %% alphabets: [[" ","^","$","0","1"]]
10
10
  s0(((halt)))
11
- s1(("goToNumber"))
12
- s1 -- "$ → ·/S" --> s0
13
- s1 -- "* ·/R" --> s1
11
+ s1["goToNumber"]
12
+ idle([idle])
13
+ idle -. enter .-> s1
14
+ s1 -- "['$'] → [K]/[S]" --> s0
15
+ s1 -- "[*] → [K]/[R]" --> s1
14
16
  ```
15
17
 
16
18
  ## goToNextNumber
17
19
 
18
- *3 states (including `haltState`)*
20
+ *3 states; 3 transitions; has cycles*
19
21
 
20
22
  ```mermaid
21
23
  flowchart TD
22
24
  %% alphabets: [[" ","^","$","0","1"]]
23
25
  s0(((halt)))
24
26
  s1["goToNumber"]
25
- s2(("goToNextNumber"))
26
- s1 -- "$ → ·/S" --> s0
27
- s1 -- "* ·/R" --> s1
28
- s2 -- "*·/R" --> s1
27
+ s2["goToNextNumber"]
28
+ idle([idle])
29
+ idle -. enter .-> s2
30
+ s1 -- "['$'][K]/[S]" --> s0
31
+ s1 -- "[*] → [K]/[R]" --> s1
32
+ s2 -- "[*] → [K]/[R]" --> s1
29
33
  ```
30
34
 
31
35
  ## goToPreviousNumber
32
36
 
33
- *3 states (including `haltState`)*
37
+ *3 states; 3 transitions; has cycles*
34
38
 
35
39
  ```mermaid
36
40
  flowchart TD
37
41
  %% alphabets: [[" ","^","$","0","1"]]
38
42
  s0(((halt)))
39
43
  s3["goToPreviousNumberInternal"]
40
- s4(("goToPreviousNumber"))
41
- s3 -- "$ → ·/S" --> s0
42
- s3 -- "* ·/L" --> s3
43
- s4 -- "*·/L" --> s3
44
+ s4["goToPreviousNumber"]
45
+ idle([idle])
46
+ idle -. enter .-> s4
47
+ s3 -- "['$'][K]/[S]" --> s0
48
+ s3 -- "[*] → [K]/[L]" --> s3
49
+ s4 -- "[*] → [K]/[L]" --> s3
44
50
  ```
45
51
 
46
52
  ## deleteNumber
47
53
 
48
- *5 states (including `haltState`)*
54
+ *5 states; 6 transitions; 1 wrapper (max nesting depth 1); has cycles*
49
55
 
50
56
  ```mermaid
51
57
  flowchart TD
52
58
  %% alphabets: [[" ","^","$","0","1"]]
53
59
  s0(((halt)))
54
- s5["goToNumberStart"]
55
60
  s6["deleteNumberInternal"]
56
- s7["goToNumberStart>deleteNumberInternal"]
57
- s8(("deleteNumber"))
58
- s5 -- "^ → ·/S" --> s0
59
- s5 -- "* ·/L" --> s5
60
- s6 -- "$ → ⌫/S" --> s0
61
- s6 -- "* → ⌫/R" --> s6
62
- s7 -- "^ → ·/S" --> s0
63
- s7 -- "* ·/L" --> s5
64
- s7 -. onHalt .-> s6
65
- s8 -- "^|1|0|$ → ·/S" --> s7
66
- s8 -- "* → ·/S" --> s0
61
+ s8["deleteNumber"]
62
+ s7[["goToNumberStart(deleteNumberInternal)"]]
63
+ idle([idle])
64
+ subgraph w_5["callable subtree of goToNumberStart"]
65
+ s5["goToNumberStart"]
66
+ c5(((halt)))
67
+ end
68
+ idle -. enter .-> s8
69
+ s7 == "call" ==> s5
70
+ w_5 -. "return" .-> s7
71
+ s7 --> s6
72
+ s5 -- "['^'] → [K]/[S]" --> c5
73
+ s5 -- "[*] → [K]/[L]" --> s5
74
+ s6 -- "['$'] → [E]/[S]" --> s0
75
+ s6 -- "[*] → [E]/[R]" --> s6
76
+ s8 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s7
77
+ s8 -- "[*] → [K]/[S]" --> s0
67
78
  ```
68
79
 
69
80
  ## goToNumbersStart
70
81
 
71
- *2 states (including `haltState`)*
82
+ *2 states; 2 transitions; has cycles*
72
83
 
73
84
  ```mermaid
74
85
  flowchart TD
75
86
  %% alphabets: [[" ","^","$","0","1"]]
76
87
  s0(((halt)))
77
- s5(("goToNumberStart"))
78
- s5 -- "^ → ·/S" --> s0
79
- s5 -- "* ·/L" --> s5
88
+ s5["goToNumberStart"]
89
+ idle([idle])
90
+ idle -. enter .-> s5
91
+ s5 -- "['^'] → [K]/[S]" --> s0
92
+ s5 -- "[*] → [K]/[L]" --> s5
80
93
  ```
81
94
 
82
95
  ## invertNumber
83
96
 
84
- *5 states (including `haltState`)*
97
+ *5 states; 8 transitions; 1 wrapper (max nesting depth 1); has cycles*
85
98
 
86
99
  ```mermaid
87
100
  flowchart TD
88
101
  %% alphabets: [[" ","^","$","0","1"]]
89
102
  s0(((halt)))
90
- s5["goToNumberStart"]
91
103
  s9["invertNumberGoToNumberWithInversion"]
92
- s10["goToNumberStart>invertNumberGoToNumberWithInversion"]
93
- s11(("invertNumber"))
94
- s5 -- "^ → ·/S" --> s0
95
- s5 -- "* ·/L" --> s5
96
- s9 -- "^ → ·/R" --> s9
97
- s9 -- "1 → 0/R" --> s9
98
- s9 -- "0 → 1/R" --> s9
99
- s9 -- "$ ·/S" --> s0
100
- s10 -- "^ → ·/S" --> s0
101
- s10 -- "* → ·/L" --> s5
102
- s10 -. onHalt .-> s9
103
- s11 -- "^|1|0|$·/S" --> s10
104
- s11 -- "* → ·/S" --> s0
104
+ s11["invertNumber"]
105
+ s10[["goToNumberStart(invertNumberGoToNumberWithInversion)"]]
106
+ idle([idle])
107
+ subgraph w_5["callable subtree of goToNumberStart"]
108
+ s5["goToNumberStart"]
109
+ c5(((halt)))
110
+ end
111
+ idle -. enter .-> s11
112
+ s10 == "call" ==> s5
113
+ w_5 -. "return" .-> s10
114
+ s10 --> s9
115
+ s5 -- "['^'][K]/[S]" --> c5
116
+ s5 -- "[*][K]/[L]" --> s5
117
+ s9 -- "['^'] → [K]/[R]" --> s9
118
+ s9 -- "['1'] → ['0']/[R]" --> s9
119
+ s9 -- "['0'] → ['1']/[R]" --> s9
120
+ s9 -- "['$'] → [K]/[S]" --> s0
121
+ s11 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s10
122
+ s11 -- "[*] → [K]/[S]" --> s0
105
123
  ```
106
124
 
107
125
  ## normalizeNumber
108
126
 
109
- *7 states (including `haltState`)*
127
+ *7 states; 9 transitions; 1 wrapper (max nesting depth 1); has cycles*
110
128
 
111
129
  ```mermaid
112
130
  flowchart TD
113
131
  %% alphabets: [[" ","^","$","0","1"]]
114
132
  s0(((halt)))
115
133
  s1["goToNumber"]
116
- s5["goToNumberStart"]
117
134
  s12["normalizeNumberPutNewStartSymbol"]
118
135
  s13["normalizeNumberMoveNumberStart"]
119
- s14["goToNumberStart>normalizeNumberMoveNumberStart"]
120
- s15(("normalizeNumber"))
121
- s1 -- "$ → ·/S" --> s0
122
- s1 -- "* ·/R" --> s1
123
- s5 -- "^ → ·/S" --> s0
124
- s5 -- "* → ·/L" --> s5
125
- s12 -- "- → ^/S" --> s1
126
- s13 -- "^|0 ⌫/R" --> s13
127
- s13 -- "1|$ → ·/L" --> s12
128
- s14 -- "^ → ·/S" --> s0
129
- s14 -- "* → ·/L" --> s5
130
- s14 -. onHalt .-> s13
131
- s15 -- "^|1|0|$·/S" --> s14
132
- s15 -- "*·/S" --> s0
136
+ s15["normalizeNumber"]
137
+ s14[["goToNumberStart(normalizeNumberMoveNumberStart)"]]
138
+ idle([idle])
139
+ subgraph w_5["callable subtree of goToNumberStart"]
140
+ s5["goToNumberStart"]
141
+ c5(((halt)))
142
+ end
143
+ idle -. enter .-> s15
144
+ s14 == "call" ==> s5
145
+ w_5 -. "return" .-> s14
146
+ s14 --> s13
147
+ s1 -- "['$'] [K]/[S]" --> s0
148
+ s1 -- "[*][K]/[R]" --> s1
149
+ s5 -- "['^'][K]/[S]" --> c5
150
+ s5 -- "[*] → [K]/[L]" --> s5
151
+ s12 -- "[B] → ['^']/[S]" --> s1
152
+ s13 -- "['^']|['0'] → [E]/[R]" --> s13
153
+ s13 -- "['1']|['$'] → [K]/[L]" --> s12
154
+ s15 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s14
155
+ s15 -- "[*] → [K]/[S]" --> s0
133
156
  ```
134
157
 
135
158
  ## plusOne
136
159
 
137
- *5 states (including `haltState`)*
160
+ *5 states; 10 transitions; has cycles*
138
161
 
139
162
  ```mermaid
140
163
  flowchart TD
@@ -143,124 +166,142 @@ flowchart TD
143
166
  s16["plusOneFillZeros"]
144
167
  s17["plusOneAddNumberStart"]
145
168
  s18["plusOneCaryOne"]
146
- s19(("plusOne"))
147
- s16 -- "1 → 0/R" --> s16
148
- s16 -- "$ ·/S" --> s0
149
- s17 -- "-^/R" --> s17
150
- s17 -- "1·/R" --> s16
151
- s18 -- "01/R" --> s16
152
- s18 -- "1 → ·/L" --> s18
153
- s18 -- "^ → 1/L" --> s17
154
- s19 -- "^|1|0·/R" --> s19
155
- s19 -- "$·/L" --> s18
156
- s19 -- "*·/S" --> s0
169
+ s19["plusOne"]
170
+ idle([idle])
171
+ idle -. enter .-> s19
172
+ s16 -- "['1']['0']/[R]" --> s16
173
+ s16 -- "['$'][K]/[S]" --> s0
174
+ s17 -- "[B]['^']/[R]" --> s17
175
+ s17 -- "['1'][K]/[R]" --> s16
176
+ s18 -- "['0']['1']/[R]" --> s16
177
+ s18 -- "['1'][K]/[L]" --> s18
178
+ s18 -- "['^']['1']/[L]" --> s17
179
+ s19 -- "['^']|['1']|['0'][K]/[R]" --> s19
180
+ s19 -- "['$'] → [K]/[L]" --> s18
181
+ s19 -- "[*] → [K]/[S]" --> s0
157
182
  ```
158
183
 
159
184
  ## minusOne
160
185
 
161
- *17 states (including `haltState`)*
186
+ *18 states; 28 transitions; 5 wrappers (max nesting depth 3); has cycles*
162
187
 
163
188
  ```mermaid
164
189
  flowchart TD
165
190
  %% alphabets: [[" ","^","$","0","1"]]
166
191
  s0(((halt)))
167
192
  s1["goToNumber"]
168
- s5["goToNumberStart"]
169
193
  s9["invertNumberGoToNumberWithInversion"]
170
- s10["goToNumberStart>invertNumberGoToNumberWithInversion"]
171
194
  s12["normalizeNumberPutNewStartSymbol"]
172
195
  s13["normalizeNumberMoveNumberStart"]
173
- s14["goToNumberStart>normalizeNumberMoveNumberStart"]
174
196
  s15["normalizeNumber"]
175
- s16["plusOneFillZeros"]
176
- s17["plusOneAddNumberStart"]
177
- s18["plusOneCaryOne"]
178
- s19["plusOne"]
179
- s20["invertNumber>normalizeNumber"]
180
- s21["plusOne>invertNumber>normalizeNumber"]
181
- s22["invertNumber>plusOne>invertNumber>normalizeNumber"]
182
- s23(("minusOne"))
183
- s1 -- "$ → ·/S" --> s0
184
- s1 -- "* → ·/R" --> s1
185
- s5 -- "^ → ·/S" --> s0
186
- s5 -- "* ·/L" --> s5
187
- s9 -- "^ → ·/R" --> s9
188
- s9 -- "1 → 0/R" --> s9
189
- s9 -- "0 → 1/R" --> s9
190
- s9 -- "$ ·/S" --> s0
191
- s10 -- "^ → ·/S" --> s0
192
- s10 -- "* → ·/L" --> s5
193
- s10 -. onHalt .-> s9
194
- s12 -- "- → ^/S" --> s1
195
- s13 -- "^|0 → ⌫/R" --> s13
196
- s13 -- "1|$ → ·/L" --> s12
197
- s14 -- "^ ·/S" --> s0
198
- s14 -- "* ·/L" --> s5
199
- s14 -. onHalt .-> s13
200
- s15 -- "^|1|0|$ → ·/S" --> s14
201
- s15 -- "* ·/S" --> s0
202
- s16 -- "1 0/R" --> s16
203
- s16 -- "$ → ·/S" --> s0
204
- s17 -- "- → ^/R" --> s17
205
- s17 -- "1 → ·/R" --> s16
206
- s18 -- "0 → 1/R" --> s16
207
- s18 -- "1 → ·/L" --> s18
208
- s18 -- "^ → 1/L" --> s17
209
- s19 -- "^|1|0·/R" --> s19
210
- s19 -- "$·/L" --> s18
211
- s19 -- "*·/S" --> s0
212
- s20 -- "^|1|0|$·/S" --> s10
213
- s20 -- "*·/S" --> s0
214
- s20 -. onHalt .-> s15
215
- s21 -- "^|1|0 → ·/R" --> s19
216
- s21 -- "$ → ·/L" --> s18
217
- s21 -- "*·/S" --> s0
218
- s21 -. onHalt .-> s20
219
- s22 -- "^|1|0|$·/S" --> s10
220
- s22 -- "*·/S" --> s0
221
- s22 -. onHalt .-> s21
222
- s23 -- "^|1|0 → ·/R" --> s23
223
- s23 -- "$·/S" --> s22
224
- s23 -- "*·/S" --> s0
197
+ s23["minusOne"]
198
+ s10[["goToNumberStart(invertNumberGoToNumberWithInversion)"]]
199
+ s14[["goToNumberStart(normalizeNumberMoveNumberStart)"]]
200
+ s20[["invertNumber(normalizeNumber)"]]
201
+ s21[["plusOne(invertNumber(normalizeNumber))"]]
202
+ s22[["invertNumber(plusOne(invertNumber(normalizeNumber)))"]]
203
+ idle([idle])
204
+ subgraph w_5["callable subtree of goToNumberStart"]
205
+ s5["goToNumberStart"]
206
+ c5(((halt)))
207
+ end
208
+ subgraph w_11["callable subtree of invertNumber"]
209
+ s11["invertNumber"]
210
+ c11(((halt)))
211
+ end
212
+ subgraph w_19["callable subtree of plusOne"]
213
+ s16["plusOneFillZeros"]
214
+ s17["plusOneAddNumberStart"]
215
+ s18["plusOneCaryOne"]
216
+ s19["plusOne"]
217
+ c19(((halt)))
218
+ end
219
+ idle -. enter .-> s23
220
+ s10 & s14 == "call" ==> s5
221
+ s20 & s22 == "call" ==> s11
222
+ s21 == "call" ==> s19
223
+ w_5 -. "return" .-> s10 & s14
224
+ w_11 -. "return" .-> s20 & s22
225
+ w_19 -. "return" .-> s21
226
+ s10 --> s9
227
+ s14 --> s13
228
+ s20 --> s15
229
+ s21 --> s20
230
+ s22 --> s21
231
+ s1 -- "['$'][K]/[S]" --> s0
232
+ s1 -- "[*][K]/[R]" --> s1
233
+ s5 -- "['^'][K]/[S]" --> c5
234
+ s5 -- "[*][K]/[L]" --> s5
235
+ s9 -- "['^'][K]/[R]" --> s9
236
+ s9 -- "['1'] ['0']/[R]" --> s9
237
+ s9 -- "['0']['1']/[R]" --> s9
238
+ s9 -- "['$'][K]/[S]" --> s0
239
+ s11 -- "['^']|['1']|['0']|['$'][K]/[S]" --> s10
240
+ s11 -- "[*] [K]/[S]" --> c11
241
+ s12 -- "[B]['^']/[S]" --> s1
242
+ s13 -- "['^']|['0'][E]/[R]" --> s13
243
+ s13 -- "['1']|['$'] [K]/[L]" --> s12
244
+ s15 -- "['^']|['1']|['0']|['$'][K]/[S]" --> s14
245
+ s15 -- "[*][K]/[S]" --> s0
246
+ s16 -- "['1']['0']/[R]" --> s16
247
+ s16 -- "['$'] → [K]/[S]" --> c19
248
+ s17 -- "[B] → ['^']/[R]" --> s17
249
+ s17 -- "['1'] → [K]/[R]" --> s16
250
+ s18 -- "['0'] → ['1']/[R]" --> s16
251
+ s18 -- "['1'] → [K]/[L]" --> s18
252
+ s18 -- "['^'] → ['1']/[L]" --> s17
253
+ s19 -- "['^']|['1']|['0'] → [K]/[R]" --> s19
254
+ s19 -- "['$'] → [K]/[L]" --> s18
255
+ s19 -- "[*] → [K]/[S]" --> c19
256
+ s23 -- "['^']|['1']|['0'] → [K]/[R]" --> s23
257
+ s23 -- "['$'] → [K]/[S]" --> s22
258
+ s23 -- "[*] → [K]/[S]" --> s0
225
259
  ```
226
260
 
227
261
  ## minusOneFast
228
262
 
229
- *10 states (including `haltState`)*
263
+ *10 states; 15 transitions; 2 wrappers (max nesting depth 1); has cycles*
230
264
 
231
265
  ```mermaid
232
266
  flowchart TD
233
267
  %% alphabets: [[" ","^","$","0","1"]]
234
268
  s0(((halt)))
235
269
  s1["goToNumber"]
236
- s5["goToNumberStart"]
237
270
  s12["normalizeNumberPutNewStartSymbol"]
238
271
  s13["normalizeNumberMoveNumberStart"]
239
- s14["goToNumberStart>normalizeNumberMoveNumberStart"]
240
272
  s15["normalizeNumber"]
241
- s24["minusOneFastBorrow"]
242
- s25["minusOneFastBorrow>normalizeNumber"]
243
- s26(("minusOneFast"))
244
- s1 -- "$ → ·/S" --> s0
245
- s1 -- "* ·/R" --> s1
246
- s5 -- "^ → ·/S" --> s0
247
- s5 -- "* → ·/L" --> s5
248
- s12 -- "- → ^/S" --> s1
249
- s13 -- "^|0 ⌫/R" --> s13
250
- s13 -- "1|$ → ·/L" --> s12
251
- s14 -- "^ → ·/S" --> s0
252
- s14 -- "* → ·/L" --> s5
253
- s14 -. onHalt .-> s13
254
- s15 -- "^|1|0|$ → ·/S" --> s14
255
- s15 -- "* → ·/S" --> s0
256
- s24 -- "1 → 0/S" --> s0
257
- s24 -- "0 → 1/L" --> s24
258
- s24 -- "^ → ·/S" --> s0
259
- s25 -- "1 → 0/S" --> s0
260
- s25 -- "01/L" --> s24
261
- s25 -- "^·/S" --> s0
262
- s25 -. onHalt .-> s15
263
- s26 -- "^|1|0·/R" --> s26
264
- s26 -- "$·/L" --> s25
265
- s26 -- "*·/S" --> s0
273
+ s26["minusOneFast"]
274
+ s14[["goToNumberStart(normalizeNumberMoveNumberStart)"]]
275
+ s25[["minusOneFastBorrow(normalizeNumber)"]]
276
+ idle([idle])
277
+ subgraph w_5["callable subtree of goToNumberStart"]
278
+ s5["goToNumberStart"]
279
+ c5(((halt)))
280
+ end
281
+ subgraph w_24["callable subtree of minusOneFastBorrow"]
282
+ s24["minusOneFastBorrow"]
283
+ c24(((halt)))
284
+ end
285
+ idle -. enter .-> s26
286
+ s14 == "call" ==> s5
287
+ s25 == "call" ==> s24
288
+ w_5 -. "return" .-> s14
289
+ w_24 -. "return" .-> s25
290
+ s14 --> s13
291
+ s25 --> s15
292
+ s1 -- "['$'][K]/[S]" --> s0
293
+ s1 -- "[*][K]/[R]" --> s1
294
+ s5 -- "['^'] [K]/[S]" --> c5
295
+ s5 -- "[*][K]/[L]" --> s5
296
+ s12 -- "[B]['^']/[S]" --> s1
297
+ s13 -- "['^']|['0'][E]/[R]" --> s13
298
+ s13 -- "['1']|['$'] → [K]/[L]" --> s12
299
+ s15 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s14
300
+ s15 -- "[*] → [K]/[S]" --> s0
301
+ s24 -- "['1'] → ['0']/[S]" --> c24
302
+ s24 -- "['0'] → ['1']/[L]" --> s24
303
+ s24 -- "['^'] → [K]/[S]" --> c24
304
+ s26 -- "['^']|['1']|['0'] → [K]/[R]" --> s26
305
+ s26 -- "['$'] → [K]/[L]" --> s25
306
+ s26 -- "[*] → [K]/[S]" --> s0
266
307
  ```