@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
package/std/crypto/md5.yo CHANGED
@@ -8,127 +8,226 @@
8
8
  //!
9
9
  //! digest := md5_hex(data); // "5d41402abc4b2a76b9719d911017c592"
10
10
  //! ```
11
-
12
- { ArrayList } :: import "../collections/array_list";
13
- { hex_encode } :: import "../encoding/hex";
14
- open import "../string";
15
-
11
+ { ArrayList } :: import("../collections/array_list");
12
+ { hex_encode } :: import("../encoding/hex");
13
+ open(import("../string"));
16
14
  // ============================================================================
17
15
  // MD5 implementation
18
16
  // ============================================================================
19
-
20
17
  _T :: Array(u32, usize(64))(
21
- u32(0xd76aa478), u32(0xe8c7b756), u32(0x242070db), u32(0xc1bdceee),
22
- u32(0xf57c0faf), u32(0x4787c62a), u32(0xa8304613), u32(0xfd469501),
23
- u32(0x698098d8), u32(0x8b44f7af), u32(0xffff5bb1), u32(0x895cd7be),
24
- u32(0x6b901122), u32(0xfd987193), u32(0xa679438e), u32(0x49b40821),
25
- u32(0xf61e2562), u32(0xc040b340), u32(0x265e5a51), u32(0xe9b6c7aa),
26
- u32(0xd62f105d), u32(0x02441453), u32(0xd8a1e681), u32(0xe7d3fbc8),
27
- u32(0x21e1cde6), u32(0xc33707d6), u32(0xf4d50d87), u32(0x455a14ed),
28
- u32(0xa9e3e905), u32(0xfcefa3f8), u32(0x676f02d9), u32(0x8d2a4c8a),
29
- u32(0xfffa3942), u32(0x8771f681), u32(0x6d9d6122), u32(0xfde5380c),
30
- u32(0xa4beea44), u32(0x4bdecfa9), u32(0xf6bb4b60), u32(0xbebfbc70),
31
- u32(0x289b7ec6), u32(0xeaa127fa), u32(0xd4ef3085), u32(0x04881d05),
32
- u32(0xd9d4d039), u32(0xe6db99e5), u32(0x1fa27cf8), u32(0xc4ac5665),
33
- u32(0xf4292244), u32(0x432aff97), u32(0xab9423a7), u32(0xfc93a039),
34
- u32(0x655b59c3), u32(0x8f0ccc92), u32(0xffeff47d), u32(0x85845dd1),
35
- u32(0x6fa87e4f), u32(0xfe2ce6e0), u32(0xa3014314), u32(0x4e0811a1),
36
- u32(0xf7537e82), u32(0xbd3af235), u32(0x2ad7d2bb), u32(0xeb86d391)
18
+ u32(0xd76aa478),
19
+ u32(0xe8c7b756),
20
+ u32(0x242070db),
21
+ u32(0xc1bdceee),
22
+ u32(0xf57c0faf),
23
+ u32(0x4787c62a),
24
+ u32(0xa8304613),
25
+ u32(0xfd469501),
26
+ u32(0x698098d8),
27
+ u32(0x8b44f7af),
28
+ u32(0xffff5bb1),
29
+ u32(0x895cd7be),
30
+ u32(0x6b901122),
31
+ u32(0xfd987193),
32
+ u32(0xa679438e),
33
+ u32(0x49b40821),
34
+ u32(0xf61e2562),
35
+ u32(0xc040b340),
36
+ u32(0x265e5a51),
37
+ u32(0xe9b6c7aa),
38
+ u32(0xd62f105d),
39
+ u32(0x02441453),
40
+ u32(0xd8a1e681),
41
+ u32(0xe7d3fbc8),
42
+ u32(0x21e1cde6),
43
+ u32(0xc33707d6),
44
+ u32(0xf4d50d87),
45
+ u32(0x455a14ed),
46
+ u32(0xa9e3e905),
47
+ u32(0xfcefa3f8),
48
+ u32(0x676f02d9),
49
+ u32(0x8d2a4c8a),
50
+ u32(0xfffa3942),
51
+ u32(0x8771f681),
52
+ u32(0x6d9d6122),
53
+ u32(0xfde5380c),
54
+ u32(0xa4beea44),
55
+ u32(0x4bdecfa9),
56
+ u32(0xf6bb4b60),
57
+ u32(0xbebfbc70),
58
+ u32(0x289b7ec6),
59
+ u32(0xeaa127fa),
60
+ u32(0xd4ef3085),
61
+ u32(0x04881d05),
62
+ u32(0xd9d4d039),
63
+ u32(0xe6db99e5),
64
+ u32(0x1fa27cf8),
65
+ u32(0xc4ac5665),
66
+ u32(0xf4292244),
67
+ u32(0x432aff97),
68
+ u32(0xab9423a7),
69
+ u32(0xfc93a039),
70
+ u32(0x655b59c3),
71
+ u32(0x8f0ccc92),
72
+ u32(0xffeff47d),
73
+ u32(0x85845dd1),
74
+ u32(0x6fa87e4f),
75
+ u32(0xfe2ce6e0),
76
+ u32(0xa3014314),
77
+ u32(0x4e0811a1),
78
+ u32(0xf7537e82),
79
+ u32(0xbd3af235),
80
+ u32(0x2ad7d2bb),
81
+ u32(0xeb86d391)
37
82
  );
38
-
39
83
  _S :: Array(u32, usize(64))(
40
- u32(7), u32(12), u32(17), u32(22), u32(7), u32(12), u32(17), u32(22),
41
- u32(7), u32(12), u32(17), u32(22), u32(7), u32(12), u32(17), u32(22),
42
- u32(5), u32(9), u32(14), u32(20), u32(5), u32(9), u32(14), u32(20),
43
- u32(5), u32(9), u32(14), u32(20), u32(5), u32(9), u32(14), u32(20),
44
- u32(4), u32(11), u32(16), u32(23), u32(4), u32(11), u32(16), u32(23),
45
- u32(4), u32(11), u32(16), u32(23), u32(4), u32(11), u32(16), u32(23),
46
- u32(6), u32(10), u32(15), u32(21), u32(6), u32(10), u32(15), u32(21),
47
- u32(6), u32(10), u32(15), u32(21), u32(6), u32(10), u32(15), u32(21)
84
+ u32(7),
85
+ u32(12),
86
+ u32(17),
87
+ u32(22),
88
+ u32(7),
89
+ u32(12),
90
+ u32(17),
91
+ u32(22),
92
+ u32(7),
93
+ u32(12),
94
+ u32(17),
95
+ u32(22),
96
+ u32(7),
97
+ u32(12),
98
+ u32(17),
99
+ u32(22),
100
+ u32(5),
101
+ u32(9),
102
+ u32(14),
103
+ u32(20),
104
+ u32(5),
105
+ u32(9),
106
+ u32(14),
107
+ u32(20),
108
+ u32(5),
109
+ u32(9),
110
+ u32(14),
111
+ u32(20),
112
+ u32(5),
113
+ u32(9),
114
+ u32(14),
115
+ u32(20),
116
+ u32(4),
117
+ u32(11),
118
+ u32(16),
119
+ u32(23),
120
+ u32(4),
121
+ u32(11),
122
+ u32(16),
123
+ u32(23),
124
+ u32(4),
125
+ u32(11),
126
+ u32(16),
127
+ u32(23),
128
+ u32(4),
129
+ u32(11),
130
+ u32(16),
131
+ u32(23),
132
+ u32(6),
133
+ u32(10),
134
+ u32(15),
135
+ u32(21),
136
+ u32(6),
137
+ u32(10),
138
+ u32(15),
139
+ u32(21),
140
+ u32(6),
141
+ u32(10),
142
+ u32(15),
143
+ u32(21),
144
+ u32(6),
145
+ u32(10),
146
+ u32(15),
147
+ u32(21)
48
148
  );
49
-
50
- _rotl32 :: (fn(x: u32, n: u32) -> u32)(
51
- ((x << n) | (x >> (u32(32) - n)))
149
+ _rotl32 :: (fn(x : u32, n : u32) -> u32)(
150
+ (x << n) | (x >> (u32(32) - n))
52
151
  );
53
-
54
- _le32 :: (fn(p: *(u8)) -> u32)(
55
- ((u32(p.*) | (u32((p &+ usize(1)).*) << u32(8))) |
56
- ((u32((p &+ usize(2)).*) << u32(16)) | (u32((p &+ usize(3)).*) << u32(24))))
152
+ _le32 :: (fn(p : *(u8)) -> u32)(
153
+ (u32(p.*) | (u32((p &+ usize(1)).*) << u32(8))) |
154
+ ((u32((p &+ usize(2)).*) << u32(16)) | (u32((p &+ usize(3)).*) << u32(24)))
57
155
  );
58
-
59
- _md5_block :: (fn(block: *(u8), h: *(u32)) -> unit)({
156
+ _md5_block :: (fn(block : *(u8), h : *(u32)) -> unit)({
60
157
  a := (h &+ usize(0)).*;
61
158
  b := (h &+ usize(1)).*;
62
159
  c := (h &+ usize(2)).*;
63
160
  d := (h &+ usize(3)).*;
64
161
  i := usize(0);
65
- while (i < usize(64)), (i = (i + usize(1))), {
162
+ while(i < usize(64), i = (i + usize(1)), {
66
163
  fv := u32(0);
67
- g := usize(0);
164
+ g := usize(0);
68
165
  cond(
69
166
  (i < usize(16)) => {
70
- fv = ((b & c) | ((~b) & d));
71
- g = i;
167
+ fv = ((b & c) | ((~(b)) & d));
168
+ g = i;
72
169
  },
73
170
  (i < usize(32)) => {
74
- fv = ((d & b) | ((~d) & c));
75
- g = (((i * usize(5)) + usize(1)) % usize(16));
171
+ fv = ((d & b) | ((~(d)) & c));
172
+ g = (((i * usize(5)) + usize(1)) % usize(16));
76
173
  },
77
174
  (i < usize(48)) => {
78
175
  fv = ((b ^ c) ^ d);
79
- g = (((i * usize(3)) + usize(5)) % usize(16));
176
+ g = (((i * usize(3)) + usize(5)) % usize(16));
80
177
  },
81
178
  true => {
82
- fv = (c ^ (b | (~d)));
83
- g = ((i * usize(7)) % usize(16));
179
+ fv = (c ^ (b | (~(d))));
180
+ g = ((i * usize(7)) % usize(16));
84
181
  }
85
182
  );
86
- fv = (((fv + a) + _T(i)) + _le32((block &+ (g * usize(4)))));
87
- a = d;
88
- d = c;
89
- c = b;
90
- b = (b + _rotl32(fv, _S(i)));
91
- };
183
+ fv = (((fv + a) + _T(i)) + _le32(block &+ (g * usize(4))));
184
+ a = d;
185
+ d = c;
186
+ c = b;
187
+ b = (b + _rotl32(fv, _S(i)));
188
+ });
92
189
  (h &+ usize(0)).* = ((h &+ usize(0)).* + a);
93
190
  (h &+ usize(1)).* = ((h &+ usize(1)).* + b);
94
191
  (h &+ usize(2)).* = ((h &+ usize(2)).* + c);
95
192
  (h &+ usize(3)).* = ((h &+ usize(3)).* + d);
96
193
  });
97
-
98
194
  // Compute an MD5 digest over `data`.
99
- md5 :: (fn(data: ArrayList(u8)) -> Array(u8, usize(16)))({
195
+ md5 :: (fn(data : ArrayList(u8)) -> Array(u8, usize(16)))({
100
196
  h := Array(u32, usize(4))(
101
- u32(0x67452301), u32(0xefcdab89), u32(0x98badcfe), u32(0x10325476)
197
+ u32(0x67452301),
198
+ u32(0xefcdab89),
199
+ u32(0x98badcfe),
200
+ u32(0x10325476)
102
201
  );
103
202
  h_ptr := &(h(usize(0)));
104
- n := data.len();
203
+ n := data.len();
105
204
  // Process full blocks
106
205
  i := usize(0);
107
- while ((i + usize(64)) <= n), (i = (i + usize(64))), {
206
+ while((i + usize(64)) <= n, i = (i + usize(64)), {
108
207
  chunk_ptr := (*(u8)(data.ptr().unwrap()) &+ i);
109
208
  _md5_block(chunk_ptr, h_ptr);
110
- };
209
+ });
111
210
  // Final block(s) with padding
112
211
  pad_buf := Array(u8, usize(128)).fill(u8(0));
113
212
  pad_ptr := &(pad_buf(usize(0)));
114
213
  rem := (n - i);
115
214
  j := usize(0);
116
- while (j < rem), (j = (j + usize(1))), {
117
- (pad_ptr &+ j).* = data.get((i + j)).unwrap();
118
- };
215
+ while(j < rem, j = (j + usize(1)), {
216
+ (pad_ptr &+ j).* = data.get(i + j).unwrap();
217
+ });
119
218
  (pad_ptr &+ rem).* = u8(0x80);
120
219
  cond(
121
220
  (rem < usize(56)) => {
122
221
  // Length fits in this block
123
- bit_len := u64((n * usize(8)));
222
+ bit_len := u64(n * usize(8));
124
223
  (pad_ptr &+ usize(56)).* = u8(bit_len);
125
- (pad_ptr &+ usize(57)).* = u8((bit_len >> u64(8)));
126
- (pad_ptr &+ usize(58)).* = u8((bit_len >> u64(16)));
127
- (pad_ptr &+ usize(59)).* = u8((bit_len >> u64(24)));
128
- (pad_ptr &+ usize(60)).* = u8((bit_len >> u64(32)));
129
- (pad_ptr &+ usize(61)).* = u8((bit_len >> u64(40)));
130
- (pad_ptr &+ usize(62)).* = u8((bit_len >> u64(48)));
131
- (pad_ptr &+ usize(63)).* = u8((bit_len >> u64(56)));
224
+ (pad_ptr &+ usize(57)).* = u8(bit_len >> u64(8));
225
+ (pad_ptr &+ usize(58)).* = u8(bit_len >> u64(16));
226
+ (pad_ptr &+ usize(59)).* = u8(bit_len >> u64(24));
227
+ (pad_ptr &+ usize(60)).* = u8(bit_len >> u64(32));
228
+ (pad_ptr &+ usize(61)).* = u8(bit_len >> u64(40));
229
+ (pad_ptr &+ usize(62)).* = u8(bit_len >> u64(48));
230
+ (pad_ptr &+ usize(63)).* = u8(bit_len >> u64(56));
132
231
  _md5_block(pad_ptr, h_ptr);
133
232
  },
134
233
  true => {
@@ -136,42 +235,39 @@ md5 :: (fn(data: ArrayList(u8)) -> Array(u8, usize(16)))({
136
235
  _md5_block(pad_ptr, h_ptr);
137
236
  pad2 := Array(u8, usize(64)).fill(u8(0));
138
237
  pad2_ptr := &(pad2(usize(0)));
139
- bit_len := u64((n * usize(8)));
238
+ bit_len := u64(n * usize(8));
140
239
  (pad2_ptr &+ usize(56)).* = u8(bit_len);
141
- (pad2_ptr &+ usize(57)).* = u8((bit_len >> u64(8)));
142
- (pad2_ptr &+ usize(58)).* = u8((bit_len >> u64(16)));
143
- (pad2_ptr &+ usize(59)).* = u8((bit_len >> u64(24)));
144
- (pad2_ptr &+ usize(60)).* = u8((bit_len >> u64(32)));
145
- (pad2_ptr &+ usize(61)).* = u8((bit_len >> u64(40)));
146
- (pad2_ptr &+ usize(62)).* = u8((bit_len >> u64(48)));
147
- (pad2_ptr &+ usize(63)).* = u8((bit_len >> u64(56)));
240
+ (pad2_ptr &+ usize(57)).* = u8(bit_len >> u64(8));
241
+ (pad2_ptr &+ usize(58)).* = u8(bit_len >> u64(16));
242
+ (pad2_ptr &+ usize(59)).* = u8(bit_len >> u64(24));
243
+ (pad2_ptr &+ usize(60)).* = u8(bit_len >> u64(32));
244
+ (pad2_ptr &+ usize(61)).* = u8(bit_len >> u64(40));
245
+ (pad2_ptr &+ usize(62)).* = u8(bit_len >> u64(48));
246
+ (pad2_ptr &+ usize(63)).* = u8(bit_len >> u64(56));
148
247
  _md5_block(pad2_ptr, h_ptr);
149
248
  }
150
249
  );
151
250
  // Output little-endian digest
152
251
  digest := Array(u8, usize(16)).fill(u8(0));
153
252
  k := usize(0);
154
- while (k < usize(4)), (k = (k + usize(1))), {
253
+ while(k < usize(4), k = (k + usize(1)), {
155
254
  w := h(k);
156
- digest((k * usize(4))) = u8(w);
157
- digest(((k * usize(4)) + usize(1))) = u8((w >> u32(8)));
158
- digest(((k * usize(4)) + usize(2))) = u8((w >> u32(16)));
159
- digest(((k * usize(4)) + usize(3))) = u8((w >> u32(24)));
160
- };
255
+ digest(k * usize(4)) = u8(w);
256
+ digest((k * usize(4)) + usize(1)) = u8(w >> u32(8));
257
+ digest((k * usize(4)) + usize(2)) = u8(w >> u32(16));
258
+ digest((k * usize(4)) + usize(3)) = u8(w >> u32(24));
259
+ });
161
260
  digest
162
261
  });
163
-
164
- export md5;
165
-
262
+ export(md5);
166
263
  // Return the 32-character lowercase hex MD5 digest.
167
- md5_hex :: (fn(data: ArrayList(u8)) -> String)({
264
+ md5_hex :: (fn(data : ArrayList(u8)) -> String)({
168
265
  digest := md5(data);
169
- bytes := ArrayList(u8).with_capacity(usize(16));
266
+ bytes := ArrayList(u8).with_capacity(usize(16));
170
267
  i := usize(0);
171
- while (i < usize(16)), (i = (i + usize(1))), {
268
+ while(i < usize(16), i = (i + usize(1)), {
172
269
  bytes.push(digest(i));
173
- };
270
+ });
174
271
  hex_encode(bytes)
175
272
  });
176
-
177
- export md5_hex;
273
+ export(md5_hex);
@@ -9,56 +9,52 @@
9
9
  //!
10
10
  //! id := uuid_v4(); // "550e8400-e29b-41d4-a716-446655440000"
11
11
  //! ```
12
-
13
- { ArrayList } :: import "../collections/array_list";
14
- { platform, Platform } :: import "../process";
15
- open import "../string";
16
- { snprintf } :: import "../libc/stdio";
17
- { hex_encode } :: import "../encoding/hex";
18
- { Error, AnyError, Exception } :: import "../error";
19
- { ToString } :: import "../fmt";
20
-
12
+ { ArrayList } :: import("../collections/array_list");
13
+ { platform, Platform } :: import("../process");
14
+ open(import("../string"));
15
+ { snprintf } :: import("../libc/stdio");
16
+ { hex_encode } :: import("../encoding/hex");
17
+ { Error, AnyError, Exception } :: import("../error");
18
+ { ToString } :: import("../fmt");
21
19
  // ============================================================================
22
20
  // Error type
23
21
  // ============================================================================
24
-
25
22
  /// Errors that can occur during cryptographic random operations.
26
23
  CryptoError :: enum(
27
24
  /// Platform does not support secure random generation.
28
25
  Unavailable,
29
26
  /// Other platform-specific error.
30
- Other(msg: String)
27
+ Other(msg : String)
31
28
  );
32
-
33
- impl(CryptoError, ToString(
34
- to_string : (self ->
35
- match(self,
36
- .Unavailable => `crypto: platform random unavailable`,
37
- .Other(msg) => `crypto error: ${msg}`
29
+ impl(
30
+ CryptoError,
31
+ ToString(
32
+ to_string : (
33
+ self ->
34
+ match(
35
+ self,
36
+ .Unavailable => `crypto: platform random unavailable`,
37
+ .Other(msg) => `crypto error: ${msg}`
38
+ )
38
39
  )
39
40
  )
40
- ));
41
-
41
+ );
42
42
  impl(CryptoError, Error());
43
-
44
- export CryptoError;
45
-
43
+ export(CryptoError);
46
44
  // ============================================================================
47
45
  // Platform externs
48
46
  // ============================================================================
49
-
50
- extern "Yo",
51
- __yo_getrandom : (fn(buf: *(u8), buflen: usize, flags: u32) -> isize),
52
- __yo_arc4random_buf: (fn(buf: *(u8), nbytes: usize) -> unit),
53
- __yo_bcrypt_gen_random: (fn(buf: *(u8), size: u32) -> i32),
54
- __yo_getentropy: (fn(buf: *(u8), buflen: usize) -> i32)
55
- ;
56
-
47
+ extern(
48
+ "Yo",
49
+ __yo_getrandom : (fn(buf : *(u8), buflen : usize, flags : u32) -> isize),
50
+ __yo_arc4random_buf : (fn(buf : *(u8), nbytes : usize) -> unit),
51
+ __yo_bcrypt_gen_random : (fn(buf : *(u8), size : u32) -> i32),
52
+ __yo_getentropy : (fn(buf : *(u8), buflen : usize) -> i32)
53
+ );
57
54
  // ============================================================================
58
55
  // Fill a buffer with cryptographically secure random bytes.
59
56
  // ============================================================================
60
-
61
- random_bytes :: (fn(buf: *(u8), size: usize, using(exn : Exception)) -> unit)(
57
+ random_bytes :: (fn(buf : *(u8), size : usize, using(exn : Exception)) -> unit)(
62
58
  cond(
63
59
  (platform == Platform.Macos) => {
64
60
  __yo_arc4random_buf(buf, size);
@@ -67,82 +63,79 @@ random_bytes :: (fn(buf: *(u8), size: usize, using(exn : Exception)) -> unit)(
67
63
  r := __yo_bcrypt_gen_random(buf, u32(size));
68
64
  cond(
69
65
  (r == i32(0)) => (),
70
- true => { exn.throw(dyn CryptoError.Unavailable); }
66
+ true => {
67
+ exn.throw(dyn(CryptoError.Unavailable));
68
+ }
71
69
  );
72
70
  },
73
71
  ((platform == Platform.Emscripten) || (platform == Platform.Wasi)) => {
74
72
  // WASM/Emscripten/WASI: getentropy() via WASI random_get (max 256 bytes per call)
75
73
  remaining := size;
76
74
  offset := usize(0);
77
- while (remaining > usize(0)), {
75
+ while(remaining > usize(0), {
78
76
  chunk := cond(
79
77
  (remaining > usize(256)) => usize(256),
80
78
  true => remaining
81
79
  );
82
- ret := __yo_getentropy((buf &+ offset), chunk);
80
+ ret := __yo_getentropy(buf &+ offset, chunk);
83
81
  cond(
84
- (ret < i32(0)) => { exn.throw(dyn CryptoError.Unavailable); },
82
+ (ret < i32(0)) => {
83
+ exn.throw(dyn(CryptoError.Unavailable));
84
+ },
85
85
  true => ()
86
86
  );
87
87
  offset = (offset + chunk);
88
88
  remaining = (remaining - chunk);
89
- };
89
+ });
90
90
  },
91
91
  true => {
92
92
  // Linux: getrandom syscall
93
93
  ret := __yo_getrandom(buf, size, u32(0));
94
94
  cond(
95
- (ret < isize(0)) => { exn.throw(dyn CryptoError.Unavailable); },
95
+ (ret < isize(0)) => {
96
+ exn.throw(dyn(CryptoError.Unavailable));
97
+ },
96
98
  true => ()
97
99
  );
98
100
  }
99
101
  )
100
102
  );
101
-
102
- export random_bytes;
103
-
103
+ export(random_bytes);
104
104
  // ============================================================================
105
105
  // Typed helpers
106
106
  // ============================================================================
107
-
108
107
  random_u32 :: (fn(using(exn : Exception)) -> u32)({
109
108
  buf := Array(u8, usize(4)).fill(u8(0));
110
109
  buf_ptr := &(buf(usize(0)));
111
110
  random_bytes(buf_ptr, usize(4));
112
- (u32(buf(usize(0))) |
113
- (u32(buf(usize(1))) << u32(8)) |
114
- (u32(buf(usize(2))) << u32(16)) |
115
- (u32(buf(usize(3))) << u32(24)))
116
- });
117
-
111
+ u32(buf(usize(0))) |
112
+ (u32(buf(usize(1))) << u32(8)) |
113
+ (u32(buf(usize(2))) << u32(16)) |
114
+ (u32(buf(usize(3))) << u32(24))
115
+ });
118
116
  random_u64 :: (fn(using(exn : Exception)) -> u64)({
119
117
  lo := u64(random_u32());
120
118
  hi := u64(random_u32());
121
- (lo | (hi << u64(32)))
119
+ lo | (hi << u64(32))
122
120
  });
123
-
124
121
  random_f64 :: (fn(using(exn : Exception)) -> f64)(
125
- (f64(random_u64()) / f64(18446744073709551615.0))
122
+ f64(random_u64()) / f64(18446744073709551615.0)
126
123
  );
127
-
128
124
  // Return a random integer in the half-open range [min, max).
129
- random_range :: (fn(min: i64, max: i64, using(exn : Exception)) -> i64)({
125
+ random_range :: (fn(min : i64, max : i64, using(exn : Exception)) -> i64)({
130
126
  span := (max - min);
131
127
  cond(
132
128
  (span <= i64(0)) => min,
133
129
  true => {
134
130
  r := random_u64();
135
- (min + i64((r % u64(span))))
131
+ min + i64(r % u64(span))
136
132
  }
137
133
  )
138
134
  });
139
-
140
- export random_u32, random_u64, random_f64, random_range;
141
-
135
+ export(random_u32, random_u64, random_f64, random_range);
142
136
  // ============================================================================
143
137
  // UUID v4
144
138
  // ============================================================================
145
-
146
139
  // Generate a random UUID v4 string: "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
147
140
  uuid_v4 :: (fn(using(exn : Exception)) -> String)({
148
141
  bytes := ArrayList(u8).with_capacity(usize(16));
@@ -154,9 +147,9 @@ uuid_v4 :: (fn(using(exn : Exception)) -> String)({
154
147
  // Set variant bits
155
148
  buf(usize(8)) = ((buf(usize(8)) & u8(0x3F)) | u8(0x80));
156
149
  i := usize(0);
157
- while (i < usize(16)), (i = (i + usize(1))), {
150
+ while(i < usize(16), i = (i + usize(1)), {
158
151
  bytes.push(buf(i));
159
- };
152
+ });
160
153
  hex := hex_encode(bytes);
161
154
  hex_bytes := hex.as_bytes();
162
155
  // Insert dashes: 8-4-4-4-12
@@ -164,7 +157,7 @@ uuid_v4 :: (fn(using(exn : Exception)) -> String)({
164
157
  positions := Array(usize, usize(4))(usize(8), usize(12), usize(16), usize(20));
165
158
  j := usize(0);
166
159
  dash_idx := usize(0);
167
- while (j < hex_bytes.len()), (j = (j + usize(1))), {
160
+ while(j < hex_bytes.len(), j = (j + usize(1)), {
168
161
  cond(
169
162
  ((dash_idx < usize(4)) && (j == positions(dash_idx))) => {
170
163
  out.push(u8(45)); // '-'
@@ -173,8 +166,7 @@ uuid_v4 :: (fn(using(exn : Exception)) -> String)({
173
166
  true => ()
174
167
  );
175
168
  out.push(hex_bytes.get(j).unwrap());
176
- };
169
+ });
177
170
  String.from_bytes(out)
178
171
  });
179
-
180
- export uuid_v4;
172
+ export(uuid_v4);