@grain/stdlib 0.7.0 → 0.7.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 (60) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/array.md +491 -491
  3. package/bigint.md +198 -198
  4. package/buffer.gr +66 -1
  5. package/buffer.md +395 -272
  6. package/bytes.gr +1 -0
  7. package/bytes.md +200 -199
  8. package/char.md +125 -125
  9. package/exception.md +9 -9
  10. package/float32.md +195 -195
  11. package/float64.md +195 -195
  12. package/fs.md +115 -115
  13. package/hash.md +16 -16
  14. package/int16.md +155 -155
  15. package/int32.gr +1 -1
  16. package/int32.md +207 -207
  17. package/int64.gr +1 -1
  18. package/int64.md +207 -207
  19. package/int8.md +155 -155
  20. package/json.md +59 -59
  21. package/list.md +347 -347
  22. package/map.md +222 -222
  23. package/marshal.md +12 -12
  24. package/number.gr +119 -5
  25. package/number.md +503 -261
  26. package/option.md +141 -141
  27. package/package.json +1 -1
  28. package/path.md +90 -90
  29. package/pervasives.md +238 -238
  30. package/priorityqueue.md +112 -112
  31. package/queue.md +117 -117
  32. package/random.md +37 -37
  33. package/range.md +36 -36
  34. package/rational.md +107 -107
  35. package/regex.md +91 -91
  36. package/result.md +102 -102
  37. package/runtime/atof/decimal.md +6 -6
  38. package/runtime/compare.md +7 -7
  39. package/runtime/dataStructures.md +178 -178
  40. package/runtime/equal.md +7 -7
  41. package/runtime/exception.md +15 -15
  42. package/runtime/malloc.md +9 -9
  43. package/runtime/numbers.md +269 -269
  44. package/runtime/string.md +17 -17
  45. package/runtime/unsafe/conv.md +6 -6
  46. package/runtime/unsafe/memory.md +10 -10
  47. package/runtime/utf8.md +31 -31
  48. package/runtime/wasi.md +9 -9
  49. package/set.md +211 -211
  50. package/stack.md +122 -122
  51. package/string.md +228 -228
  52. package/uint16.md +148 -148
  53. package/uint32.md +192 -192
  54. package/uint64.md +192 -192
  55. package/uint8.md +148 -148
  56. package/uri.md +77 -77
  57. package/wasi/file.md +269 -269
  58. package/wasi/process.md +21 -21
  59. package/wasi/random.md +9 -9
  60. package/wasi/time.md +12 -12
package/buffer.gr CHANGED
@@ -24,7 +24,7 @@ from "char" include Char
24
24
  from "runtime/numbers" include Numbers
25
25
  use Numbers.{ coerceNumberToWasmI32 }
26
26
  from "runtime/utf8" include Utf8
27
- use Utf8.{ usvEncodeLength }
27
+ use Utf8.{ usvEncodeLength, utf8ByteCount, exception MalformedUnicode }
28
28
  from "runtime/unsafe/offsets" include Offsets
29
29
  use Offsets.{ _BYTES_LEN_OFFSET, _BYTES_DATA_OFFSET }
30
30
 
@@ -376,6 +376,41 @@ provide let addString = (string, buffer) => {
376
376
  buffer.len += bytelen
377
377
  }
378
378
 
379
+ /**
380
+ * Gets the UTF-8 encoded character at the given byte index.
381
+ *
382
+ * @param index: The byte index to access
383
+ * @param buffer: The buffer to access
384
+ * @returns A character starting at the given index
385
+ *
386
+ * @throws IndexOutOfBounds: When `index` is negative
387
+ * @throws IndexOutOfBounds: When `index + 1` is greater than the buffer size
388
+ * @throws MalformedUnicode: When the bytes at the index are not a valid UTF-8 sequence
389
+ *
390
+ * @example
391
+ * let buf = Buffer.make(32)
392
+ * Buffer.addString("Hello World 🌾", buf)
393
+ * assert Buffer.getChar(12, buf) == '🌾'
394
+ *
395
+ * @since v0.7.1
396
+ */
397
+ @unsafe
398
+ provide let getChar = (index, buffer) => {
399
+ use WasmI32.{ (+), (&), (+), (==), (>) }
400
+ checkIsIndexInBounds(index, 1, buffer)
401
+ // Note: We do a raw check as we need the byte length before reading the full char
402
+ let bytes = buffer.data
403
+ let ptr = WasmI32.fromGrain(bytes)
404
+ let offset = coerceNumberToWasmI32(index)
405
+ let byte = WasmI32.load8U(ptr + offset, _BYTES_DATA_OFFSET)
406
+ let charSize = utf8ByteCount(byte)
407
+ if (offset + charSize > coerceNumberToWasmI32(buffer.len)) {
408
+ throw MalformedUnicode
409
+ }
410
+ ignore(bytes)
411
+ Bytes.getChar(index, bytes)
412
+ }
413
+
379
414
  /**
380
415
  * Appends the bytes of a character to a buffer.
381
416
  *
@@ -591,8 +626,11 @@ provide let getInt8 = (index, buffer) => {
591
626
  * Buffer.setInt8(0, 3s, buf)
592
627
  * assert Buffer.getInt8(0, buf) == 3s
593
628
  *
629
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
630
+ *
594
631
  * @since v0.4.0
595
632
  * @history v0.6.0: `value` argument type changed to `Int8`
633
+ * @history v0.7.1: Deprecated in favor of `Bytes.setInt8`
596
634
  */
597
635
  provide let setInt8 = (index, value, buffer) => {
598
636
  checkIsIndexInBounds(index, _8BIT_LEN, buffer)
@@ -658,7 +696,10 @@ provide let getUint8 = (index, buffer) => {
658
696
  * Buffer.setUint8(4us, buf)
659
697
  * assert Buffer.getUint8(0, buf) == 4us
660
698
  *
699
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
700
+ *
661
701
  * @since v0.6.0
702
+ * @history v0.7.1: Deprecated in favor of `Bytes.setUint8`
662
703
  */
663
704
  provide let setUint8 = (index, value, buffer) => {
664
705
  checkIsIndexInBounds(index, _8BIT_LEN, buffer)
@@ -723,8 +764,11 @@ provide let getInt16 = (index, buffer) => {
723
764
  * Buffer.setInt16(5, 1S, buf)
724
765
  * assert Buffer.getInt16(5, buf) == 1S
725
766
  *
767
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
768
+ *
726
769
  * @since v0.4.0
727
770
  * @history v0.6.0: `value` argument type changed to `Int16`
771
+ * @history v0.7.1: Deprecated in favor of `Bytes.setInt16`
728
772
  */
729
773
  provide let setInt16 = (index, value, buffer) => {
730
774
  checkIsIndexInBounds(index, _16BIT_LEN, buffer)
@@ -790,7 +834,10 @@ provide let getUint16 = (index, buffer) => {
790
834
  * Buffer.setUint16(0, 1uS, buf)
791
835
  * assert Buffer.getUint16(0, buf) == 1uS
792
836
  *
837
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
838
+ *
793
839
  * @since v0.6.0
840
+ * @history v0.7.1: Deprecated in favor of `Bytes.setUint16`
794
841
  */
795
842
  provide let setUint16 = (index, value, buffer) => {
796
843
  checkIsIndexInBounds(index, _16BIT_LEN, buffer)
@@ -854,7 +901,10 @@ provide let getInt32 = (index, buffer) => {
854
901
  * Buffer.setInt32(3, 1l, buf)
855
902
  * assert Buffer.getInt32(3, buf) == 1l
856
903
  *
904
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
905
+ *
857
906
  * @since v0.4.0
907
+ * @history v0.7.1: Deprecated in favor of `Bytes.setInt32`
858
908
  */
859
909
  provide let setInt32 = (index, value, buffer) => {
860
910
  checkIsIndexInBounds(index, _32BIT_LEN, buffer)
@@ -918,7 +968,10 @@ provide let getUint32 = (index, buffer) => {
918
968
  * Buffer.setUint32(0, 1ul, buf)
919
969
  * assert Buffer.getUint32(0, buf) == 1ul
920
970
  *
971
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
972
+ *
921
973
  * @since v0.6.0
974
+ * @history v0.7.1: Deprecated in favor of `Bytes.setUint32`
922
975
  */
923
976
  provide let setUint32 = (index, value, buffer) => {
924
977
  checkIsIndexInBounds(index, _32BIT_LEN, buffer)
@@ -982,7 +1035,10 @@ provide let getFloat32 = (index, buffer) => {
982
1035
  * Buffer.setFloat32(0, 1.0f, buf)
983
1036
  * assert Buffer.getFloat32(0, buf) == 1.0f
984
1037
  *
1038
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
1039
+ *
985
1040
  * @since v0.4.0
1041
+ * @history v0.7.1: Deprecated in favor of `Bytes.setFloat32`
986
1042
  */
987
1043
  provide let setFloat32 = (index, value, buffer) => {
988
1044
  checkIsIndexInBounds(index, _32BIT_LEN, buffer)
@@ -1049,7 +1105,10 @@ provide let getInt64 = (index, buffer) => {
1049
1105
  * Buffer.setInt64(0, 1L, buf)
1050
1106
  * assert Buffer.getInt64(0, buf) == 1L
1051
1107
  *
1108
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
1109
+ *
1052
1110
  * @since v0.4.0
1111
+ * @history v0.7.1: Deprecated in favor of `Bytes.setInt64
1053
1112
  */
1054
1113
  provide let setInt64 = (index, value, buffer) => {
1055
1114
  checkIsIndexInBounds(index, _64BIT_LEN, buffer)
@@ -1116,7 +1175,10 @@ provide let getUint64 = (index, buffer) => {
1116
1175
  * Buffer.setUint64(0, 1uL, buf)
1117
1176
  * assert Buffer.getUint64(0, buf) == 1uL
1118
1177
  *
1178
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
1179
+ *
1119
1180
  * @since v0.6.0
1181
+ * @history v0.7.1: Deprecated in favor of `Bytes.setUint64`
1120
1182
  */
1121
1183
  provide let setUint64 = (index, value, buffer) => {
1122
1184
  checkIsIndexInBounds(index, _64BIT_LEN, buffer)
@@ -1183,7 +1245,10 @@ provide let getFloat64 = (index, buffer) => {
1183
1245
  * Buffer.setFloat64(0, 1.0F, buf)
1184
1246
  * assert Buffer.getFloat64(0, buf) == 1.0F
1185
1247
  *
1248
+ * @deprecated Use `Bytes` instead of `Buffer` for set operations.
1249
+ *
1186
1250
  * @since v0.4.0
1251
+ * @history v0.7.1: Deprecated in favor of `Bytes.setFloat64`
1187
1252
  */
1188
1253
  provide let setFloat64 = (index, value, buffer) => {
1189
1254
  checkIsIndexInBounds(index, _64BIT_LEN, buffer)