@shd101wyy/yo 0.1.25 → 0.1.27

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.
Files changed (194) hide show
  1. package/.github/skills/yo-async-effects/SKILL.md +4 -4
  2. package/.github/skills/yo-async-effects/async-effects-recipes.md +40 -40
  3. package/.github/skills/yo-core-patterns/SKILL.md +1 -1
  4. package/.github/skills/yo-core-patterns/core-patterns-cheatsheet.md +30 -26
  5. package/.github/skills/yo-project-workflow/SKILL.md +6 -3
  6. package/.github/skills/yo-project-workflow/workflow-cheatsheet.md +34 -11
  7. package/.github/skills/yo-syntax/SKILL.md +7 -6
  8. package/.github/skills/yo-syntax/syntax-cheatsheet.md +78 -60
  9. package/.github/skills/yo-wasm-integration/wasm-integration-cheatsheet.md +3 -3
  10. package/README.md +10 -8
  11. package/out/cjs/index.cjs +583 -567
  12. package/out/cjs/yo-cli.cjs +664 -632
  13. package/out/cjs/yo-lsp.cjs +510 -485
  14. package/out/esm/index.mjs +538 -522
  15. package/out/types/src/codegen/codegen-c.d.ts +2 -2
  16. package/out/types/src/codegen/functions/collection.d.ts +2 -2
  17. package/out/types/src/codegen/functions/context.d.ts +3 -2
  18. package/out/types/src/codegen/types/collection.d.ts +2 -2
  19. package/out/types/src/codegen/utils/index.d.ts +3 -1
  20. package/out/types/src/doc/builder.d.ts +2 -2
  21. package/out/types/src/evaluator/calls/closure-type.d.ts +2 -2
  22. package/out/types/src/evaluator/calls/record-type.d.ts +11 -0
  23. package/out/types/src/evaluator/context.d.ts +8 -9
  24. package/out/types/src/evaluator/index.d.ts +3 -3
  25. package/out/types/src/evaluator/types/record.d.ts +14 -0
  26. package/out/types/src/evaluator/types/validation.d.ts +2 -2
  27. package/out/types/src/evaluator/values/anonymous-module.d.ts +5 -5
  28. package/out/types/src/evaluator/values/impl.d.ts +1 -1
  29. package/out/types/src/expr.d.ts +1 -4
  30. package/out/types/src/formatter.d.ts +11 -0
  31. package/out/types/src/function-value.d.ts +1 -1
  32. package/out/types/src/lsp/document-manager.d.ts +1 -1
  33. package/out/types/src/lsp/formatting.d.ts +2 -0
  34. package/out/types/src/module-manager.d.ts +3 -3
  35. package/out/types/src/tests/formatter.test.d.ts +1 -0
  36. package/out/types/src/types/creators.d.ts +3 -4
  37. package/out/types/src/types/definitions.d.ts +8 -19
  38. package/out/types/src/types/guards.d.ts +3 -3
  39. package/out/types/src/types/tags.d.ts +0 -1
  40. package/out/types/src/types/utils.d.ts +1 -1
  41. package/out/types/src/value-tag.d.ts +0 -1
  42. package/out/types/src/value.d.ts +6 -13
  43. package/out/types/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +1 -1
  45. package/std/alg/hash.yo +13 -21
  46. package/std/allocator.yo +25 -40
  47. package/std/async.yo +3 -7
  48. package/std/build.yo +105 -151
  49. package/std/cli/arg_parser.yo +184 -169
  50. package/std/collections/array_list.yo +350 -314
  51. package/std/collections/btree_map.yo +142 -131
  52. package/std/collections/deque.yo +132 -128
  53. package/std/collections/hash_map.yo +542 -566
  54. package/std/collections/hash_set.yo +623 -687
  55. package/std/collections/linked_list.yo +275 -293
  56. package/std/collections/ordered_map.yo +113 -85
  57. package/std/collections/priority_queue.yo +73 -73
  58. package/std/crypto/md5.yo +191 -95
  59. package/std/crypto/random.yo +56 -64
  60. package/std/crypto/sha256.yo +151 -107
  61. package/std/encoding/base64.yo +87 -81
  62. package/std/encoding/hex.yo +43 -50
  63. package/std/encoding/html.yo +56 -81
  64. package/std/encoding/html_char_utils.yo +7 -13
  65. package/std/encoding/html_entities.yo +2248 -2253
  66. package/std/encoding/json.yo +316 -224
  67. package/std/encoding/punycode.yo +86 -116
  68. package/std/encoding/toml.yo +67 -66
  69. package/std/encoding/utf16.yo +37 -44
  70. package/std/env.yo +62 -91
  71. package/std/error.yo +12 -20
  72. package/std/fmt/display.yo +5 -9
  73. package/std/fmt/index.yo +8 -14
  74. package/std/fmt/to_string.yo +330 -315
  75. package/std/fmt/writer.yo +58 -87
  76. package/std/fs/dir.yo +83 -102
  77. package/std/fs/file.yo +147 -180
  78. package/std/fs/metadata.yo +45 -78
  79. package/std/fs/temp.yo +55 -65
  80. package/std/fs/types.yo +27 -40
  81. package/std/fs/walker.yo +53 -68
  82. package/std/gc.yo +5 -8
  83. package/std/glob.yo +30 -43
  84. package/std/http/client.yo +107 -120
  85. package/std/http/http.yo +106 -96
  86. package/std/http/index.yo +4 -6
  87. package/std/imm/list.yo +88 -93
  88. package/std/imm/map.yo +528 -464
  89. package/std/imm/set.yo +52 -57
  90. package/std/imm/sorted_map.yo +340 -286
  91. package/std/imm/sorted_set.yo +57 -63
  92. package/std/imm/string.yo +404 -345
  93. package/std/imm/vec.yo +173 -181
  94. package/std/io/reader.yo +3 -6
  95. package/std/io/writer.yo +4 -8
  96. package/std/libc/assert.yo +5 -9
  97. package/std/libc/ctype.yo +32 -22
  98. package/std/libc/dirent.yo +26 -25
  99. package/std/libc/errno.yo +164 -90
  100. package/std/libc/fcntl.yo +52 -45
  101. package/std/libc/float.yo +66 -44
  102. package/std/libc/limits.yo +42 -33
  103. package/std/libc/math.yo +53 -82
  104. package/std/libc/signal.yo +72 -47
  105. package/std/libc/stdatomic.yo +217 -188
  106. package/std/libc/stdint.yo +5 -29
  107. package/std/libc/stdio.yo +5 -29
  108. package/std/libc/stdlib.yo +32 -39
  109. package/std/libc/string.yo +5 -23
  110. package/std/libc/sys/stat.yo +58 -56
  111. package/std/libc/time.yo +5 -19
  112. package/std/libc/unistd.yo +5 -20
  113. package/std/libc/wctype.yo +6 -9
  114. package/std/libc/windows.yo +26 -30
  115. package/std/log.yo +41 -55
  116. package/std/net/addr.yo +102 -97
  117. package/std/net/dns.yo +27 -28
  118. package/std/net/errors.yo +50 -49
  119. package/std/net/tcp.yo +113 -124
  120. package/std/net/udp.yo +55 -66
  121. package/std/os/env.yo +35 -33
  122. package/std/os/signal.yo +15 -25
  123. package/std/path.yo +276 -311
  124. package/std/prelude.yo +6316 -4333
  125. package/std/process/command.yo +87 -103
  126. package/std/process/index.yo +12 -31
  127. package/std/regex/compiler.yo +196 -95
  128. package/std/regex/flags.yo +58 -39
  129. package/std/regex/index.yo +157 -173
  130. package/std/regex/match.yo +20 -31
  131. package/std/regex/node.yo +134 -152
  132. package/std/regex/parser.yo +283 -259
  133. package/std/regex/unicode.yo +172 -202
  134. package/std/regex/vm.yo +155 -171
  135. package/std/string/index.yo +5 -7
  136. package/std/string/rune.yo +45 -55
  137. package/std/string/string.yo +937 -964
  138. package/std/string/string_builder.yo +94 -104
  139. package/std/string/unicode.yo +46 -64
  140. package/std/sync/channel.yo +72 -73
  141. package/std/sync/cond.yo +31 -36
  142. package/std/sync/mutex.yo +30 -32
  143. package/std/sync/once.yo +13 -16
  144. package/std/sync/rwlock.yo +26 -31
  145. package/std/sync/waitgroup.yo +20 -25
  146. package/std/sys/advise.yo +16 -24
  147. package/std/sys/bufio/buf_reader.yo +77 -93
  148. package/std/sys/bufio/buf_writer.yo +52 -65
  149. package/std/sys/clock.yo +4 -9
  150. package/std/sys/constants.yo +77 -61
  151. package/std/sys/copy.yo +4 -10
  152. package/std/sys/dir.yo +26 -43
  153. package/std/sys/dns.yo +41 -61
  154. package/std/sys/errors.yo +95 -103
  155. package/std/sys/events.yo +45 -57
  156. package/std/sys/externs.yo +319 -267
  157. package/std/sys/fallocate.yo +7 -11
  158. package/std/sys/fcntl.yo +14 -22
  159. package/std/sys/file.yo +26 -40
  160. package/std/sys/future.yo +5 -8
  161. package/std/sys/iov.yo +12 -25
  162. package/std/sys/lock.yo +12 -13
  163. package/std/sys/mmap.yo +38 -43
  164. package/std/sys/path.yo +3 -8
  165. package/std/sys/perm.yo +7 -21
  166. package/std/sys/pipe.yo +5 -12
  167. package/std/sys/process.yo +23 -29
  168. package/std/sys/seek.yo +10 -12
  169. package/std/sys/signal.yo +7 -13
  170. package/std/sys/signals.yo +52 -35
  171. package/std/sys/socket.yo +63 -58
  172. package/std/sys/socketpair.yo +3 -6
  173. package/std/sys/sockinfo.yo +11 -20
  174. package/std/sys/statfs.yo +11 -34
  175. package/std/sys/statx.yo +25 -52
  176. package/std/sys/sysinfo.yo +15 -20
  177. package/std/sys/tcp.yo +62 -92
  178. package/std/sys/temp.yo +5 -9
  179. package/std/sys/time.yo +5 -15
  180. package/std/sys/timer.yo +6 -11
  181. package/std/sys/tty.yo +10 -18
  182. package/std/sys/udp.yo +22 -39
  183. package/std/sys/umask.yo +3 -6
  184. package/std/sys/unix.yo +33 -52
  185. package/std/testing/bench.yo +49 -52
  186. package/std/thread.yo +10 -15
  187. package/std/time/datetime.yo +105 -89
  188. package/std/time/duration.yo +43 -56
  189. package/std/time/instant.yo +13 -18
  190. package/std/time/sleep.yo +5 -9
  191. package/std/url/index.yo +184 -209
  192. package/std/worker.yo +6 -10
  193. package/out/types/src/evaluator/calls/module-type.d.ts +0 -11
  194. package/out/types/src/evaluator/types/module.d.ts +0 -19
@@ -10,92 +10,87 @@
10
10
  //! d.push_front(0);
11
11
  //! x := d.pop_front().unwrap(); // 0
12
12
  //! ```
13
-
14
- { GlobalAllocator, AllocError } :: import "../allocator";
13
+ { GlobalAllocator, AllocError } :: import("../allocator");
15
14
  { malloc, realloc, free } :: GlobalAllocator;
16
-
17
15
  /// Circular buffer supporting efficient push/pop at both front and back.
18
16
  Deque :: (fn(comptime(T) : Type) -> comptime(Type))(
19
17
  object(
20
- _buf : ?*(T),
21
- _head : usize,
22
- _tail : usize,
23
- _len : usize,
18
+ _buf : ?*(T),
19
+ _head : usize,
20
+ _tail : usize,
21
+ _len : usize,
24
22
  _capacity : usize
25
23
  )
26
24
  );
27
-
28
- impl(forall(T : Type), Deque(T),
25
+ impl(
26
+ forall(T : Type),
27
+ Deque(T),
29
28
  // Create an empty Deque.
30
29
  new : (fn() -> Self)(
31
- Self(_buf: .None, _head: usize(0), _tail: usize(0), _len: usize(0), _capacity: usize(0))
30
+ Self(_buf :.None, _head : usize(0), _tail : usize(0), _len : usize(0), _capacity : usize(0))
32
31
  ),
33
-
34
32
  // Number of elements currently stored.
35
- len : (fn(self: Self) -> usize)(
33
+ len : (fn(self : Self) -> usize)(
36
34
  self._len
37
35
  ),
38
-
39
36
  // True if the deque contains no elements.
40
- is_empty : (fn(self: Self) -> bool)(
41
- (self._len == usize(0))
37
+ is_empty : (fn(self : Self) -> bool)(
38
+ self._len == usize(0)
42
39
  ),
43
-
44
40
  // Ensure at least `min_cap` slots are available.
45
- _grow : (fn(self: Self, min_cap: usize) -> unit)({
41
+ _grow : (fn(self : Self, min_cap : usize) -> unit)({
46
42
  new_cap := cond(
47
43
  (self._capacity == usize(0)) => usize(8),
48
44
  true => (self._capacity * usize(2))
49
45
  );
50
- while (new_cap < min_cap), (new_cap = (new_cap * usize(2))), ();
46
+ while(new_cap < min_cap, new_cap = (new_cap * usize(2)), ());
51
47
  size := (new_cap * sizeof(T));
52
48
  new_buf := *(T)(malloc(size).unwrap());
53
49
  // Linearise existing elements into the new buffer
54
50
  i := usize(0);
55
- while (i < self._len), (i = (i + usize(1))), {
51
+ while(i < self._len, i = (i + usize(1)), {
56
52
  idx := ((self._head + i) % self._capacity);
57
53
  buf := self._buf.unwrap();
58
54
  consume((new_buf &+ i).* = (buf &+ idx).*);
59
- };
55
+ });
60
56
  // Drop old elements for RC types before freeing old buffer
61
57
  // (the copy above duped each element, so old slots still hold references)
62
58
  cond(
63
59
  Type.contains_rc_type(T) => {
64
60
  j := usize(0);
65
- while (j < self._len), (j = (j + usize(1))), {
61
+ while(j < self._len, j = (j + usize(1)), {
66
62
  old_idx := ((self._head + j) % self._capacity);
67
63
  old_buf := self._buf.unwrap();
68
64
  unsafe.drop((old_buf &+ old_idx).*);
69
- };
65
+ });
70
66
  },
71
67
  true => ()
72
68
  );
73
- match(self._buf,
69
+ match(
70
+ self._buf,
74
71
  .Some(p) => free(.Some(*(void)(p))),
75
- .None => ()
72
+ .None => ()
76
73
  );
77
- self._buf = .Some(new_buf);
78
- self._head = usize(0);
79
- self._tail = self._len;
74
+ self._buf =.Some(new_buf);
75
+ self._head = usize(0);
76
+ self._tail = self._len;
80
77
  self._capacity = new_cap;
81
78
  }),
82
-
83
79
  // Push an element to the back.
84
- push_back : (fn(self: Self, val: T) -> unit)({
80
+ push_back : (fn(self : Self, val : T) -> unit)({
85
81
  cond(
86
- (self._len == self._capacity) => self._grow((self._len + usize(1))),
82
+ (self._len == self._capacity) => self._grow(self._len + usize(1)),
87
83
  true => ()
88
84
  );
89
85
  buf := self._buf.unwrap();
90
86
  consume((buf &+ self._tail).* = val);
91
87
  self._tail = ((self._tail + usize(1)) % self._capacity);
92
- self._len = (self._len + usize(1));
88
+ self._len = (self._len + usize(1));
93
89
  }),
94
-
95
90
  // Push an element to the front.
96
- push_front : (fn(self: Self, val: T) -> unit)({
91
+ push_front : (fn(self : Self, val : T) -> unit)({
97
92
  cond(
98
- (self._len == self._capacity) => self._grow((self._len + usize(1))),
93
+ (self._len == self._capacity) => self._grow(self._len + usize(1)),
99
94
  true => ()
100
95
  );
101
96
  self._head = cond(
@@ -106,27 +101,25 @@ impl(forall(T : Type), Deque(T),
106
101
  consume((buf &+ self._head).* = val);
107
102
  self._len = (self._len + usize(1));
108
103
  }),
109
-
110
104
  // Remove and return the front element.
111
- pop_front : (fn(self: Self) -> ?T)(
105
+ pop_front : (fn(self : Self) -> ?(T))(
112
106
  cond(
113
- (self._len == usize(0)) => .None,
107
+ (self._len == usize(0)) =>.None,
114
108
  true => {
115
109
  buf := self._buf.unwrap();
116
110
  element_ptr := (buf &+ self._head);
117
111
  val := element_ptr.*;
118
112
  unsafe.drop(element_ptr.*);
119
113
  self._head = ((self._head + usize(1)) % self._capacity);
120
- self._len = (self._len - usize(1));
114
+ self._len = (self._len - usize(1));
121
115
  .Some(val)
122
116
  }
123
117
  )
124
118
  ),
125
-
126
119
  // Remove and return the back element.
127
- pop_back : (fn(self: Self) -> ?T)(
120
+ pop_back : (fn(self : Self) -> ?(T))(
128
121
  cond(
129
- (self._len == usize(0)) => .None,
122
+ (self._len == usize(0)) =>.None,
130
123
  true => {
131
124
  self._tail = cond(
132
125
  (self._tail == usize(0)) => (self._capacity - usize(1)),
@@ -141,11 +134,10 @@ impl(forall(T : Type), Deque(T),
141
134
  }
142
135
  )
143
136
  ),
144
-
145
137
  // Get an element by logical index (0 = front).
146
- get : (fn(self: Self, index: usize) -> ?T)(
138
+ get : (fn(self : Self, index : usize) -> ?(T))(
147
139
  cond(
148
- (index >= self._len) => .None,
140
+ (index >= self._len) =>.None,
149
141
  true => {
150
142
  buf := self._buf.unwrap();
151
143
  idx := ((self._head + index) % self._capacity);
@@ -154,112 +146,124 @@ impl(forall(T : Type), Deque(T),
154
146
  )
155
147
  )
156
148
  );
157
-
158
- impl(forall(T : Type), Deque(T), Dispose(
159
- dispose : (fn(self: Self) -> unit)({
160
- match(self._buf,
161
- .Some(p) => {
162
- cond(
163
- Type.contains_rc_type(T) => {
164
- i := usize(0);
165
- while (i < self._len), (i = (i + usize(1))), {
166
- idx := ((self._head + i) % self._capacity);
167
- unsafe.drop((p &+ idx).*);
168
- };
169
- },
170
- true => ()
171
- );
172
- free(.Some(*(void)(p)));
173
- self._buf = .None;
174
- },
175
- .None => ()
176
- );
177
- })
178
- ));
179
-
149
+ impl(
150
+ forall(T : Type),
151
+ Deque(T),
152
+ Dispose(
153
+ dispose : (fn(self : Self) -> unit)({
154
+ match(
155
+ self._buf,
156
+ .Some(p) => {
157
+ cond(
158
+ Type.contains_rc_type(T) => {
159
+ i := usize(0);
160
+ while(i < self._len, i = (i + usize(1)), {
161
+ idx := ((self._head + i) % self._capacity);
162
+ unsafe.drop((p &+ idx).*);
163
+ });
164
+ },
165
+ true => ()
166
+ );
167
+ free(.Some(*(void)(p)));
168
+ self._buf =.None;
169
+ },
170
+ .None => ()
171
+ );
172
+ })
173
+ )
174
+ );
180
175
  /**
181
- * Value iterator for Deque - yields elements by value (T)
182
- * Traverses the circular buffer in logical order.
183
- */
176
+ * Value iterator for Deque - yields elements by value (T)
177
+ * Traverses the circular buffer in logical order.
178
+ */
184
179
  DequeIter :: (fn(comptime(T) : Type) -> comptime(Type))(
185
180
  struct(
186
- _deque : Deque(T),
187
- _pos : usize,
181
+ _deque : Deque(T),
182
+ _pos : usize,
188
183
  _remaining : usize
189
184
  )
190
185
  );
191
-
192
- impl(forall(T : Type), DequeIter(T), Iterator(
193
- Item : T,
194
- next : (fn(self : *(Self)) -> Option(T))(
195
- cond(
196
- (self._remaining == usize(0)) => .None,
197
- true => {
198
- idx := ((self._deque._head + self._pos) % self._deque._capacity);
199
- buf := self._deque._buf.unwrap();
200
- value := (buf &+ idx).*;
201
- self._pos = (self._pos + usize(1));
202
- self._remaining = (self._remaining - usize(1));
203
- .Some(value)
204
- }
186
+ impl(
187
+ forall(T : Type),
188
+ DequeIter(T),
189
+ Iterator(
190
+ Item : T,
191
+ next : (fn(self : *(Self)) -> Option(T))(
192
+ cond(
193
+ (self._remaining == usize(0)) =>.None,
194
+ true => {
195
+ idx := ((self._deque._head + self._pos) % self._deque._capacity);
196
+ buf := self._deque._buf.unwrap();
197
+ value := (buf &+ idx).*;
198
+ self._pos = (self._pos + usize(1));
199
+ self._remaining = (self._remaining - usize(1));
200
+ .Some(value)
201
+ }
202
+ )
205
203
  )
206
204
  )
207
- ));
208
-
209
- impl(forall(T : Type), Deque(T),
205
+ );
206
+ impl(
207
+ forall(T : Type),
208
+ Deque(T),
210
209
  into_iter : (fn(self : Self) -> DequeIter(T))(
211
- DequeIter(T)(_deque: self, _pos: usize(0), _remaining: self._len)
210
+ DequeIter(T)(_deque : self, _pos : usize(0), _remaining : self._len)
212
211
  )
213
212
  );
214
-
215
213
  /**
216
- * Pointer iterator for Deque - yields pointers to elements (*(T))
217
- * Yields pointers into the circular buffer. Pointers are valid as long as
218
- * the deque is not modified during iteration.
219
- */
214
+ * Pointer iterator for Deque - yields pointers to elements (*(T))
215
+ * Yields pointers into the circular buffer. Pointers are valid as long as
216
+ * the deque is not modified during iteration.
217
+ */
220
218
  DequeIterPtr :: (fn(comptime(T) : Type) -> comptime(Type))(
221
219
  struct(
222
- _deque : Deque(T),
223
- _pos : usize,
220
+ _deque : Deque(T),
221
+ _pos : usize,
224
222
  _remaining : usize
225
223
  )
226
224
  );
227
-
228
- impl(forall(T : Type), DequeIterPtr(T), Iterator(
229
- Item : *(T),
230
- next : (fn(self : *(Self)) -> Option(*(T)))(
231
- cond(
232
- (self._remaining == usize(0)) => .None,
233
- true => {
234
- idx := ((self._deque._head + self._pos) % self._deque._capacity);
235
- buf := self._deque._buf.unwrap();
236
- element_ptr := (buf &+ idx);
237
- self._pos = (self._pos + usize(1));
238
- self._remaining = (self._remaining - usize(1));
239
- .Some(element_ptr)
240
- }
225
+ impl(
226
+ forall(T : Type),
227
+ DequeIterPtr(T),
228
+ Iterator(
229
+ Item : *(T),
230
+ next : (fn(self : *(Self)) -> Option(*(T)))(
231
+ cond(
232
+ (self._remaining == usize(0)) =>.None,
233
+ true => {
234
+ idx := ((self._deque._head + self._pos) % self._deque._capacity);
235
+ buf := self._deque._buf.unwrap();
236
+ element_ptr := (buf &+ idx);
237
+ self._pos = (self._pos + usize(1));
238
+ self._remaining = (self._remaining - usize(1));
239
+ .Some(element_ptr)
240
+ }
241
+ )
241
242
  )
242
243
  )
243
- ));
244
-
245
- impl(forall(T : Type), Deque(T),
244
+ );
245
+ impl(
246
+ forall(T : Type),
247
+ Deque(T),
246
248
  iter : (fn(self : *(Self)) -> DequeIterPtr(T))(
247
- DequeIterPtr(T)(_deque: self.*, _pos: usize(0), _remaining: self.*._len)
249
+ DequeIterPtr(T)(_deque : self.*, _pos : usize(0), _remaining : self.*._len)
248
250
  )
249
251
  );
250
-
251
- impl(forall(T : Type), Deque(T), Index(usize)(
252
- Output : T,
253
- index : (fn(self: *(Self), idx: usize) -> *(Self.Output))({
254
- assert((idx < self.*._len), "Deque: index out of bounds");
255
- buf := self.*._buf.unwrap();
256
- physical_idx := ((self.*._head + idx) % self.*._capacity);
257
- (buf &+ physical_idx)
258
- })
259
- ));
260
-
261
- export
252
+ impl(
253
+ forall(T : Type),
254
+ Deque(T),
255
+ Index(usize)(
256
+ Output : T,
257
+ index : (fn(self : *(Self), idx : usize) -> *(Self.Output))({
258
+ assert(idx < self.*._len, "Deque: index out of bounds");
259
+ buf := self.*._buf.unwrap();
260
+ physical_idx := ((self.*._head + idx) % self.*._capacity);
261
+ buf &+ physical_idx
262
+ })
263
+ )
264
+ );
265
+ export(
262
266
  Deque,
263
267
  DequeIter,
264
268
  DequeIterPtr
265
- ;
269
+ );