mt-lang 0.2.0 → 0.2.1

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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/docs/index.html +4 -3
  3. data/lib/milk_tea/base.rb +1 -1
  4. data/std/asset_pack.mt +267 -0
  5. data/std/async/libuv_runtime.mt +539 -0
  6. data/std/async/mailbox.mt +191 -0
  7. data/std/async/runtime.mt +87 -0
  8. data/std/async.mt +87 -0
  9. data/std/base64.mt +185 -0
  10. data/std/behavior_tree.mt +396 -0
  11. data/std/binary.mt +314 -0
  12. data/std/binary_heap.mt +157 -0
  13. data/std/bitset.mt +239 -0
  14. data/std/box2d.mt +535 -0
  15. data/std/bytes.mt +46 -0
  16. data/std/c/box2d.mt +1254 -0
  17. data/std/c/cgltf.mt +647 -0
  18. data/std/c/cjson.mt +106 -0
  19. data/std/c/crypto.mt +11 -0
  20. data/std/c/crypto_support.h +51 -0
  21. data/std/c/ctype.mt +19 -0
  22. data/std/c/ctype_bindgen.h +29 -0
  23. data/std/c/curl.mt +1223 -0
  24. data/std/c/enet.mt +473 -0
  25. data/std/c/errno.mt +41 -0
  26. data/std/c/errno_bindgen.h +53 -0
  27. data/std/c/flecs.mt +2945 -0
  28. data/std/c/fs.linux.mt +43 -0
  29. data/std/c/fs.windows.mt +43 -0
  30. data/std/c/fs_support.h +954 -0
  31. data/std/c/gl.mt +2065 -0
  32. data/std/c/gl_registry_helpers.h +10748 -0
  33. data/std/c/glfw.mt +499 -0
  34. data/std/c/libc.mt +167 -0
  35. data/std/c/libuv.mt +1491 -0
  36. data/std/c/math.mt +22 -0
  37. data/std/c/math_bindgen.h +31 -0
  38. data/std/c/miniaudio.mt +3420 -0
  39. data/std/c/pcre2.mt +735 -0
  40. data/std/c/process.mt +58 -0
  41. data/std/c/process_support.h +1147 -0
  42. data/std/c/raygui.mt +1602 -0
  43. data/std/c/raylib.mt +1245 -0
  44. data/std/c/raymath.mt +163 -0
  45. data/std/c/rlgl.mt +434 -0
  46. data/std/c/rpng.mt +60 -0
  47. data/std/c/rres.mt +187 -0
  48. data/std/c/sdl3.mt +4132 -0
  49. data/std/c/sqlite3.mt +951 -0
  50. data/std/c/stb_image.mt +52 -0
  51. data/std/c/stb_image_resize2.mt +128 -0
  52. data/std/c/stb_image_write.mt +19 -0
  53. data/std/c/stb_rect_pack.mt +38 -0
  54. data/std/c/stb_truetype.mt +175 -0
  55. data/std/c/stb_vorbis.mt +31 -0
  56. data/std/c/stdio.mt +90 -0
  57. data/std/c/steamworks.h +5769 -0
  58. data/std/c/steamworks.mt +4771 -0
  59. data/std/c/string.mt +16 -0
  60. data/std/c/string_bindgen.h +36 -0
  61. data/std/c/sync.mt +33 -0
  62. data/std/c/sync_support.h +219 -0
  63. data/std/c/terminal.mt +24 -0
  64. data/std/c/terminal_support.h +408 -0
  65. data/std/c/time.mt +26 -0
  66. data/std/c/tls.mt +24 -0
  67. data/std/c/tls_support.h +626 -0
  68. data/std/c/tracy.mt +53 -0
  69. data/std/c/zlib.mt +20 -0
  70. data/std/c/zlib_support.h +239 -0
  71. data/std/c/zstd.mt +231 -0
  72. data/std/cell.mt +60 -0
  73. data/std/cgltf.mt +115 -0
  74. data/std/cjson.mt +90 -0
  75. data/std/cli.mt +768 -0
  76. data/std/cookie.mt +198 -0
  77. data/std/counter.mt +160 -0
  78. data/std/crypto.mt +74 -0
  79. data/std/cstring.mt +13 -0
  80. data/std/ctype.mt +52 -0
  81. data/std/curl/runtime.mt +261 -0
  82. data/std/curl.mt +38 -0
  83. data/std/deque.mt +348 -0
  84. data/std/encoding.mt +93 -0
  85. data/std/enet.mt +133 -0
  86. data/std/env.mt +41 -0
  87. data/std/errno.mt +47 -0
  88. data/std/flecs.mt +978 -0
  89. data/std/fmt.mt +271 -0
  90. data/std/fs.linux.mt +696 -0
  91. data/std/fs.windows.mt +711 -0
  92. data/std/fsm.mt +267 -0
  93. data/std/gl.mt +2062 -0
  94. data/std/glfw.mt +471 -0
  95. data/std/goap.mt +342 -0
  96. data/std/graph.mt +521 -0
  97. data/std/gzip.mt +77 -0
  98. data/std/hash.mt +429 -0
  99. data/std/http/server.mt +810 -0
  100. data/std/http.mt +1227 -0
  101. data/std/intern.mt +53 -0
  102. data/std/jobs.mt +288 -0
  103. data/std/json.mt +627 -0
  104. data/std/libc.mt +34 -0
  105. data/std/libuv.mt +554 -0
  106. data/std/linear_algebra.mt +243 -0
  107. data/std/linked_map.mt +372 -0
  108. data/std/linked_map_view.mt +49 -0
  109. data/std/linked_set.mt +117 -0
  110. data/std/log.mt +69 -0
  111. data/std/map.mt +418 -0
  112. data/std/math.mt +24 -0
  113. data/std/mem/arena.mt +137 -0
  114. data/std/mem/endian.mt +51 -0
  115. data/std/mem/heap.mt +298 -0
  116. data/std/mem/pool.mt +164 -0
  117. data/std/mem/stack.mt +47 -0
  118. data/std/mem/tracking.mt +119 -0
  119. data/std/miniaudio.mt +1299 -0
  120. data/std/multiset.mt +191 -0
  121. data/std/net/channel.mt +727 -0
  122. data/std/net/clock.mt +237 -0
  123. data/std/net/discovery.mt +277 -0
  124. data/std/net/lobby.mt +813 -0
  125. data/std/net/manager.mt +539 -0
  126. data/std/net/mux.mt +839 -0
  127. data/std/net/nat.mt +122 -0
  128. data/std/net/packet.mt +219 -0
  129. data/std/net/punch.mt +162 -0
  130. data/std/net/rpc.mt +119 -0
  131. data/std/net/session.mt +1157 -0
  132. data/std/net/stun.mt +252 -0
  133. data/std/net/sync.mt +183 -0
  134. data/std/net/turn.mt +459 -0
  135. data/std/net.mt +2944 -0
  136. data/std/oauth2.mt +408 -0
  137. data/std/option.mt +51 -0
  138. data/std/ordered_map.mt +497 -0
  139. data/std/ordered_set.mt +348 -0
  140. data/std/path.mt +368 -0
  141. data/std/pcre2/runtime.mt +35 -0
  142. data/std/pcre2.mt +78 -0
  143. data/std/priority_queue.mt +55 -0
  144. data/std/process.mt +837 -0
  145. data/std/queue.mt +55 -0
  146. data/std/random.mt +146 -0
  147. data/std/raygui.mt +99 -0
  148. data/std/raylib/debug_console.mt +71 -0
  149. data/std/raylib/easing.mt +388 -0
  150. data/std/raylib/packed_assets.mt +255 -0
  151. data/std/raylib/runtime.mt +30 -0
  152. data/std/raylib/tracy_gpu.mt +37 -0
  153. data/std/raylib.mt +1510 -0
  154. data/std/raymath.mt +153 -0
  155. data/std/result.mt +89 -0
  156. data/std/rlgl.mt +268 -0
  157. data/std/rpng.mt +46 -0
  158. data/std/rres.mt +36 -0
  159. data/std/sdl3/runtime.mt +54 -0
  160. data/std/sdl3.mt +1731 -0
  161. data/std/serialize.mt +68 -0
  162. data/std/set.mt +124 -0
  163. data/std/spatial.mt +176 -0
  164. data/std/sqlite3.mt +151 -0
  165. data/std/stack.mt +55 -0
  166. data/std/stb_image.mt +47 -0
  167. data/std/stb_image_resize2.mt +41 -0
  168. data/std/stb_image_write.mt +17 -0
  169. data/std/stb_rect_pack.mt +15 -0
  170. data/std/stb_truetype.mt +77 -0
  171. data/std/stb_vorbis.mt +16 -0
  172. data/std/stdio.mt +88 -0
  173. data/std/steamworks.mt +1542 -0
  174. data/std/str.mt +293 -0
  175. data/std/string.mt +234 -0
  176. data/std/sync.mt +194 -0
  177. data/std/tar.mt +704 -0
  178. data/std/terminal.mt +1002 -0
  179. data/std/testing.mt +266 -0
  180. data/std/thread.mt +120 -0
  181. data/std/time.mt +105 -0
  182. data/std/tls.mt +616 -0
  183. data/std/toml.mt +1310 -0
  184. data/std/tracy.mt +42 -0
  185. data/std/uri.mt +118 -0
  186. data/std/url.mt +372 -0
  187. data/std/vec.mt +433 -0
  188. data/std/zstd.mt +94 -0
  189. metadata +187 -2
@@ -0,0 +1,497 @@
1
+ import std.mem.heap as heap
2
+
3
+ struct Node[K, V]:
4
+ key: K
5
+ value: V
6
+ left: ptr[Node[K, V]]?
7
+ right: ptr[Node[K, V]]?
8
+ parent: ptr[Node[K, V]]?
9
+ height: int
10
+
11
+ struct SearchResult[K, V]:
12
+ node: ptr[Node[K, V]]?
13
+ parent: ptr[Node[K, V]]?
14
+ compare: int
15
+ found: bool
16
+
17
+ public struct Entry[K, V]:
18
+ key: const_ptr[K]
19
+ value: ptr[V]
20
+
21
+ public struct RemovedEntry[K, V]:
22
+ key: K
23
+ value: V
24
+
25
+ public struct Keys[K, V]:
26
+ node: ptr[Node[K, V]]?
27
+
28
+ public struct Values[K, V]:
29
+ node: ptr[Node[K, V]]?
30
+
31
+ public struct Entries[K, V]:
32
+ node: ptr[Node[K, V]]?
33
+ started: bool
34
+
35
+ public struct OrderedMap[K, V]:
36
+ root: ptr[Node[K, V]]?
37
+ len: ptr_uint
38
+
39
+
40
+ extending OrderedMap[K, V]:
41
+ public static function create() -> OrderedMap[K, V]:
42
+ return OrderedMap[K, V](root = null, len = 0)
43
+
44
+
45
+ static function height(node: ptr[Node[K, V]]?) -> int:
46
+ if node == null:
47
+ return 0
48
+
49
+ unsafe:
50
+ return read(ptr[Node[K, V]]<-node).height
51
+
52
+
53
+ static function update_height(node: ptr[Node[K, V]]) -> void:
54
+ let left_height = unsafe: OrderedMap[K, V].height(read(node).left)
55
+ let right_height = unsafe: OrderedMap[K, V].height(read(node).right)
56
+ var next_height = left_height
57
+ if right_height > next_height:
58
+ next_height = right_height
59
+
60
+ unsafe:
61
+ read(node).height = next_height + 1
62
+
63
+
64
+ static function balance_factor(node: ptr[Node[K, V]]?) -> int:
65
+ if node == null:
66
+ return 0
67
+
68
+ unsafe:
69
+ return OrderedMap[
70
+ K,
71
+ V
72
+ ].height(read(ptr[Node[K, V]]<-node).left) - OrderedMap[K, V].height(read(ptr[Node[K, V]]<-node).right)
73
+
74
+
75
+ static function minimum(node: ptr[Node[K, V]]?) -> ptr[Node[K, V]]?:
76
+ var current = node
77
+ while current != null:
78
+ let left = unsafe: read(ptr[Node[K, V]]<-current).left else:
79
+ return current
80
+
81
+ current = left
82
+
83
+ return null
84
+
85
+
86
+ static function successor(node: ptr[Node[K, V]]?) -> ptr[Node[K, V]]?:
87
+ if node == null:
88
+ return null
89
+
90
+ let current = unsafe: ptr[Node[K, V]]<-node
91
+ let right = unsafe: read(current).right
92
+ if right != null:
93
+ return OrderedMap[K, V].minimum(right)
94
+
95
+ var child = node
96
+ var parent = unsafe: read(current).parent
97
+ while parent != null:
98
+ let parent_ptr = unsafe: ptr[Node[K, V]]<-parent
99
+ if unsafe: read(parent_ptr).left == child:
100
+ return parent
101
+
102
+ child = parent
103
+ parent = unsafe: read(parent_ptr).parent
104
+
105
+ return null
106
+
107
+
108
+ static function replace_child(
109
+ current: ref[OrderedMap[K, V]],
110
+ parent: ptr[Node[K, V]]?,
111
+ previous: ptr[Node[K, V]],
112
+ replacement: ptr[Node[K, V]]?
113
+ ) -> void:
114
+ if parent == null:
115
+ current.root = replacement
116
+ else:
117
+ unsafe:
118
+ let parent_ptr = ptr[Node[K, V]]<-parent
119
+ if read(parent_ptr).left == previous:
120
+ read(parent_ptr).left = replacement
121
+ else if read(parent_ptr).right == previous:
122
+ read(parent_ptr).right = replacement
123
+ else:
124
+ fatal(c"ordered_map.OrderedMap.replace_child missing previous child")
125
+
126
+ if replacement != null:
127
+ unsafe:
128
+ read(ptr[Node[K, V]]<-replacement).parent = parent
129
+
130
+
131
+ static function rotate_left(current: ref[OrderedMap[K, V]], node: ptr[Node[K, V]]) -> ptr[Node[K, V]]:
132
+ let pivot = unsafe: read(node).right else:
133
+ fatal(c"ordered_map.OrderedMap.rotate_left missing pivot")
134
+
135
+ let pivot_ptr = unsafe: ptr[Node[K, V]]<-pivot
136
+ let parent = unsafe: read(node).parent
137
+ let pivot_left = unsafe: read(pivot_ptr).left
138
+
139
+ unsafe:
140
+ read(node).right = pivot_left
141
+ if pivot_left != null:
142
+ unsafe:
143
+ read(ptr[Node[K, V]]<-pivot_left).parent = node
144
+
145
+ OrderedMap[K, V].replace_child(current, parent, node, pivot)
146
+
147
+ unsafe:
148
+ read(pivot_ptr).left = node
149
+ read(node).parent = pivot
150
+
151
+ OrderedMap[K, V].update_height(node)
152
+ OrderedMap[K, V].update_height(pivot_ptr)
153
+ return pivot_ptr
154
+
155
+
156
+ static function rotate_right(current: ref[OrderedMap[K, V]], node: ptr[Node[K, V]]) -> ptr[Node[K, V]]:
157
+ let pivot = unsafe: read(node).left else:
158
+ fatal(c"ordered_map.OrderedMap.rotate_right missing pivot")
159
+
160
+ let pivot_ptr = unsafe: ptr[Node[K, V]]<-pivot
161
+ let parent = unsafe: read(node).parent
162
+ let pivot_right = unsafe: read(pivot_ptr).right
163
+
164
+ unsafe:
165
+ read(node).left = pivot_right
166
+ if pivot_right != null:
167
+ unsafe:
168
+ read(ptr[Node[K, V]]<-pivot_right).parent = node
169
+
170
+ OrderedMap[K, V].replace_child(current, parent, node, pivot)
171
+
172
+ unsafe:
173
+ read(pivot_ptr).right = node
174
+ read(node).parent = pivot
175
+
176
+ OrderedMap[K, V].update_height(node)
177
+ OrderedMap[K, V].update_height(pivot_ptr)
178
+ return pivot_ptr
179
+
180
+
181
+ static function rebalance(current: ref[OrderedMap[K, V]], node: ptr[Node[K, V]]?) -> void:
182
+ var cursor = node
183
+ while cursor != null:
184
+ let cursor_ptr = unsafe: ptr[Node[K, V]]<-cursor
185
+ OrderedMap[K, V].update_height(cursor_ptr)
186
+
187
+ let balance = OrderedMap[K, V].balance_factor(cursor)
188
+ if balance > 1:
189
+ let left = unsafe: read(cursor_ptr).left
190
+ if OrderedMap[K, V].balance_factor(left) < 0:
191
+ if left == null:
192
+ fatal(c"ordered_map.OrderedMap.rebalance missing left child")
193
+ OrderedMap[K, V].rotate_left(current, unsafe: ptr[Node[K, V]]<-left)
194
+
195
+ let rotated = OrderedMap[K, V].rotate_right(current, cursor_ptr)
196
+ cursor = unsafe: read(rotated).parent
197
+ else if balance < -1:
198
+ let right = unsafe: read(cursor_ptr).right
199
+ if OrderedMap[K, V].balance_factor(right) > 0:
200
+ if right == null:
201
+ fatal(c"ordered_map.OrderedMap.rebalance missing right child")
202
+ OrderedMap[K, V].rotate_right(current, unsafe: ptr[Node[K, V]]<-right)
203
+
204
+ let rotated = OrderedMap[K, V].rotate_left(current, cursor_ptr)
205
+ cursor = unsafe: read(rotated).parent
206
+ else:
207
+ cursor = unsafe: read(cursor_ptr).parent
208
+
209
+
210
+ static function locate(current: OrderedMap[K, V], key: K) -> SearchResult[K, V]:
211
+ var parent: ptr[Node[K, V]]? = null
212
+ var node = current.root
213
+ var compare = 0
214
+ while node != null:
215
+ let node_ptr = unsafe: ptr[Node[K, V]]<-node
216
+ let stored = unsafe: const_ptr_of(read(node_ptr).key)
217
+ compare = order[K](key, stored)
218
+ if compare < 0:
219
+ parent = node
220
+ unsafe:
221
+ node = read(node_ptr).left
222
+ else if compare > 0:
223
+ parent = node
224
+ unsafe:
225
+ node = read(node_ptr).right
226
+ else:
227
+ return SearchResult[K, V](node = node, parent = parent, compare = 0, found = true)
228
+
229
+ return SearchResult[K, V](node = null, parent = parent, compare = compare, found = false)
230
+
231
+
232
+ static function release_subtree(node: ptr[Node[K, V]]?) -> void:
233
+ if node == null:
234
+ return
235
+
236
+ let node_ptr = unsafe: ptr[Node[K, V]]<-node
237
+ let left = unsafe: read(node_ptr).left
238
+ let right = unsafe: read(node_ptr).right
239
+ OrderedMap[K, V].release_subtree(left)
240
+ OrderedMap[K, V].release_subtree(right)
241
+ heap.release(node)
242
+
243
+
244
+ static function detach_node(current: ref[OrderedMap[K, V]], node: ptr[Node[K, V]]) -> ptr[Node[K, V]]?:
245
+ let left = unsafe: read(node).left
246
+ let right = unsafe: read(node).right
247
+ if left != null and right != null:
248
+ let successor = OrderedMap[K, V].minimum(right) else:
249
+ fatal(c"ordered_map.OrderedMap.detach_node missing successor")
250
+
251
+ let successor_ptr = unsafe: ptr[Node[K, V]]<-successor
252
+ unsafe:
253
+ read(node).key = read(successor_ptr).key
254
+ read(node).value = read(successor_ptr).value
255
+
256
+ return OrderedMap[K, V].detach_node(current, successor_ptr)
257
+
258
+ var child = left
259
+ if child == null:
260
+ child = right
261
+
262
+ let parent = unsafe: read(node).parent
263
+ OrderedMap[K, V].replace_child(current, parent, node, child)
264
+ heap.release(node)
265
+
266
+ if parent != null:
267
+ return parent
268
+
269
+ return child
270
+
271
+
272
+ public function len() -> ptr_uint:
273
+ return this.len
274
+
275
+
276
+ public function is_empty() -> bool:
277
+ return this.len == 0
278
+
279
+
280
+ public function get(key: K) -> ptr[V]?:
281
+ let location = OrderedMap[K, V].locate(this, key)
282
+ if not location.found:
283
+ return null
284
+
285
+ let node = location.node else:
286
+ fatal(c"ordered_map.OrderedMap.get missing node")
287
+
288
+ unsafe:
289
+ return ptr_of(read(ptr[Node[K, V]]<-node).value)
290
+
291
+
292
+ public function at(key: K) -> Option[V]:
293
+ let p = this.get(key) else:
294
+ return Option[V].none
295
+
296
+ unsafe:
297
+ return Option[V].some(value = read(p))
298
+
299
+
300
+ public function get_key(key: K) -> const_ptr[K]?:
301
+ let location = OrderedMap[K, V].locate(this, key)
302
+ if not location.found:
303
+ return null
304
+
305
+ let node = location.node else:
306
+ fatal(c"ordered_map.OrderedMap.get_key missing node")
307
+
308
+ unsafe:
309
+ return const_ptr_of(read(ptr[Node[K, V]]<-node).key)
310
+
311
+
312
+ public function iter() -> Entries[K, V]:
313
+ return this.entries()
314
+
315
+
316
+ public function keys() -> Keys[K, V]:
317
+ return Keys[K, V](node = OrderedMap[K, V].minimum(this.root))
318
+
319
+
320
+ public function values() -> Values[K, V]:
321
+ return Values[K, V](node = OrderedMap[K, V].minimum(this.root))
322
+
323
+
324
+ public function entries() -> Entries[K, V]:
325
+ return Entries[K, V](node = OrderedMap[K, V].minimum(this.root), started = false)
326
+
327
+
328
+ public function contains(key: K) -> bool:
329
+ return this.get(key) != null
330
+
331
+
332
+ public editable function clear() -> void:
333
+ OrderedMap[K, V].release_subtree(this.root)
334
+ this.root = null
335
+ this.len = 0
336
+
337
+
338
+ public editable function release() -> void:
339
+ this.clear()
340
+
341
+
342
+ public editable function set(key: K, value: V) -> Option[V]:
343
+ let location = OrderedMap[K, V].locate(this, key)
344
+ if location.found:
345
+ let node = location.node else:
346
+ fatal(c"ordered_map.OrderedMap.set missing node")
347
+
348
+ unsafe:
349
+ let node_ptr = ptr[Node[K, V]]<-node
350
+ let previous = read(node_ptr).value
351
+ read(node_ptr).value = value
352
+ return Option[V].some(value = previous)
353
+
354
+ let node = heap.must_alloc[Node[K, V]](1)
355
+ unsafe:
356
+ read(node) = Node[K, V](
357
+ key = key,
358
+ value = value,
359
+ left = null,
360
+ right = null,
361
+ parent = location.parent,
362
+ height = 1
363
+ )
364
+
365
+ let parent = location.parent
366
+ if parent == null:
367
+ this.root = node
368
+ else:
369
+ unsafe:
370
+ let parent_ptr = ptr[Node[K, V]]<-parent
371
+ if location.compare < 0:
372
+ read(parent_ptr).left = node
373
+ else:
374
+ read(parent_ptr).right = node
375
+
376
+ this.len += 1
377
+ OrderedMap[K, V].rebalance(this, parent)
378
+ return Option[V].none
379
+
380
+
381
+ public editable function get_or_insert(key: K, value: V) -> ptr[V]:
382
+ let location = OrderedMap[K, V].locate(this, key)
383
+ if location.found:
384
+ let node = location.node else:
385
+ fatal(c"ordered_map.OrderedMap.get_or_insert missing node")
386
+
387
+ unsafe:
388
+ return ptr_of(read(ptr[Node[K, V]]<-node).value)
389
+
390
+ let node = heap.must_alloc[Node[K, V]](1)
391
+ unsafe:
392
+ read(node) = Node[K, V](
393
+ key = key,
394
+ value = value,
395
+ left = null,
396
+ right = null,
397
+ parent = location.parent,
398
+ height = 1
399
+ )
400
+
401
+ let parent = location.parent
402
+ if parent == null:
403
+ this.root = node
404
+ else:
405
+ unsafe:
406
+ let parent_ptr = ptr[Node[K, V]]<-parent
407
+ if location.compare < 0:
408
+ read(parent_ptr).left = node
409
+ else:
410
+ read(parent_ptr).right = node
411
+
412
+ this.len += 1
413
+ OrderedMap[K, V].rebalance(this, parent)
414
+
415
+ unsafe:
416
+ return ptr_of(read(node).value)
417
+
418
+
419
+ public editable function remove_entry(key: K) -> Option[RemovedEntry[K, V]]:
420
+ let location = OrderedMap[K, V].locate(this, key)
421
+ if not location.found:
422
+ return Option[RemovedEntry[K, V]].none
423
+
424
+ let node = location.node else:
425
+ fatal(c"ordered_map.OrderedMap.remove_entry missing node")
426
+
427
+ let node_ptr = unsafe: ptr[Node[K, V]]<-node
428
+ let removed = unsafe: RemovedEntry[K, V](key = read(node_ptr).key, value = read(node_ptr).value)
429
+ let rebalance_from = OrderedMap[K, V].detach_node(this, node_ptr)
430
+ this.len -= 1
431
+ OrderedMap[K, V].rebalance(this, rebalance_from)
432
+ return Option[RemovedEntry[K, V]].some(value = removed)
433
+
434
+
435
+ public editable function remove(key: K) -> Option[V]:
436
+ let removed = this.remove_entry(key)
437
+ if removed.is_none():
438
+ return Option[V].none
439
+ return Option[V].some(value = removed.unwrap().value)
440
+
441
+
442
+ extending Keys[K, V]:
443
+ public function iter() -> Keys[K, V]:
444
+ return this
445
+
446
+
447
+ public editable function next() -> const_ptr[K]?:
448
+ let current = this.node else:
449
+ return null
450
+
451
+ this.node = OrderedMap[K, V].successor(current)
452
+
453
+ unsafe:
454
+ return const_ptr_of(read(ptr[Node[K, V]]<-current).key)
455
+
456
+
457
+ extending Values[K, V]:
458
+ public function iter() -> Values[K, V]:
459
+ return this
460
+
461
+
462
+ public editable function next() -> ptr[V]?:
463
+ let current = this.node else:
464
+ return null
465
+
466
+ this.node = OrderedMap[K, V].successor(current)
467
+
468
+ unsafe:
469
+ return ptr_of(read(ptr[Node[K, V]]<-current).value)
470
+
471
+
472
+ extending Entries[K, V]:
473
+ public function iter() -> Entries[K, V]:
474
+ return this
475
+
476
+
477
+ public editable function next() -> bool:
478
+ let current = this.node else:
479
+ return false
480
+
481
+ if not this.started:
482
+ this.started = true
483
+ return true
484
+
485
+ let next = OrderedMap[K, V].successor(current)
486
+ this.node = next
487
+ return next != null
488
+
489
+
490
+ public function current() -> Entry[K, V]:
491
+ let current = this.node
492
+ if current == null or not this.started:
493
+ fatal(c"ordered_map.Entries.current missing current node")
494
+
495
+ unsafe:
496
+ let node_ptr = ptr[Node[K, V]]<-current
497
+ return Entry[K, V](key = const_ptr_of(read(node_ptr).key), value = ptr_of(read(node_ptr).value))