@shd101wyy/yo 0.0.23 → 0.0.25

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 (97) hide show
  1. package/out/cjs/index.cjs +560 -520
  2. package/out/cjs/yo-cli.cjs +598 -558
  3. package/out/esm/index.mjs +551 -511
  4. package/out/types/src/codegen/exprs/arc.d.ts +5 -0
  5. package/out/types/src/codegen/types/generation.d.ts +2 -0
  6. package/out/types/src/codegen/utils/index.d.ts +8 -1
  7. package/out/types/src/evaluator/builtins/rc-fns.d.ts +5 -0
  8. package/out/types/src/evaluator/calls/arc.d.ts +15 -0
  9. package/out/types/src/evaluator/calls/trait-type.d.ts +8 -1
  10. package/out/types/src/evaluator/context.d.ts +11 -1
  11. package/out/types/src/evaluator/types/utils.d.ts +8 -3
  12. package/out/types/src/evaluator/utils/closure.d.ts +7 -1
  13. package/out/types/src/evaluator/values/impl.d.ts +8 -0
  14. package/out/types/src/expr.d.ts +6 -0
  15. package/out/types/src/test-runner.d.ts +2 -0
  16. package/out/types/src/types/creators.d.ts +2 -1
  17. package/out/types/src/types/definitions.d.ts +10 -0
  18. package/out/types/src/types/guards.d.ts +2 -1
  19. package/out/types/src/types/tags.d.ts +1 -0
  20. package/out/types/tsconfig.tsbuildinfo +1 -1
  21. package/package.json +1 -1
  22. package/std/collections/array_list.yo +80 -10
  23. package/std/collections/btree_map.yo +120 -2
  24. package/std/collections/deque.yo +98 -6
  25. package/std/collections/hash_map.yo +137 -1
  26. package/std/collections/hash_set.yo +85 -1
  27. package/std/collections/linked_list.yo +61 -1
  28. package/std/collections/priority_queue.yo +70 -1
  29. package/std/crypto/md5.yo +4 -4
  30. package/std/crypto/random.yo +3 -3
  31. package/std/crypto/sha256.yo +8 -7
  32. package/std/encoding/base64.yo +6 -6
  33. package/std/encoding/hex.yo +27 -22
  34. package/std/encoding/json.yo +185 -186
  35. package/std/encoding/utf16.yo +2 -2
  36. package/std/fmt/display.yo +1 -1
  37. package/std/fmt/writer.yo +2 -4
  38. package/std/fs/dir.yo +5 -5
  39. package/std/fs/file.yo +21 -13
  40. package/std/fs/metadata.yo +4 -4
  41. package/std/fs/temp.yo +3 -3
  42. package/std/fs/types.yo +1 -1
  43. package/std/fs/walker.yo +1 -1
  44. package/std/net/addr.yo +2 -2
  45. package/std/net/dns.yo +21 -20
  46. package/std/net/errors.yo +1 -1
  47. package/std/net/tcp.yo +134 -100
  48. package/std/net/udp.yo +51 -42
  49. package/std/os/env.yo +21 -23
  50. package/std/os/signal.yo +10 -9
  51. package/std/prelude.yo +158 -22
  52. package/std/string/string.yo +99 -1
  53. package/std/sync/once.yo +1 -1
  54. package/std/{io → sys}/advise.yo +1 -1
  55. package/std/sys/bufio/buf_reader.yo +300 -0
  56. package/std/sys/bufio/buf_writer.yo +168 -0
  57. package/std/{io → sys}/clock.yo +1 -1
  58. package/std/{io → sys}/constants.yo +1 -1
  59. package/std/{io → sys}/copy.yo +1 -1
  60. package/std/{io → sys}/dir.yo +6 -6
  61. package/std/{io → sys}/dns.yo +3 -3
  62. package/std/{io → sys}/errors.yo +1 -1
  63. package/std/{io → sys}/events.yo +1 -1
  64. package/std/{io → sys}/externs.yo +1 -1
  65. package/std/{io → sys}/fallocate.yo +1 -1
  66. package/std/{io → sys}/fcntl.yo +1 -1
  67. package/std/{io → sys}/file.yo +1 -1
  68. package/std/{io → sys}/future.yo +1 -1
  69. package/std/{io → sys}/iov.yo +1 -1
  70. package/std/{io → sys}/lock.yo +1 -1
  71. package/std/{io → sys}/mmap.yo +1 -1
  72. package/std/{io → sys}/path.yo +1 -1
  73. package/std/{io → sys}/perm.yo +3 -3
  74. package/std/{io → sys}/pipe.yo +1 -1
  75. package/std/{io → sys}/process.yo +1 -1
  76. package/std/{io → sys}/seek.yo +1 -1
  77. package/std/{io → sys}/signal.yo +1 -1
  78. package/std/{io → sys}/signals.yo +1 -1
  79. package/std/{io → sys}/socket.yo +1 -1
  80. package/std/{io → sys}/socketpair.yo +1 -1
  81. package/std/{io → sys}/sockinfo.yo +1 -1
  82. package/std/{io → sys}/statfs.yo +2 -2
  83. package/std/{io → sys}/statx.yo +1 -1
  84. package/std/{io → sys}/sysinfo.yo +1 -1
  85. package/std/{io → sys}/tcp.yo +3 -3
  86. package/std/{io → sys}/temp.yo +1 -1
  87. package/std/{io → sys}/time.yo +2 -2
  88. package/std/{io → sys}/timer.yo +1 -1
  89. package/std/{io → sys}/tty.yo +1 -1
  90. package/std/{io → sys}/udp.yo +4 -4
  91. package/std/{io → sys}/umask.yo +1 -1
  92. package/std/{io → sys}/unix.yo +1 -1
  93. package/std/time/datetime.yo +18 -23
  94. package/std/time/instant.yo +13 -11
  95. package/std/url/url.yo +533 -0
  96. package/std/math/functions.yo +0 -74
  97. package/std/math/random.yo +0 -94
@@ -17,48 +17,49 @@ open import "../string";
17
17
  // ============================================================================
18
18
 
19
19
  JsonError :: enum(
20
- .UnexpectedChar(ch: u8, pos: usize),
21
- .UnexpectedEnd,
22
- .InvalidNumber,
23
- .InvalidEscape,
24
- .InvalidUnicode,
25
- .Other(msg: String)
20
+ UnexpectedChar(ch: u8, pos: usize),
21
+ UnexpectedEnd,
22
+ InvalidNumber,
23
+ InvalidEscape,
24
+ InvalidUnicode,
25
+ Other(msg: String)
26
26
  );
27
27
 
28
28
  export JsonError;
29
29
 
30
30
  // ============================================================================
31
- // JsonKV - key/value pair for Object
31
+ // JsonValue
32
32
  // ============================================================================
33
33
 
34
- JsonKV :: struct(
35
- key : String,
36
- value : JsonValue
34
+ JsonValue :: enum(
35
+ Null,
36
+ Bool(value: bool),
37
+ Number(value: f64),
38
+ Str(value: String),
39
+ Array(items: ArrayList(Self)),
40
+ Object(keys: ArrayList(String), values: ArrayList(Self))
37
41
  );
38
42
 
39
43
  // ============================================================================
40
- // JsonValue
44
+ // JsonKV - key/value pair convenience struct for Object
41
45
  // ============================================================================
42
46
 
43
- JsonValue :: enum(
44
- .Null,
45
- .Bool(value: bool),
46
- .Number(value: f64),
47
- .Str(value: String),
48
- .Array(items: ArrayList(JsonValue)),
49
- .Object(fields: ArrayList(JsonKV))
47
+ JsonKV :: struct(
48
+ key : String,
49
+ value : JsonValue
50
50
  );
51
51
 
52
52
  impl(JsonValue,
53
53
  // Get a field from an Object value. Returns .None if not an Object or key missing.
54
- get : (fn(self: Self, key: String) -> ?JsonValue)(
54
+ get : (fn(self: Self, key: String) -> Option(JsonValue))(
55
55
  match(self,
56
- .Object(fields) => {
56
+ .Object(keys, values) => {
57
57
  i := usize(0);
58
- while (i < fields.len()), (i = (i + usize(1))), {
59
- kv := fields.get(i).unwrap();
58
+ while (i < keys.len()), (i = (i + usize(1))), {
60
59
  cond(
61
- (kv.key == key) => { return .Some(kv.value); },
60
+ (keys.get(i).unwrap() == key) => {
61
+ return .Some(values.get(i).unwrap());
62
+ },
62
63
  true => ()
63
64
  );
64
65
  };
@@ -69,7 +70,7 @@ impl(JsonValue,
69
70
  ),
70
71
 
71
72
  // Get an element from an Array value by index.
72
- at : (fn(self: Self, index: usize) -> ?JsonValue)(
73
+ at : (fn(self: Self, index: usize) -> Option(JsonValue))(
73
74
  match(self,
74
75
  .Array(items) => items.get(index),
75
76
  _ => .None
@@ -77,7 +78,7 @@ impl(JsonValue,
77
78
  ),
78
79
 
79
80
  // Extract a bool.
80
- as_bool : (fn(self: Self) -> ?bool)(
81
+ as_bool : (fn(self: Self) -> Option(bool))(
81
82
  match(self,
82
83
  .Bool(b) => .Some(b),
83
84
  _ => .None
@@ -85,7 +86,7 @@ impl(JsonValue,
85
86
  ),
86
87
 
87
88
  // Extract a number.
88
- as_number : (fn(self: Self) -> ?f64)(
89
+ as_number : (fn(self: Self) -> Option(f64))(
89
90
  match(self,
90
91
  .Number(n) => .Some(n),
91
92
  _ => .None
@@ -93,7 +94,7 @@ impl(JsonValue,
93
94
  ),
94
95
 
95
96
  // Extract a string.
96
- as_string : (fn(self: Self) -> ?String)(
97
+ as_string : (fn(self: Self) -> Option(String))(
97
98
  match(self,
98
99
  .Str(s) => .Some(s),
99
100
  _ => .None
@@ -101,17 +102,24 @@ impl(JsonValue,
101
102
  ),
102
103
 
103
104
  // Extract an array.
104
- as_array : (fn(self: Self) -> ?ArrayList(JsonValue))(
105
+ as_array : (fn(self: Self) -> Option(ArrayList(JsonValue)))(
105
106
  match(self,
106
107
  .Array(items) => .Some(items),
107
108
  _ => .None
108
109
  )
109
110
  ),
110
111
 
111
- // Extract an object as ArrayList(JsonKV).
112
- as_object : (fn(self: Self) -> ?ArrayList(JsonKV))(
112
+ // Extract object entries as ArrayList(JsonKV).
113
+ as_object : (fn(self: Self) -> Option(ArrayList(JsonKV)))(
113
114
  match(self,
114
- .Object(fields) => .Some(fields),
115
+ .Object(keys, values) => {
116
+ result := ArrayList(JsonKV).new();
117
+ i := usize(0);
118
+ while (i < keys.len()), (i = (i + usize(1))), {
119
+ result.push(JsonKV(key: keys.get(i).unwrap(), value: values.get(i).unwrap()));
120
+ };
121
+ .Some(result)
122
+ },
115
123
  _ => .None
116
124
  )
117
125
  )
@@ -133,24 +141,24 @@ impl(_Parser,
133
141
  Self(src: src, pos: usize(0))
134
142
  ),
135
143
 
136
- peek : (fn(self: Self) -> ?u8)(
144
+ peek : (fn(self: Self) -> Option(u8))(
137
145
  cond(
138
146
  (self.pos < self.src.len()) => .Some(self.src.bytes(self.pos)),
139
147
  true => .None
140
148
  )
141
149
  ),
142
150
 
143
- advance : (fn(self: Self) -> unit)(
144
- self.pos = (self.pos + usize(1))
145
- ),
151
+ advance : (fn(self: Self) -> unit)({
152
+ self.pos = (self.pos + usize(1));
153
+ }),
146
154
 
147
155
  skip_ws : (fn(self: Self) -> unit)({
148
- while runtime(true), () => {
156
+ while runtime(true), {
149
157
  match(self.peek(),
150
158
  .None => break,
151
159
  .Some(c) => {
152
160
  cond(
153
- ((c == u8(32)) || (c == u8(9)) || (c == u8(10)) || (c == u8(13))) => {
161
+ ((((c == u8(32)) || (c == u8(9))) || (c == u8(10))) || (c == u8(13))) => {
154
162
  self.advance();
155
163
  },
156
164
  true => break
@@ -164,7 +172,7 @@ impl(_Parser,
164
172
  self.skip_ws();
165
173
  match(self.peek(),
166
174
  .None => .Err(.UnexpectedEnd),
167
- .Some(c) => {
175
+ .Some(c) =>
168
176
  cond(
169
177
  (c == ch) => {
170
178
  self.advance();
@@ -172,14 +180,13 @@ impl(_Parser,
172
180
  },
173
181
  true => .Err(.UnexpectedChar(c, self.pos))
174
182
  )
175
- }
176
183
  )
177
184
  }),
178
185
 
179
186
  parse_string : (fn(self: Self) -> Result(String, JsonError))({
180
187
  self.advance(); // skip opening '"'
181
188
  bytes := ArrayList(u8).new();
182
- while runtime(true), () => {
189
+ while runtime(true), {
183
190
  match(self.peek(),
184
191
  .None => { return .Err(.UnexpectedEnd); },
185
192
  .Some(c) => {
@@ -230,7 +237,7 @@ impl(_Parser,
230
237
  },
231
238
  .None => ()
232
239
  );
233
- while runtime(true), () => {
240
+ while runtime(true), {
234
241
  match(self.peek(),
235
242
  .Some(c) => {
236
243
  cond(
@@ -246,7 +253,7 @@ impl(_Parser,
246
253
  cond(
247
254
  (c == u8(46)) => { // '.'
248
255
  self.advance();
249
- while runtime(true), () => {
256
+ while runtime(true), {
250
257
  match(self.peek(),
251
258
  .Some(d) => {
252
259
  cond(
@@ -277,7 +284,7 @@ impl(_Parser,
277
284
  },
278
285
  .None => ()
279
286
  );
280
- while runtime(true), () => {
287
+ while runtime(true), {
281
288
  match(self.peek(),
282
289
  .Some(d) => {
283
290
  cond(
@@ -305,145 +312,138 @@ impl(_Parser,
305
312
  { atof } :: import "../libc/stdlib";
306
313
  val := atof(num_ptr);
307
314
  .Ok(val)
308
- }),
315
+ })
316
+ );
309
317
 
310
- parse_value : (fn(self: Self) -> Result(JsonValue, JsonError))({
311
- self.skip_ws();
312
- match(self.peek(),
313
- .None => .Err(.UnexpectedEnd),
314
- .Some(c) => {
315
- cond(
316
- (c == u8(34)) => { // '"'
317
- match(self.parse_string(),
318
- .Err(e) => .Err(e),
319
- .Ok(s) => .Ok(.Str(s))
320
- )
321
- },
322
- (c == u8(123)) => { // '{'
323
- self.parse_object()
324
- },
325
- (c == u8(91)) => { // '['
326
- self.parse_array()
327
- },
328
- (c == u8(116)) => { // 't' (true)
329
- self.advance(); self.advance(); self.advance(); self.advance();
330
- .Ok(.Bool(true))
331
- },
332
- (c == u8(102)) => { // 'f' (false)
333
- self.advance(); self.advance(); self.advance();
334
- self.advance(); self.advance();
335
- .Ok(.Bool(false))
336
- },
337
- (c == u8(110)) => { // 'n' (null)
338
- self.advance(); self.advance(); self.advance(); self.advance();
339
- .Ok(.Null)
340
- },
341
- true => {
342
- match(self.parse_number(),
343
- .Err(e) => .Err(e),
344
- .Ok(n) => .Ok(.Number(n))
345
- )
346
- }
347
- )
348
- }
349
- )
350
- }),
318
+ // ============================================================================
319
+ // Recursive value parser (standalone for self-recursion support)
320
+ // ============================================================================
351
321
 
352
- parse_array : (fn(self: Self) -> Result(JsonValue, JsonError))({
353
- self.advance(); // skip '['
354
- items := ArrayList(JsonValue).new();
355
- self.skip_ws();
356
- match(self.peek(),
357
- .Some(c) => {
358
- cond(
359
- (c == u8(93)) => { // ']'
360
- self.advance();
361
- return .Ok(.Array(items));
362
- },
363
- true => ()
364
- );
365
- },
366
- .None => ()
367
- );
368
- while runtime(true), () => {
369
- match(self.parse_value(),
370
- .Err(e) => { return .Err(e); },
371
- .Ok(v) => { items.push(v); }
372
- );
373
- self.skip_ws();
374
- match(self.peek(),
375
- .Some(c) => {
376
- cond(
377
- (c == u8(44)) => { self.advance(); }, // ','
378
- (c == u8(93)) => { self.advance(); break; }, // ']'
379
- true => { return .Err(.UnexpectedChar(c, self.pos)); }
380
- );
381
- },
382
- .None => { return .Err(.UnexpectedEnd); }
383
- );
384
- };
385
- .Ok(.Array(items))
386
- }),
322
+ // Tiny helpers to avoid begin blocks in cond branches (works around codegen temp var issue)
323
+ _parse_true_lit :: (fn(p: _Parser) -> Result(JsonValue, JsonError))({
324
+ p.advance(); p.advance(); p.advance(); p.advance();
325
+ .Ok(.Bool(true))
326
+ });
327
+ _parse_false_lit :: (fn(p: _Parser) -> Result(JsonValue, JsonError))({
328
+ p.advance(); p.advance(); p.advance(); p.advance(); p.advance();
329
+ .Ok(.Bool(false))
330
+ });
331
+ _parse_null_lit :: (fn(p: _Parser) -> Result(JsonValue, JsonError))({
332
+ p.advance(); p.advance(); p.advance(); p.advance();
333
+ .Ok(.Null)
334
+ });
387
335
 
388
- parse_object : (fn(self: Self) -> Result(JsonValue, JsonError))({
389
- self.advance(); // skip '{'
390
- fields := ArrayList(JsonKV).new();
391
- self.skip_ws();
392
- match(self.peek(),
393
- .Some(c) => {
394
- cond(
395
- (c == u8(125)) => { // '}'
396
- self.advance();
397
- return .Ok(.Object(fields));
398
- },
399
- true => ()
400
- );
401
- },
402
- .None => ()
403
- );
404
- while runtime(true), () => {
405
- self.skip_ws();
406
- match(self.peek(),
407
- .None => { return .Err(.UnexpectedEnd); },
408
- .Some(c) => {
409
- cond(
410
- (c != u8(34)) => { return .Err(.UnexpectedChar(c, self.pos)); },
411
- true => ()
412
- );
413
- }
414
- );
415
- key_r := self.parse_string();
416
- match(key_r,
417
- .Err(e) => { return .Err(e); },
418
- .Ok(key) => {
419
- self.skip_ws();
420
- match(self.expect(u8(58)), // ':'
421
- .Err(e) => { return .Err(e); },
422
- .Ok(_) => ()
423
- );
424
- match(self.parse_value(),
425
- .Err(e) => { return .Err(e); },
426
- .Ok(val) => {
427
- fields.push(JsonKV(key: key, value: val));
428
- }
336
+ _parse_value :: (fn(p: _Parser) -> Result(JsonValue, JsonError))({
337
+ p.skip_ws();
338
+ match(p.peek(),
339
+ .None => .Err(.UnexpectedEnd),
340
+ .Some(c) =>
341
+ cond(
342
+ (c == u8(34)) =>
343
+ match(p.parse_string(), .Err(e) => .Err(e), .Ok(s) => .Ok(.Str(s))),
344
+ (c == u8(123)) => { // '{' — parse object
345
+ p.advance();
346
+ keys := ArrayList(String).new();
347
+ vals := ArrayList(JsonValue).new();
348
+ p.skip_ws();
349
+ match(p.peek(),
350
+ .Some(c2) => {
351
+ cond(
352
+ (c2 == u8(125)) => {
353
+ p.advance();
354
+ return .Ok(.Object(keys, vals));
355
+ },
356
+ true => ()
357
+ );
358
+ },
359
+ .None => ()
429
360
  );
430
- }
431
- );
432
- self.skip_ws();
433
- match(self.peek(),
434
- .Some(c) => {
435
- cond(
436
- (c == u8(44)) => { self.advance(); }, // ','
437
- (c == u8(125)) => { self.advance(); break; }, // '}'
438
- true => { return .Err(.UnexpectedChar(c, self.pos)); }
361
+ while runtime(true), {
362
+ p.skip_ws();
363
+ match(p.peek(),
364
+ .None => { return .Err(.UnexpectedEnd); },
365
+ .Some(c2) => {
366
+ cond(
367
+ (c2 != u8(34)) => { return .Err(.UnexpectedChar(c2, p.pos)); },
368
+ true => ()
369
+ );
370
+ }
371
+ );
372
+ key_r := p.parse_string();
373
+ match(key_r,
374
+ .Err(e) => { return .Err(e); },
375
+ .Ok(key) => {
376
+ p.skip_ws();
377
+ match(p.expect(u8(58)),
378
+ .Err(e) => { return .Err(e); },
379
+ .Ok(_) => ()
380
+ );
381
+ match(recur(p),
382
+ .Err(e) => { return .Err(e); },
383
+ .Ok(val) => {
384
+ keys.push(key);
385
+ vals.push(val);
386
+ }
387
+ );
388
+ }
389
+ );
390
+ p.skip_ws();
391
+ match(p.peek(),
392
+ .Some(c2) => {
393
+ cond(
394
+ (c2 == u8(44)) => { p.advance(); },
395
+ (c2 == u8(125)) => { p.advance(); break; },
396
+ true => { return .Err(.UnexpectedChar(c2, p.pos)); }
397
+ );
398
+ },
399
+ .None => { return .Err(.UnexpectedEnd); }
400
+ );
401
+ };
402
+ .Ok(.Object(keys, vals))
403
+ },
404
+ (c == u8(91)) => { // '[' — parse array
405
+ p.advance();
406
+ items := ArrayList(JsonValue).new();
407
+ p.skip_ws();
408
+ match(p.peek(),
409
+ .Some(c2) => {
410
+ cond(
411
+ (c2 == u8(93)) => {
412
+ p.advance();
413
+ return .Ok(.Array(items));
414
+ },
415
+ true => ()
416
+ );
417
+ },
418
+ .None => ()
439
419
  );
420
+ while runtime(true), {
421
+ match(recur(p),
422
+ .Err(e) => { return .Err(e); },
423
+ .Ok(v) => { items.push(v); }
424
+ );
425
+ p.skip_ws();
426
+ match(p.peek(),
427
+ .Some(c2) => {
428
+ cond(
429
+ (c2 == u8(44)) => { p.advance(); },
430
+ (c2 == u8(93)) => { p.advance(); break; },
431
+ true => { return .Err(.UnexpectedChar(c2, p.pos)); }
432
+ );
433
+ },
434
+ .None => { return .Err(.UnexpectedEnd); }
435
+ );
436
+ };
437
+ .Ok(.Array(items))
440
438
  },
441
- .None => { return .Err(.UnexpectedEnd); }
442
- );
443
- };
444
- .Ok(.Object(fields))
445
- })
446
- );
439
+ (c == u8(116)) => _parse_true_lit(p),
440
+ (c == u8(102)) => _parse_false_lit(p),
441
+ (c == u8(110)) => _parse_null_lit(p),
442
+ true =>
443
+ match(p.parse_number(), .Err(e) => .Err(e), .Ok(n) => .Ok(.Number(n)))
444
+ )
445
+ )
446
+ });
447
447
 
448
448
  // ============================================================================
449
449
  // Public API
@@ -451,7 +451,7 @@ impl(_Parser,
451
451
 
452
452
  json_parse :: (fn(s: str) -> Result(JsonValue, JsonError))({
453
453
  p := _Parser.new(s);
454
- p.parse_value()
454
+ _parse_value(p)
455
455
  });
456
456
 
457
457
  export json_parse;
@@ -472,7 +472,7 @@ _write_str_escaped :: (fn(s: String, out: ArrayList(u8)) -> unit)({
472
472
  (b == u8(10)) => { out.push(u8(92)); out.push(u8(110)); },
473
473
  (b == u8(9)) => { out.push(u8(92)); out.push(u8(116)); },
474
474
  (b == u8(13)) => { out.push(u8(92)); out.push(u8(114)); },
475
- true => out.push(b)
475
+ true => { out.push(b); }
476
476
  );
477
477
  };
478
478
  out.push(u8(34)); // '"'
@@ -512,25 +512,24 @@ _stringify_into :: (fn(value: JsonValue, out: ArrayList(u8)) -> unit)({
512
512
  i := usize(0);
513
513
  while (i < items.len()), (i = (i + usize(1))), {
514
514
  cond(
515
- (i > usize(0)) => out.push(u8(44)), // ','
515
+ (i > usize(0)) => { out.push(u8(44)); },
516
516
  true => ()
517
517
  );
518
- _stringify_into(items.get(i).unwrap(), out);
518
+ recur(items.get(i).unwrap(), out);
519
519
  };
520
520
  out.push(u8(93)); // ']'
521
521
  },
522
- .Object(fields) => {
522
+ .Object(keys, values) => {
523
523
  out.push(u8(123)); // '{'
524
524
  i := usize(0);
525
- while (i < fields.len()), (i = (i + usize(1))), {
525
+ while (i < keys.len()), (i = (i + usize(1))), {
526
526
  cond(
527
- (i > usize(0)) => out.push(u8(44)), // ','
527
+ (i > usize(0)) => { out.push(u8(44)); },
528
528
  true => ()
529
529
  );
530
- kv := fields.get(i).unwrap();
531
- _write_str_escaped(kv.key, out);
530
+ _write_str_escaped(keys.get(i).unwrap(), out);
532
531
  out.push(u8(58)); // ':'
533
- _stringify_into(kv.value, out);
532
+ recur(values.get(i).unwrap(), out);
534
533
  };
535
534
  out.push(u8(125)); // '}'
536
535
  }
@@ -19,7 +19,7 @@ open import "../string";
19
19
  utf8_to_utf16 :: (fn(s: str) -> ArrayList(u16))({
20
20
  out := ArrayList(u16).new();
21
21
  i := usize(0);
22
- while (i < s.len()), () => {
22
+ while (i < s.len()), {
23
23
  b0 := u32(s.bytes(i));
24
24
  cond(
25
25
  (b0 < u32(0x80)) => {
@@ -66,7 +66,7 @@ export utf8_to_utf16;
66
66
  utf16_to_utf8 :: (fn(data: ArrayList(u16)) -> Result(String, EncodingError))({
67
67
  out := ArrayList(u8).new();
68
68
  i := usize(0);
69
- while (i < data.len()), () => {
69
+ while (i < data.len()), {
70
70
  w := u32(data.get(i).unwrap());
71
71
  cond(
72
72
  // Surrogate pair: high surrogate 0xD800-0xDBFF
@@ -23,4 +23,4 @@ Display :: (fn(comptime(T) : Type) -> comptime(Type))
23
23
  )
24
24
  ;
25
25
 
26
- export Display;
26
+ export Display;
package/std/fmt/writer.yo CHANGED
@@ -190,9 +190,7 @@ impl(Writer,
190
190
  write_padded : (fn(self: Self, s: str, width: usize, pad: rune, align: Alignment) -> Self)({
191
191
  len := s.len();
192
192
  cond(
193
- (len >= width) => {
194
- self.write_str(s)
195
- },
193
+ (len >= width) => self.write_str(s),
196
194
  true => {
197
195
  padding := (width - len);
198
196
  match(align,
@@ -240,4 +238,4 @@ impl(Writer,
240
238
  )
241
239
  );
242
240
 
243
- export Writer;
241
+ export Writer;
package/std/fs/dir.yo CHANGED
@@ -1,6 +1,6 @@
1
1
  // std/fs/dir.yo - High-level directory operations
2
2
  //
3
- // Wraps low-level std/io/dir with typed APIs using Result and IOError.
3
+ // Wraps low-level std/sys/dir with typed APIs using Result and IOError.
4
4
  //
5
5
  // Example:
6
6
  // { create_dir, remove_dir, read_dir } :: import "std/fs/dir";
@@ -17,15 +17,15 @@
17
17
  { ArrayList } :: import "../collections/array_list";
18
18
  open import "../string";
19
19
  { Path } :: import "../path";
20
- { IOError } :: import "../io/errors";
21
- IO_dir :: import "../io/dir";
22
- IO_file :: import "../io/file";
20
+ { IOError } :: import "../sys/errors";
21
+ IO_dir :: import "../sys/dir";
22
+ IO_file :: import "../sys/file";
23
23
  { platform, Platform } :: import "../process";
24
24
  {
25
25
  AT_FDCWD, AT_REMOVEDIR, O_RDONLY, O_DIRECTORY,
26
26
  DEFAULT_DIR_MODE,
27
27
  DT_REG, DT_DIR, DT_LNK
28
- } :: import "../io/constants";
28
+ } :: import "../sys/constants";
29
29
 
30
30
  // ============================================================================
31
31
  // FileType enum
package/std/fs/file.yo CHANGED
@@ -26,16 +26,16 @@
26
26
  open import "../string";
27
27
  open import "../fmt";
28
28
  { Path } :: import "../path";
29
- { IOError } :: import "../io/errors";
29
+ { IOError } :: import "../sys/errors";
30
30
  { Metadata } :: import "./metadata";
31
31
  _metadata_mod :: import "./metadata";
32
32
  { OpenMode, FilePermission, _open_mode_to_flags, _open_mode_needs_perm } :: import "./types";
33
- IO_file :: import "../io/file";
34
- IO_seek :: import "../io/seek";
33
+ IO_file :: import "../sys/file";
34
+ IO_seek :: import "../sys/seek";
35
35
  {
36
36
  AT_FDCWD, O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND,
37
37
  O_CLOEXEC, DEFAULT_FILE_MODE
38
- } :: import "../io/constants";
38
+ } :: import "../sys/constants";
39
39
 
40
40
  // ============================================================================
41
41
  // File
@@ -112,8 +112,13 @@ impl(File,
112
112
  fd := self._fd;
113
113
  io.async((using(io : IO)) => {
114
114
  data_bytes := data.as_bytes();
115
- result := io.await(IO_file.write(fd, data_bytes.ptr().unwrap(), u32(data_bytes.len()), u64(0)));
116
- IOError.from_result(result)
115
+ cond(
116
+ (data_bytes.len() == usize(0)) => .Ok(i32(0)),
117
+ true => {
118
+ result := io.await(IO_file.write(fd, data_bytes.ptr().unwrap(), u32(data_bytes.len()), u64(0)));
119
+ IOError.from_result(result)
120
+ }
121
+ )
117
122
  })
118
123
  }),
119
124
 
@@ -121,10 +126,15 @@ impl(File,
121
126
  // Returns number of bytes written.
122
127
  write_bytes : (fn(self: Self, data: ArrayList(u8), using(io : IO)) -> Impl(Future(Result(i32, IOError), IO)))({
123
128
  fd := self._fd;
124
- io.async((using(io : IO)) => {
125
- result := io.await(IO_file.write(fd, data.ptr().unwrap(), u32(data.len()), u64(0)));
126
- IOError.from_result(result)
127
- })
129
+ io.async((using(io : IO)) =>
130
+ cond(
131
+ (data.len() == usize(0)) => .Ok(i32(0)),
132
+ true => {
133
+ result := io.await(IO_file.write(fd, data.ptr().unwrap(), u32(data.len()), u64(0)));
134
+ IOError.from_result(result)
135
+ }
136
+ )
137
+ )
128
138
  }),
129
139
 
130
140
  // Read the entire file into a byte list.
@@ -143,9 +153,7 @@ impl(File,
143
153
  read_err = .Some(IOError.from_errno((i32(0) - n)));
144
154
  break;
145
155
  },
146
- (n == i32(0)) => {
147
- break;
148
- },
156
+ (n == i32(0)) => break,
149
157
  true => {
150
158
  offset = (offset + u64(n));
151
159
  i := usize(0);