@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
@@ -7,64 +7,111 @@
7
7
  //!
8
8
  //! digest := sha256_hex(data); // "2cf24dba..."
9
9
  //! ```
10
-
11
- { ArrayList } :: import "../collections/array_list";
12
- { hex_encode } :: import "../encoding/hex";
13
- open import "../string";
14
-
10
+ { ArrayList } :: import("../collections/array_list");
11
+ { hex_encode } :: import("../encoding/hex");
12
+ open(import("../string"));
15
13
  // ============================================================================
16
14
  // SHA-256 constants
17
15
  // ============================================================================
18
-
19
16
  _K :: Array(u32, usize(64))(
20
- u32(0x428a2f98), u32(0x71374491), u32(0xb5c0fbcf), u32(0xe9b5dba5),
21
- u32(0x3956c25b), u32(0x59f111f1), u32(0x923f82a4), u32(0xab1c5ed5),
22
- u32(0xd807aa98), u32(0x12835b01), u32(0x243185be), u32(0x550c7dc3),
23
- u32(0x72be5d74), u32(0x80deb1fe), u32(0x9bdc06a7), u32(0xc19bf174),
24
- u32(0xe49b69c1), u32(0xefbe4786), u32(0x0fc19dc6), u32(0x240ca1cc),
25
- u32(0x2de92c6f), u32(0x4a7484aa), u32(0x5cb0a9dc), u32(0x76f988da),
26
- u32(0x983e5152), u32(0xa831c66d), u32(0xb00327c8), u32(0xbf597fc7),
27
- u32(0xc6e00bf3), u32(0xd5a79147), u32(0x06ca6351), u32(0x14292967),
28
- u32(0x27b70a85), u32(0x2e1b2138), u32(0x4d2c6dfc), u32(0x53380d13),
29
- u32(0x650a7354), u32(0x766a0abb), u32(0x81c2c92e), u32(0x92722c85),
30
- u32(0xa2bfe8a1), u32(0xa81a664b), u32(0xc24b8b70), u32(0xc76c51a3),
31
- u32(0xd192e819), u32(0xd6990624), u32(0xf40e3585), u32(0x106aa070),
32
- u32(0x19a4c116), u32(0x1e376c08), u32(0x2748774c), u32(0x34b0bcb5),
33
- u32(0x391c0cb3), u32(0x4ed8aa4a), u32(0x5b9cca4f), u32(0x682e6ff3),
34
- u32(0x748f82ee), u32(0x78a5636f), u32(0x84c87814), u32(0x8cc70208),
35
- u32(0x90befffa), u32(0xa4506ceb), u32(0xbef9a3f7), u32(0xc67178f2)
17
+ u32(0x428a2f98),
18
+ u32(0x71374491),
19
+ u32(0xb5c0fbcf),
20
+ u32(0xe9b5dba5),
21
+ u32(0x3956c25b),
22
+ u32(0x59f111f1),
23
+ u32(0x923f82a4),
24
+ u32(0xab1c5ed5),
25
+ u32(0xd807aa98),
26
+ u32(0x12835b01),
27
+ u32(0x243185be),
28
+ u32(0x550c7dc3),
29
+ u32(0x72be5d74),
30
+ u32(0x80deb1fe),
31
+ u32(0x9bdc06a7),
32
+ u32(0xc19bf174),
33
+ u32(0xe49b69c1),
34
+ u32(0xefbe4786),
35
+ u32(0x0fc19dc6),
36
+ u32(0x240ca1cc),
37
+ u32(0x2de92c6f),
38
+ u32(0x4a7484aa),
39
+ u32(0x5cb0a9dc),
40
+ u32(0x76f988da),
41
+ u32(0x983e5152),
42
+ u32(0xa831c66d),
43
+ u32(0xb00327c8),
44
+ u32(0xbf597fc7),
45
+ u32(0xc6e00bf3),
46
+ u32(0xd5a79147),
47
+ u32(0x06ca6351),
48
+ u32(0x14292967),
49
+ u32(0x27b70a85),
50
+ u32(0x2e1b2138),
51
+ u32(0x4d2c6dfc),
52
+ u32(0x53380d13),
53
+ u32(0x650a7354),
54
+ u32(0x766a0abb),
55
+ u32(0x81c2c92e),
56
+ u32(0x92722c85),
57
+ u32(0xa2bfe8a1),
58
+ u32(0xa81a664b),
59
+ u32(0xc24b8b70),
60
+ u32(0xc76c51a3),
61
+ u32(0xd192e819),
62
+ u32(0xd6990624),
63
+ u32(0xf40e3585),
64
+ u32(0x106aa070),
65
+ u32(0x19a4c116),
66
+ u32(0x1e376c08),
67
+ u32(0x2748774c),
68
+ u32(0x34b0bcb5),
69
+ u32(0x391c0cb3),
70
+ u32(0x4ed8aa4a),
71
+ u32(0x5b9cca4f),
72
+ u32(0x682e6ff3),
73
+ u32(0x748f82ee),
74
+ u32(0x78a5636f),
75
+ u32(0x84c87814),
76
+ u32(0x8cc70208),
77
+ u32(0x90befffa),
78
+ u32(0xa4506ceb),
79
+ u32(0xbef9a3f7),
80
+ u32(0xc67178f2)
36
81
  );
37
-
38
- _rotr32 :: (fn(x: u32, n: u32) -> u32)(
39
- ((x >> n) | (x << (u32(32) - n)))
82
+ _rotr32 :: (fn(x : u32, n : u32) -> u32)(
83
+ (x >> n) | (x << (u32(32) - n))
40
84
  );
41
-
42
- _ch :: (fn(e: u32, f: u32, g: u32) -> u32)( ((e & f) ^ ((~e) & g)) );
43
- _maj :: (fn(a: u32, b: u32, c: u32) -> u32)( (((a & b) ^ (a & c)) ^ (b & c)) );
44
- _ep0 :: (fn(a: u32) -> u32)( ((_rotr32(a, u32(2)) ^ _rotr32(a, u32(13))) ^ _rotr32(a, u32(22))) );
45
- _ep1 :: (fn(e: u32) -> u32)( ((_rotr32(e, u32(6)) ^ _rotr32(e, u32(11))) ^ _rotr32(e, u32(25))) );
46
- _sg0 :: (fn(x: u32) -> u32)( ((_rotr32(x, u32(7)) ^ _rotr32(x, u32(18))) ^ (x >> u32(3))) );
47
- _sg1 :: (fn(x: u32) -> u32)( ((_rotr32(x, u32(17)) ^ _rotr32(x, u32(19))) ^ (x >> u32(10))) );
48
-
85
+ _ch :: (fn(e : u32, f : u32, g : u32) -> u32)((e & f) ^ ((~(e)) & g));
86
+ _maj :: (fn(a : u32, b : u32, c : u32) -> u32)(((a & b) ^ (a & c)) ^ (b & c));
87
+ _ep0 :: (fn(a : u32) -> u32)((_rotr32(a, u32(2)) ^ _rotr32(a, u32(13))) ^ _rotr32(a, u32(22)));
88
+ _ep1 :: (fn(e : u32) -> u32)((_rotr32(e, u32(6)) ^ _rotr32(e, u32(11))) ^ _rotr32(e, u32(25)));
89
+ _sg0 :: (fn(x : u32) -> u32)((_rotr32(x, u32(7)) ^ _rotr32(x, u32(18))) ^ (x >> u32(3)));
90
+ _sg1 :: (fn(x : u32) -> u32)((_rotr32(x, u32(17)) ^ _rotr32(x, u32(19))) ^ (x >> u32(10)));
49
91
  // Process one 512-bit block. `block` must be 64 bytes. `h` is 8 u32 words.
50
- _sha256_block :: (fn(block: *(u8), h: *(u32)) -> unit)({
92
+ _sha256_block :: (fn(block : *(u8), h : *(u32)) -> unit)({
51
93
  w := Array(u32, usize(64)).fill(u32(0));
52
94
  // Load message schedule
53
95
  i := usize(0);
54
- while (i < usize(16)), (i = (i + usize(1))), {
96
+ while(i < usize(16), i = (i + usize(1)), {
55
97
  off := (i * usize(4));
56
- w(i) = (
57
- (((u32((block &+ off).*) << u32(24)) |
58
- (u32((block &+ (off + usize(1))).*) << u32(16))) |
59
- ((u32((block &+ (off + usize(2))).*) << u32(8)) |
60
- u32((block &+ (off + usize(3))).*)))
61
- );
62
- };
63
- while (i < usize(64)), (i = (i + usize(1))), {
64
- s1 := _sg1(w((i - usize(2))));
65
- s0 := _sg0(w((i - usize(15))));
66
- w(i) = (((s1 + w((i - usize(7)))) + s0) + w((i - usize(16))));
67
- };
98
+ w(i) =
99
+ (
100
+ (
101
+ (u32((block &+ off).*) << u32(24)) |
102
+ (u32((block &+ (off + usize(1))).*) << u32(16))
103
+ ) |
104
+ (
105
+ (u32((block &+ (off + usize(2))).*) << u32(8)) |
106
+ u32((block &+ (off + usize(3))).*)
107
+ )
108
+ );
109
+ });
110
+ while(i < usize(64), i = (i + usize(1)), {
111
+ s1 := _sg1(w(i - usize(2)));
112
+ s0 := _sg0(w(i - usize(15)));
113
+ w(i) = (((s1 + w(i - usize(7))) + s0) + w(i - usize(16)));
114
+ });
68
115
  // Compression
69
116
  a := (h &+ usize(0)).*;
70
117
  b := (h &+ usize(1)).*;
@@ -75,18 +122,18 @@ _sha256_block :: (fn(block: *(u8), h: *(u32)) -> unit)({
75
122
  g := (h &+ usize(6)).*;
76
123
  hh := (h &+ usize(7)).*;
77
124
  i2 := usize(0);
78
- while (i2 < usize(64)), (i2 = (i2 + usize(1))), {
125
+ while(i2 < usize(64), i2 = (i2 + usize(1)), {
79
126
  t1 := ((((hh + _ep1(e)) + _ch(e, f, g)) + _K(i2)) + w(i2));
80
127
  t2 := (_ep0(a) + _maj(a, b, c));
81
128
  hh = g;
82
- g = f;
83
- f = e;
84
- e = (d + t1);
85
- d = c;
86
- c = b;
87
- b = a;
88
- a = (t1 + t2);
89
- };
129
+ g = f;
130
+ f = e;
131
+ e = (d + t1);
132
+ d = c;
133
+ c = b;
134
+ b = a;
135
+ a = (t1 + t2);
136
+ });
90
137
  (h &+ usize(0)).* = ((h &+ usize(0)).* + a);
91
138
  (h &+ usize(1)).* = ((h &+ usize(1)).* + b);
92
139
  (h &+ usize(2)).* = ((h &+ usize(2)).* + c);
@@ -96,54 +143,56 @@ _sha256_block :: (fn(block: *(u8), h: *(u32)) -> unit)({
96
143
  (h &+ usize(6)).* = ((h &+ usize(6)).* + g);
97
144
  (h &+ usize(7)).* = ((h &+ usize(7)).* + hh);
98
145
  });
99
-
100
146
  // ============================================================================
101
147
  // Sha256 streaming state
102
148
  // ============================================================================
103
-
104
149
  Sha256 :: object(
105
- _h : Array(u32, usize(8)),
106
- _buf : Array(u8, usize(64)),
150
+ _h : Array(u32, usize(8)),
151
+ _buf : Array(u8, usize(64)),
107
152
  _buflen : usize,
108
- _total : u64
153
+ _total : u64
109
154
  );
110
-
111
- impl(Sha256,
155
+ impl(
156
+ Sha256,
112
157
  // Initialise a new hasher.
113
158
  new : (fn() -> Self)(
114
159
  Self(
115
- _h: Array(u32, usize(8))(
116
- u32(0x6a09e667), u32(0xbb67ae85), u32(0x3c6ef372), u32(0xa54ff53a),
117
- u32(0x510e527f), u32(0x9b05688c), u32(0x1f83d9ab), u32(0x5be0cd19)
160
+ _h : Array(u32, usize(8))(
161
+ u32(0x6a09e667),
162
+ u32(0xbb67ae85),
163
+ u32(0x3c6ef372),
164
+ u32(0xa54ff53a),
165
+ u32(0x510e527f),
166
+ u32(0x9b05688c),
167
+ u32(0x1f83d9ab),
168
+ u32(0x5be0cd19)
118
169
  ),
119
- _buf: Array(u8, usize(64)).fill(u8(0)),
120
- _buflen: usize(0),
121
- _total: u64(0)
170
+ _buf : Array(u8, usize(64)).fill(u8(0)),
171
+ _buflen : usize(0),
172
+ _total : u64(0)
122
173
  )
123
174
  ),
124
-
125
175
  // Feed more data into the hasher.
126
- update : (fn(self: Self, data: ArrayList(u8)) -> Self)({
176
+ update : (fn(self : Self, data : ArrayList(u8)) -> Self)({
127
177
  i := usize(0);
128
- while (i < data.len()), (i = (i + usize(1))), {
178
+ while(i < data.len(), i = (i + usize(1)), {
129
179
  self._buf(self._buflen) = data.get(i).unwrap();
130
180
  self._buflen = (self._buflen + usize(1));
131
- self._total = (self._total + u64(1));
181
+ self._total = (self._total + u64(1));
132
182
  cond(
133
183
  (self._buflen == usize(64)) => {
134
184
  buf_ptr := &(self._buf(usize(0)));
135
- h_ptr := &(self._h(usize(0)));
185
+ h_ptr := &(self._h(usize(0)));
136
186
  _sha256_block(buf_ptr, h_ptr);
137
187
  self._buflen = usize(0);
138
188
  },
139
189
  true => ()
140
190
  );
141
- };
191
+ });
142
192
  self
143
193
  }),
144
-
145
194
  // Finalise and return the 32-byte digest.
146
- finish : (fn(self: Self) -> Array(u8, usize(32)))({
195
+ finish : (fn(self : Self) -> Array(u8, usize(32)))({
147
196
  // Padding
148
197
  bit_len := (self._total * u64(8));
149
198
  self._buf(self._buflen) = u8(0x80);
@@ -151,66 +200,61 @@ impl(Sha256,
151
200
  cond(
152
201
  (self._buflen > usize(56)) => {
153
202
  // Fill rest with zeros and process
154
- while (self._buflen < usize(64)), (self._buflen = (self._buflen + usize(1))), {
203
+ while(self._buflen < usize(64), self._buflen = (self._buflen + usize(1)), {
155
204
  self._buf(self._buflen) = u8(0);
156
- };
205
+ });
157
206
  buf_ptr := &(self._buf(usize(0)));
158
- h_ptr := &(self._h(usize(0)));
207
+ h_ptr := &(self._h(usize(0)));
159
208
  _sha256_block(buf_ptr, h_ptr);
160
209
  self._buflen = usize(0);
161
210
  },
162
211
  true => ()
163
212
  );
164
- while (self._buflen < usize(56)), (self._buflen = (self._buflen + usize(1))), {
213
+ while(self._buflen < usize(56), self._buflen = (self._buflen + usize(1)), {
165
214
  self._buf(self._buflen) = u8(0);
166
- };
215
+ });
167
216
  // Big-endian bit length
168
- self._buf(usize(56)) = u8((bit_len >> u64(56)));
169
- self._buf(usize(57)) = u8((bit_len >> u64(48)));
170
- self._buf(usize(58)) = u8((bit_len >> u64(40)));
171
- self._buf(usize(59)) = u8((bit_len >> u64(32)));
172
- self._buf(usize(60)) = u8((bit_len >> u64(24)));
173
- self._buf(usize(61)) = u8((bit_len >> u64(16)));
174
- self._buf(usize(62)) = u8((bit_len >> u64(8)));
217
+ self._buf(usize(56)) = u8(bit_len >> u64(56));
218
+ self._buf(usize(57)) = u8(bit_len >> u64(48));
219
+ self._buf(usize(58)) = u8(bit_len >> u64(40));
220
+ self._buf(usize(59)) = u8(bit_len >> u64(32));
221
+ self._buf(usize(60)) = u8(bit_len >> u64(24));
222
+ self._buf(usize(61)) = u8(bit_len >> u64(16));
223
+ self._buf(usize(62)) = u8(bit_len >> u64(8));
175
224
  self._buf(usize(63)) = u8(bit_len);
176
225
  buf_ptr := &(self._buf(usize(0)));
177
- h_ptr := &(self._h(usize(0)));
226
+ h_ptr := &(self._h(usize(0)));
178
227
  _sha256_block(buf_ptr, h_ptr);
179
228
  // Extract digest
180
229
  digest := Array(u8, usize(32)).fill(u8(0));
181
230
  j := usize(0);
182
- while (j < usize(8)), (j = (j + usize(1))), {
231
+ while(j < usize(8), j = (j + usize(1)), {
183
232
  word := self._h(j);
184
- digest((j * usize(4))) = u8((word >> u32(24)));
185
- digest(((j * usize(4)) + usize(1))) = u8((word >> u32(16)));
186
- digest(((j * usize(4)) + usize(2))) = u8((word >> u32(8)));
187
- digest(((j * usize(4)) + usize(3))) = u8(word);
188
- };
233
+ digest(j * usize(4)) = u8(word >> u32(24));
234
+ digest((j * usize(4)) + usize(1)) = u8(word >> u32(16));
235
+ digest((j * usize(4)) + usize(2)) = u8(word >> u32(8));
236
+ digest((j * usize(4)) + usize(3)) = u8(word);
237
+ });
189
238
  digest
190
239
  })
191
240
  );
192
-
193
- export Sha256;
194
-
241
+ export(Sha256);
195
242
  // ============================================================================
196
243
  // Convenience functions
197
244
  // ============================================================================
198
-
199
245
  // Hash data and return the 32-byte digest.
200
- sha256 :: (fn(data: ArrayList(u8)) -> Array(u8, usize(32)))(
246
+ sha256 :: (fn(data : ArrayList(u8)) -> Array(u8, usize(32)))(
201
247
  Sha256.new().update(data).finish()
202
248
  );
203
-
204
249
  // Hash data and return the 64-character lowercase hex digest.
205
- sha256_hex :: (fn(data: ArrayList(u8)) -> String)({
250
+ sha256_hex :: (fn(data : ArrayList(u8)) -> String)({
206
251
  digest := sha256(data);
207
252
  // Convert fixed array to ArrayList(u8) for hex_encode
208
253
  bytes := ArrayList(u8).with_capacity(usize(32));
209
254
  i := usize(0);
210
- while (i < usize(32)), (i = (i + usize(1))), {
255
+ while(i < usize(32), i = (i + usize(1)), {
211
256
  bytes.push(digest(i));
212
- };
257
+ });
213
258
  hex_encode(bytes)
214
259
  });
215
-
216
- export sha256, sha256_hex;
260
+ export(sha256, sha256_hex);
@@ -8,34 +8,28 @@
8
8
  //! s := base64_encode(data);
9
9
  //! b := base64_decode(s.to_str()).unwrap();
10
10
  //! ```
11
-
12
- open import "../string";
13
- { ArrayList } :: import "../collections/array_list";
14
- { EncodingError } :: import "./hex";
15
- { Error, AnyError, Exception } :: import "../error";
16
-
11
+ open(import("../string"));
12
+ { ArrayList } :: import("../collections/array_list");
13
+ { EncodingError } :: import("./hex");
14
+ { Error, AnyError, Exception } :: import("../error");
17
15
  // ============================================================================
18
16
  // Standard alphabet
19
17
  // ============================================================================
20
-
21
18
  _STD_ALPHA :: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
22
19
  _URL_ALPHA :: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
23
20
  _PAD :: u8(61); // '='
24
-
25
21
  // ============================================================================
26
22
  // Encoding
27
23
  // ============================================================================
28
-
29
- _encode_with :: (fn(data: ArrayList(u8), alpha: str, pad: bool) -> String)({
30
- n := data.len();
31
- out := ArrayList(u8).with_capacity((((n + usize(2)) / usize(3)) * usize(4)));
32
- i := usize(0);
33
- while (i < n), (i = (i + usize(3))), {
24
+ _encode_with :: (fn(data : ArrayList(u8), alpha : str, pad : bool) -> String)({
25
+ n := data.len();
26
+ out := ArrayList(u8).with_capacity(((n + usize(2)) / usize(3)) * usize(4));
27
+ i := usize(0);
28
+ while(i < n, i = (i + usize(3)), {
34
29
  b0 := data.get(i).unwrap();
35
- b1 := cond(((i + usize(1)) < n) => data.get((i + usize(1))).unwrap(), true => u8(0));
36
- b2 := cond(((i + usize(2)) < n) => data.get((i + usize(2))).unwrap(), true => u8(0));
37
-
38
- out.push(alpha.bytes(usize((b0 >> u8(2)))));
30
+ b1 := cond(((i + usize(1)) < n) => data.get(i + usize(1)).unwrap(), true => u8(0));
31
+ b2 := cond(((i + usize(2)) < n) => data.get(i + usize(2)).unwrap(), true => u8(0));
32
+ out.push(alpha.bytes(usize(b0 >> u8(2))));
39
33
  out.push(alpha.bytes(usize(((b0 & u8(3)) << u8(4)) | (b1 >> u8(4)))));
40
34
  cond(
41
35
  ((i + usize(1)) < n) => {
@@ -48,156 +42,168 @@ _encode_with :: (fn(data: ArrayList(u8), alpha: str, pad: bool) -> String)({
48
42
  );
49
43
  cond(
50
44
  ((i + usize(2)) < n) => {
51
- out.push(alpha.bytes(usize((b2 & u8(63)))));
45
+ out.push(alpha.bytes(usize(b2 & u8(63))));
52
46
  },
53
47
  pad => {
54
48
  out.push(_PAD);
55
49
  },
56
50
  true => ()
57
51
  );
58
- };
52
+ });
59
53
  String.from_bytes(out)
60
54
  });
61
-
62
55
  /// Encode bytes as standard base64 with padding.
63
- base64_encode :: (fn(data: ArrayList(u8)) -> String)(
56
+ base64_encode :: (fn(data : ArrayList(u8)) -> String)(
64
57
  _encode_with(data, _STD_ALPHA, true)
65
58
  );
66
-
67
59
  /// Encode bytes as URL-safe base64 without padding.
68
- base64_encode_url :: (fn(data: ArrayList(u8)) -> String)(
60
+ base64_encode_url :: (fn(data : ArrayList(u8)) -> String)(
69
61
  _encode_with(data, _URL_ALPHA, false)
70
62
  );
71
-
72
- export base64_encode, base64_encode_url;
73
-
63
+ export(base64_encode, base64_encode_url);
74
64
  // ============================================================================
75
65
  // Decoding
76
66
  // ============================================================================
77
-
78
- _decode_char :: (fn(c: u8, alpha: str, using(exn : Exception)) -> u8)({
67
+ _decode_char :: (fn(c : u8, alpha : str, using(exn : Exception)) -> u8)({
79
68
  i := usize(0);
80
- while (i < usize(64)), (i = (i + usize(1))), {
69
+ while(i < usize(64), i = (i + usize(1)), {
81
70
  cond(
82
- (alpha.bytes(i) == c) => { return u8(i); },
71
+ (alpha.bytes(i) == c) => {
72
+ return(u8(i));
73
+ },
83
74
  true => ()
84
75
  );
85
- };
86
- exn.throw(dyn EncodingError.InvalidChar(c))
76
+ });
77
+ exn.throw(dyn(EncodingError.InvalidChar(c)))
87
78
  });
88
-
89
- _decode_with :: (fn(s: str, alpha: str, using(exn : Exception)) -> ArrayList(u8))({
79
+ _decode_with :: (fn(s : str, alpha : str, using(exn : Exception)) -> ArrayList(u8))({
90
80
  // Strip trailing padding
91
81
  len := s.len();
92
- while ((len > usize(0)) && (s.bytes((len - usize(1))) == _PAD)), (len = (len - usize(1))), ();
93
- out := ArrayList(u8).with_capacity(((len * usize(3)) / usize(4)));
94
- i := usize(0);
95
- while (i < len), (i = (i + usize(4))), {
82
+ while((len > usize(0)) && (s.bytes(len - usize(1)) == _PAD), len = (len - usize(1)), ());
83
+ out := ArrayList(u8).with_capacity((len * usize(3)) / usize(4));
84
+ i := usize(0);
85
+ while(i < len, i = (i + usize(4)), {
96
86
  c0 := _decode_char(s.bytes(i), alpha);
97
87
  c1 := cond(
98
- ((i + usize(1)) < len) => _decode_char(s.bytes((i + usize(1))), alpha),
88
+ ((i + usize(1)) < len) => _decode_char(s.bytes(i + usize(1)), alpha),
99
89
  true => u8(0)
100
90
  );
101
- out.push(((c0 << u8(2)) | (c1 >> u8(4))));
91
+ out.push((c0 << u8(2)) | (c1 >> u8(4)));
102
92
  cond(
103
93
  ((i + usize(2)) < len) => {
104
- c2 := _decode_char(s.bytes((i + usize(2))), alpha);
105
- out.push((((c1 & u8(15)) << u8(4)) | (c2 >> u8(2))));
94
+ c2 := _decode_char(s.bytes(i + usize(2)), alpha);
95
+ out.push(((c1 & u8(15)) << u8(4)) | (c2 >> u8(2)));
106
96
  cond(
107
97
  ((i + usize(3)) < len) => {
108
- c3 := _decode_char(s.bytes((i + usize(3))), alpha);
109
- out.push((((c2 & u8(3)) << u8(6)) | c3));
98
+ c3 := _decode_char(s.bytes(i + usize(3)), alpha);
99
+ out.push(((c2 & u8(3)) << u8(6)) | c3);
110
100
  },
111
101
  true => ()
112
102
  );
113
103
  },
114
104
  true => ()
115
105
  );
116
- };
106
+ });
117
107
  out
118
108
  });
119
-
120
109
  /// Decode a standard base64 string to bytes. Throws via `Exception` on invalid input.
121
- base64_decode :: (fn(s: str, using(exn : Exception)) -> ArrayList(u8))(
110
+ base64_decode :: (fn(s : str, using(exn : Exception)) -> ArrayList(u8))(
122
111
  _decode_with(s, _STD_ALPHA)
123
112
  );
124
-
125
113
  /// Decode a URL-safe base64 string to bytes. Throws via `Exception` on invalid input.
126
- base64_decode_url :: (fn(s: str, using(exn : Exception)) -> ArrayList(u8))(
114
+ base64_decode_url :: (fn(s : str, using(exn : Exception)) -> ArrayList(u8))(
127
115
  _decode_with(s, _URL_ALPHA)
128
116
  );
129
-
130
- export base64_decode, base64_decode_url;
131
-
117
+ export(base64_decode, base64_decode_url);
132
118
  // ============================================================================
133
119
  // String-level convenience API
134
120
  // ============================================================================
135
-
136
121
  /// Encode a `String` to standard base64.
137
- base64_encode_string :: (fn(input: String) -> String)(
122
+ base64_encode_string :: (fn(input : String) -> String)(
138
123
  _encode_with(input.as_bytes(), _STD_ALPHA, true)
139
124
  );
140
-
141
125
  // Reverse lookup: base64 char to 0-63, or -1 for invalid.
142
- _base64_index :: (fn(c: u8) -> i32)({
126
+ _base64_index :: (fn(c : u8) -> i32)({
143
127
  alpha := _STD_ALPHA;
144
128
  i := usize(0);
145
- while (i < usize(64)), (i = (i + usize(1))), {
129
+ while(i < usize(64), i = (i + usize(1)), {
146
130
  cond(
147
- (alpha.bytes(i) == c) => { return i32(i); },
131
+ (alpha.bytes(i) == c) => {
132
+ return(i32(i));
133
+ },
148
134
  true => ()
149
135
  );
150
- };
151
- i32(-1)
136
+ });
137
+ i32(-(1))
152
138
  });
153
-
154
139
  /// Decode a base64 `String`, ignoring whitespace. Returns `Result(String, String)`.
155
- base64_decode_string :: (fn(input: String) -> Result(String, String))({
140
+ base64_decode_string :: (fn(input : String) -> Result(String, String))({
156
141
  raw := input.as_str();
157
142
  cleaned := ArrayList(u8).new();
158
143
  i := usize(0);
159
- while (i < raw.len()), (i = (i + usize(1))), {
144
+ while(i < raw.len(), i = (i + usize(1)), {
160
145
  ch := raw.bytes(i);
161
146
  cond(
162
147
  (((ch == u8(32)) || (ch == u8(9))) || ((ch == u8(10)) || (ch == u8(13)))) => (),
163
- true => { cleaned.push(ch); }
148
+ true => {
149
+ cleaned.push(ch);
150
+ }
164
151
  );
165
- };
152
+ });
166
153
  // Strip trailing padding
167
154
  len := cleaned.len();
168
- while ((len > usize(0)) && (cleaned.get((len - usize(1))).unwrap() == u8(61))), (len = (len - usize(1))), ();
155
+ while((len > usize(0)) && (cleaned.get(len - usize(1)).unwrap() == u8(61)), len = (len - usize(1)), ());
169
156
  out := ArrayList(u8).new();
170
157
  j := usize(0);
171
- while (j < len), (j = (j + usize(4))), {
158
+ while(j < len, j = (j + usize(4)), {
172
159
  v0 := _base64_index(cleaned.get(j).unwrap());
173
- cond((v0 == i32(-1)) => { return .Err(`Invalid base64 input`); }, true => ());
160
+ cond(
161
+ (v0 == i32(-(1))) => {
162
+ return(.Err(`Invalid base64 input`));
163
+ },
164
+ true => ()
165
+ );
174
166
  v1 := cond(
175
167
  ((j + usize(1)) < len) => {
176
- tmp := _base64_index(cleaned.get((j + usize(1))).unwrap());
177
- cond((tmp == i32(-1)) => { return .Err(`Invalid base64 input`); }, true => ());
168
+ tmp := _base64_index(cleaned.get(j + usize(1)).unwrap());
169
+ cond(
170
+ (tmp == i32(-(1))) => {
171
+ return(.Err(`Invalid base64 input`));
172
+ },
173
+ true => ()
174
+ );
178
175
  tmp
179
176
  },
180
177
  true => i32(0)
181
178
  );
182
- out.push(u8(((v0 << i32(2)) | (v1 >> i32(4)))));
179
+ out.push(u8((v0 << i32(2)) | (v1 >> i32(4))));
183
180
  cond(
184
181
  ((j + usize(2)) < len) => {
185
- v2 := _base64_index(cleaned.get((j + usize(2))).unwrap());
186
- cond((v2 == i32(-1)) => { return .Err(`Invalid base64 input`); }, true => ());
187
- out.push(u8((((v1 & i32(15)) << i32(4)) | (v2 >> i32(2)))));
182
+ v2 := _base64_index(cleaned.get(j + usize(2)).unwrap());
183
+ cond(
184
+ (v2 == i32(-(1))) => {
185
+ return(.Err(`Invalid base64 input`));
186
+ },
187
+ true => ()
188
+ );
189
+ out.push(u8(((v1 & i32(15)) << i32(4)) | (v2 >> i32(2))));
188
190
  cond(
189
191
  ((j + usize(3)) < len) => {
190
- v3 := _base64_index(cleaned.get((j + usize(3))).unwrap());
191
- cond((v3 == i32(-1)) => { return .Err(`Invalid base64 input`); }, true => ());
192
- out.push(u8((((v2 & i32(3)) << i32(6)) | v3)));
192
+ v3 := _base64_index(cleaned.get(j + usize(3)).unwrap());
193
+ cond(
194
+ (v3 == i32(-(1))) => {
195
+ return(.Err(`Invalid base64 input`));
196
+ },
197
+ true => ()
198
+ );
199
+ out.push(u8(((v2 & i32(3)) << i32(6)) | v3));
193
200
  },
194
201
  true => ()
195
202
  );
196
203
  },
197
204
  true => ()
198
205
  );
199
- };
206
+ });
200
207
  .Ok(String.from_bytes(out))
201
208
  });
202
-
203
- export base64_encode_string, base64_decode_string;
209
+ export(base64_encode_string, base64_decode_string);