@grain/stdlib 0.4.2 → 0.4.6

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 (61) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/LICENSE +1 -1
  3. package/array.gr +200 -89
  4. package/array.md +81 -5
  5. package/buffer.gr +93 -36
  6. package/bytes.gr +10 -10
  7. package/char.gr +112 -56
  8. package/char.md +200 -0
  9. package/float32.gr +120 -4
  10. package/float32.md +315 -0
  11. package/float64.gr +120 -4
  12. package/float64.md +315 -0
  13. package/hash.gr +42 -15
  14. package/hash.md +44 -0
  15. package/int32.gr +370 -75
  16. package/int32.md +833 -0
  17. package/int64.gr +370 -75
  18. package/int64.md +833 -0
  19. package/list.gr +121 -50
  20. package/map.gr +106 -110
  21. package/number.gr +37 -1
  22. package/number.md +66 -0
  23. package/option.gr +260 -53
  24. package/option.md +579 -0
  25. package/package.json +1 -1
  26. package/pervasives.gr +32 -20
  27. package/queue.gr +102 -30
  28. package/queue.md +191 -0
  29. package/range.gr +26 -26
  30. package/range.md +1 -1
  31. package/regex.md +9 -9
  32. package/result.gr +216 -70
  33. package/result.md +446 -0
  34. package/runtime/dataStructures.gr +28 -29
  35. package/runtime/debug.gr +0 -1
  36. package/runtime/equal.gr +37 -16
  37. package/runtime/exception.gr +28 -15
  38. package/runtime/gc.gr +33 -20
  39. package/runtime/malloc.gr +19 -11
  40. package/runtime/numberUtils.gr +208 -103
  41. package/runtime/numbers.gr +217 -118
  42. package/runtime/string.gr +98 -39
  43. package/runtime/stringUtils.gr +176 -0
  44. package/runtime/unsafe/conv.gr +10 -10
  45. package/runtime/unsafe/memory.gr +14 -3
  46. package/runtime/unsafe/printWasm.gr +4 -4
  47. package/runtime/unsafe/tags.gr +2 -2
  48. package/runtime/unsafe/wasmf32.gr +9 -2
  49. package/runtime/unsafe/wasmf64.gr +9 -2
  50. package/runtime/unsafe/wasmi32.gr +65 -47
  51. package/runtime/unsafe/wasmi64.gr +78 -50
  52. package/runtime/wasi.gr +199 -45
  53. package/set.gr +281 -119
  54. package/set.md +502 -0
  55. package/stack.gr +26 -26
  56. package/string.gr +657 -341
  57. package/string.md +815 -0
  58. package/sys/file.gr +356 -177
  59. package/sys/process.gr +10 -6
  60. package/sys/random.gr +3 -6
  61. package/sys/time.gr +3 -3
@@ -12,7 +12,7 @@ import WasmI32, {
12
12
  sub as (-),
13
13
  shl as (<<),
14
14
  and as (&),
15
- or as (|)
15
+ or as (|),
16
16
  // no signed imports, as care should be taken to use signed or unsigned operators
17
17
  } from "runtime/unsafe/wasmi32"
18
18
  import WasmI64 from "runtime/unsafe/wasmi64"
@@ -20,10 +20,10 @@ import WasmF64 from "runtime/unsafe/wasmf64"
20
20
  import Exception from "runtime/exception"
21
21
  import { allocateString, singleByteString } from "runtime/dataStructures"
22
22
 
23
- primitive (!) : Bool -> Bool = "@not"
24
- primitive (&&) : (Bool, Bool) -> Bool = "@and"
25
- primitive (||) : (Bool, Bool) -> Bool = "@or"
26
- primitive throw : Exception -> a = "@throw"
23
+ primitive (!): Bool -> Bool = "@not"
24
+ primitive (&&): (Bool, Bool) -> Bool = "@and"
25
+ primitive (||): (Bool, Bool) -> Bool = "@or"
26
+ primitive throw: Exception -> a = "@throw"
27
27
 
28
28
  export let _MAX_DOUBLE_LENGTH = 28n
29
29
 
@@ -695,49 +695,63 @@ let get_FRC_POWERS = () => {
695
695
  _FRC_POWERS
696
696
  }
697
697
 
698
- let isPowerOf2 = (value) => {
698
+ let isPowerOf2 = value => {
699
699
  WasmI32.popcnt(value) == 1n
700
700
  }
701
701
 
702
702
  // Count number of decimals for u32 values
703
703
  // In our case input value always non-zero so we can simplify some parts
704
- export let decimalCount32 = (value) => {
704
+ export let decimalCount32 = value => {
705
705
  if (WasmI32.ltU(value, 100000n)) {
706
706
  if (WasmI32.ltU(value, 100n)) {
707
707
  1n + (if (WasmI32.geU(value, 10n)) 1n else 0n)
708
708
  } else {
709
- 3n + (if (WasmI32.geU(value, 10000n)) 1n else 0n) + (if (WasmI32.geU(value, 1000n)) 1n else 0n)
709
+ 3n +
710
+ (if (WasmI32.geU(value, 10000n)) 1n else 0n) +
711
+ (if (WasmI32.geU(value, 1000n)) 1n else 0n)
710
712
  }
711
713
  } else {
712
714
  if (WasmI32.ltU(value, 10000000n)) {
713
715
  6n + (if (WasmI32.geU(value, 1000000n)) 1n else 0n)
714
716
  } else {
715
- 8n + (if (WasmI32.geU(value, 1000000000n)) 1n else 0n) + (if (WasmI32.geU(value, 100000000n)) 1n else 0n)
717
+ 8n +
718
+ (if (WasmI32.geU(value, 1000000000n)) 1n else 0n) +
719
+ (if (WasmI32.geU(value, 100000000n)) 1n else 0n)
716
720
  }
717
721
  }
718
722
  }
719
723
 
720
724
  // Count number of decimals for u64 values
721
725
  // In our case input value always greater than 2^32-1 so we can skip some parts
722
- let decimalCount64High = (value) => {
726
+ let decimalCount64High = value => {
723
727
  if (WasmI64.ltU(value, 1000000000000000N)) {
724
728
  if (WasmI64.ltU(value, 1000000000000N)) {
725
- 10n + (if (WasmI64.geU(value, 100000000000N)) 1n else 0n) + (if (WasmI64.geU(value, 10000000000N)) 1n else 0n)
729
+ 10n +
730
+ (if (WasmI64.geU(value, 100000000000N)) 1n else 0n) +
731
+ (if (WasmI64.geU(value, 10000000000N)) 1n else 0n)
726
732
  } else {
727
- 13n + (if (WasmI64.geU(value, 100000000000000N)) 1n else 0n) + (if (WasmI64.geU(value, 10000000000000N)) 1n else 0n)
733
+ 13n +
734
+ (if (WasmI64.geU(value, 100000000000000N)) 1n else 0n) +
735
+ (if (WasmI64.geU(value, 10000000000000N)) 1n else 0n)
728
736
  }
729
737
  } else {
730
738
  if (WasmI64.ltU(value, 100000000000000000N)) {
731
739
  16n + (if (WasmI64.geU(value, 10000000000000000N)) 1n else 0n)
732
740
  } else {
733
- 18n + (if (WasmI64.geU(value, 0x8AC7230489E80000N)) 1n else 0n) + (if (WasmI64.geU(value, 1000000000000000000N)) 1n else 0n)
741
+ 18n +
742
+ (if (WasmI64.geU(value, 0x8AC7230489E80000N)) 1n else 0n) +
743
+ (if (WasmI64.geU(value, 1000000000000000000N)) 1n else 0n)
734
744
  }
735
745
  }
736
746
  }
737
747
 
738
748
  let ulog_base = (num, base) => {
739
749
  if (isPowerOf2(base)) {
740
- WasmI32.divU((63n - WasmI32.wrapI64(WasmI64.clz(num))), (31n - WasmI32.clz(base))) + 1n
750
+ WasmI32.divU(
751
+ 63n - WasmI32.wrapI64(WasmI64.clz(num)),
752
+ 31n - WasmI32.clz(base)
753
+ ) +
754
+ 1n
741
755
  } else {
742
756
  let b64 = WasmI64.extendI32U(base)
743
757
  let mut b = b64
@@ -750,7 +764,7 @@ let ulog_base = (num, base) => {
750
764
  }
751
765
  while (WasmI64.geU(num, 1N)) {
752
766
  num = WasmI64.divU(num, b64)
753
- e = e + 1n
767
+ e += 1n
754
768
  }
755
769
  e - 1n
756
770
  }
@@ -772,11 +786,11 @@ let utoa32_dec_lut = (buffer, num, offset) => {
772
786
  let digits2 = WasmI32.load16U(get_DIGITS() + (d2 << 1n), 0n)
773
787
 
774
788
  offset -= 4n
775
- WasmI32.store(buffer + offset, digits1 | (digits2 << 16n), 0n)
789
+ WasmI32.store(buffer + offset, digits1 | digits2 << 16n, 0n)
776
790
  }
777
791
 
778
792
  if (WasmI32.geU(num, 100n)) {
779
- let t = WasmI32.divU(num, 100n)
793
+ let t = WasmI32.divU(num, 100n)
780
794
  let d1 = WasmI32.remU(num, 100n)
781
795
  num = t
782
796
  offset -= 2n
@@ -815,13 +829,13 @@ let utoa64_dec_lut = (buffer, num, offset) => {
815
829
  let mut digits2 = WasmI32.load16U(get_DIGITS() + (c2 << 1n), 0n)
816
830
 
817
831
  offset -= 4n
818
- WasmI32.store(buffer + offset, digits1 | (digits2 << 16n), 0n)
832
+ WasmI32.store(buffer + offset, digits1 | digits2 << 16n, 0n)
819
833
 
820
834
  digits1 = WasmI32.load16U(get_DIGITS() + (b1 << 1n), 0n)
821
835
  digits2 = WasmI32.load16U(get_DIGITS() + (b2 << 1n), 0n)
822
836
 
823
837
  offset -= 4n
824
- WasmI32.store(buffer + offset, digits1 | (digits2 << 16n), 0n)
838
+ WasmI32.store(buffer + offset, digits1 | digits2 << 16n, 0n)
825
839
  }
826
840
 
827
841
  utoa32_dec_lut(buffer, WasmI32.wrapI64(num), offset)
@@ -841,7 +855,11 @@ let utoa_hex_lut = (buffer, num, offset) => {
841
855
  num = WasmI64.shrU(num, 8N)
842
856
  }
843
857
  if (WasmI32.ne(offset & 1n, 0n)) {
844
- WasmI32.store8(buffer, WasmI32.load8U(lut + (WasmI32.wrapI64(num) << 5n), 0n), 0n)
858
+ WasmI32.store8(
859
+ buffer,
860
+ WasmI32.load8U(lut + (WasmI32.wrapI64(num) << 5n), 0n),
861
+ 0n
862
+ )
845
863
  }
846
864
  }
847
865
 
@@ -866,12 +884,16 @@ let utoa64_any_core = (buffer, num, offset, radix) => {
866
884
  let base = WasmI64.extendI32U(radix)
867
885
  let mut num = num
868
886
  let mut offset = offset
869
- if ((radix & (radix - 1n)) == 0n) { // for radix which pow of two
887
+ if ((radix & radix - 1n) == 0n) { // for radix which pow of two
870
888
  let shift = WasmI64.extendI32U(WasmI32.ctz(radix) & 7n)
871
889
  let mask = WasmI64.sub(base, 1N)
872
890
  for (;;) {
873
891
  offset -= 1n
874
- WasmI32.store8(buffer + offset, WasmI32.load8U(lut + (WasmI32.wrapI64(WasmI64.and(num, mask))), 0n), 0n)
892
+ WasmI32.store8(
893
+ buffer + offset,
894
+ WasmI32.load8U(lut + WasmI32.wrapI64(WasmI64.and(num, mask)), 0n),
895
+ 0n
896
+ )
875
897
  num = WasmI64.shrU(num, shift)
876
898
  if (WasmI64.eqz(num)) break
877
899
  }
@@ -879,7 +901,14 @@ let utoa64_any_core = (buffer, num, offset, radix) => {
879
901
  for (;;) {
880
902
  offset -= 1n
881
903
  let q = WasmI64.divU(num, base)
882
- WasmI32.store8(buffer + offset, WasmI32.load8U(lut + (WasmI32.wrapI64(WasmI64.sub(num, WasmI64.mul(q, base)))), 0n), 0n)
904
+ WasmI32.store8(
905
+ buffer + offset,
906
+ WasmI32.load8U(
907
+ lut + WasmI32.wrapI64(WasmI64.sub(num, WasmI64.mul(q, base))),
908
+ 0n
909
+ ),
910
+ 0n
911
+ )
883
912
  num = q
884
913
  if (WasmI64.eqz(num)) break
885
914
  }
@@ -888,7 +917,9 @@ let utoa64_any_core = (buffer, num, offset, radix) => {
888
917
 
889
918
  export let utoa32Buffered = (buf, value, radix) => {
890
919
  if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
891
- throw Exception.InvalidArgument("toString() radix argument must be between 2 and 36")
920
+ throw Exception.InvalidArgument(
921
+ "toString() radix argument must be between 2 and 36"
922
+ )
892
923
  }
893
924
  let str = if (WasmI32.eqz(value)) {
894
925
  WasmI32.store8(buf, _CHAR_CODE_0, 0n)
@@ -907,7 +938,9 @@ export let utoa32Buffered = (buf, value, radix) => {
907
938
 
908
939
  export let utoa32 = (value, radix) => {
909
940
  if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
910
- throw Exception.InvalidArgument("toString() radix argument must be between 2 and 36")
941
+ throw Exception.InvalidArgument(
942
+ "toString() radix argument must be between 2 and 36"
943
+ )
911
944
  }
912
945
  let str = if (WasmI32.eqz(value)) {
913
946
  singleByteString(_CHAR_CODE_0)
@@ -933,7 +966,9 @@ export let utoa32 = (value, radix) => {
933
966
  export let itoa32 = (value, radix) => {
934
967
  let mut value = value
935
968
  if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
936
- throw Exception.InvalidArgument("toString() radix argument must be between 2 and 36")
969
+ throw Exception.InvalidArgument(
970
+ "toString() radix argument must be between 2 and 36"
971
+ )
937
972
  }
938
973
  let mut out = 0n
939
974
  let sign = WasmI32.shrU(value, 31n)
@@ -962,13 +997,15 @@ export let itoa32 = (value, radix) => {
962
997
 
963
998
  export let utoa64 = (value, radix) => {
964
999
  if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
965
- throw Exception.InvalidArgument("toString() radix argument must be between 2 and 36")
1000
+ throw Exception.InvalidArgument(
1001
+ "toString() radix argument must be between 2 and 36"
1002
+ )
966
1003
  }
967
1004
  let str = if (WasmI64.eqz(value)) {
968
1005
  singleByteString(_CHAR_CODE_0)
969
1006
  } else if (radix == 10n) {
970
1007
  if (WasmI64.leU(value, _I32_MAX)) {
971
- let val32 = WasmI32.wrapI64(value)
1008
+ let val32 = WasmI32.wrapI64(value)
972
1009
  let decimals = decimalCount32(val32)
973
1010
  let out = allocateString(decimals)
974
1011
  utoa32_dec_core(out + 8n, val32, decimals)
@@ -980,7 +1017,8 @@ export let utoa64 = (value, radix) => {
980
1017
  out
981
1018
  }
982
1019
  } else if (radix == 16n) {
983
- let decimals = WasmI32.shrU(63n - WasmI32.wrapI64(WasmI64.clz(value)), 2n) + 1n
1020
+ let decimals = WasmI32.shrU(63n - WasmI32.wrapI64(WasmI64.clz(value)), 2n) +
1021
+ 1n
984
1022
  let out = allocateString(decimals)
985
1023
  utoa64_hex_core(out + 8n, value, decimals)
986
1024
  out
@@ -995,7 +1033,9 @@ export let utoa64 = (value, radix) => {
995
1033
 
996
1034
  export let itoa64 = (value, radix) => {
997
1035
  if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
998
- throw Exception.InvalidArgument("toString() radix argument must be between 2 and 36")
1036
+ throw Exception.InvalidArgument(
1037
+ "toString() radix argument must be between 2 and 36"
1038
+ )
999
1039
  }
1000
1040
 
1001
1041
  let mut value = value
@@ -1008,7 +1048,7 @@ export let itoa64 = (value, radix) => {
1008
1048
  out = singleByteString(_CHAR_CODE_0)
1009
1049
  } else if (radix == 10n) {
1010
1050
  if (WasmI64.leU(value, _I32_MAX)) {
1011
- let val32 = WasmI32.wrapI64(value)
1051
+ let val32 = WasmI32.wrapI64(value)
1012
1052
  let decimals = decimalCount32(val32) + sign
1013
1053
  out = allocateString(decimals)
1014
1054
  utoa32_dec_core(out + 8n, val32, decimals)
@@ -1018,7 +1058,9 @@ export let itoa64 = (value, radix) => {
1018
1058
  utoa64_dec_core(out + 8n, value, decimals)
1019
1059
  }
1020
1060
  } else if (radix == 16n) {
1021
- let decimals = WasmI32.shrU(63n - WasmI32.wrapI64(WasmI64.clz(value)), 2n) + 1n + sign
1061
+ let decimals = WasmI32.shrU(63n - WasmI32.wrapI64(WasmI64.clz(value)), 2n) +
1062
+ 1n +
1063
+ sign
1022
1064
  out = allocateString(decimals)
1023
1065
  utoa64_hex_core(out + 8n, value, decimals)
1024
1066
  } else {
@@ -1061,9 +1103,13 @@ let grisuRound = (buffer, len, delta, rest, ten_kappa, wp_w) => {
1061
1103
  let mut rest = rest
1062
1104
  while (
1063
1105
  WasmI64.ltU(rest, wp_w) &&
1064
- WasmI64.geU(WasmI64.sub(delta, rest), ten_kappa) && (
1106
+ WasmI64.geU(WasmI64.sub(delta, rest), ten_kappa) &&
1107
+ (
1065
1108
  WasmI64.ltU(WasmI64.add(rest, ten_kappa), wp_w) ||
1066
- WasmI64.gtU(WasmI64.sub(wp_w, rest), WasmI64.sub(WasmI64.add(rest, ten_kappa), wp_w))
1109
+ WasmI64.gtU(
1110
+ WasmI64.sub(wp_w, rest),
1111
+ WasmI64.sub(WasmI64.add(rest, ten_kappa), wp_w)
1112
+ )
1067
1113
  )
1068
1114
  ) {
1069
1115
  digit -= 1n
@@ -1076,11 +1122,13 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
1076
1122
  let mut delta = delta
1077
1123
  let one_exp = 0n - mp_exp
1078
1124
  let one_frc = WasmI64.shl(1N, WasmI64.extendI32U(one_exp))
1079
- let mask = WasmI64.sub(one_frc, 1N)
1125
+ let mask = WasmI64.sub(one_frc, 1N)
1080
1126
 
1081
1127
  let mut wp_w_frc = WasmI64.sub(mp_frc, w_frc)
1082
1128
 
1083
- let mut p1 = WasmI32.wrapI64(WasmI64.shrU(mp_frc, WasmI64.extendI32U(one_exp)))
1129
+ let mut p1 = WasmI32.wrapI64(
1130
+ WasmI64.shrU(mp_frc, WasmI64.extendI32U(one_exp))
1131
+ )
1084
1132
  let mut p2 = WasmI64.and(mp_frc, mask)
1085
1133
 
1086
1134
  let mut kappa = decimalCount32(p1)
@@ -1091,17 +1139,49 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
1091
1139
  while (WasmI32.gtS(kappa, 0n)) {
1092
1140
  let mut d = 0n
1093
1141
  match (kappa) {
1094
- 10n => { d = WasmI32.divU(p1, 1000000000n); p1 = WasmI32.remU(p1, 1000000000n) },
1095
- 9n => { d = WasmI32.divU(p1, 100000000n); p1 = WasmI32.remU(p1, 100000000n) },
1096
- 8n => { d = WasmI32.divU(p1, 10000000n); p1 = WasmI32.remU(p1, 10000000n) },
1097
- 7n => { d = WasmI32.divU(p1, 1000000n); p1 = WasmI32.remU(p1, 1000000n) },
1098
- 6n => { d = WasmI32.divU(p1, 100000n); p1 = WasmI32.remU(p1, 100000n) },
1099
- 5n => { d = WasmI32.divU(p1, 10000n); p1 = WasmI32.remU(p1, 10000n) },
1100
- 4n => { d = WasmI32.divU(p1, 1000n); p1 = WasmI32.remU(p1, 1000n) },
1101
- 3n => { d = WasmI32.divU(p1, 100n); p1 = WasmI32.remU(p1, 100n) },
1102
- 2n => { d = WasmI32.divU(p1, 10n); p1 = WasmI32.remU(p1, 10n) },
1103
- 1n => { d = p1; p1 = 0n },
1104
- _ => { d = 0n }
1142
+ 10n => {
1143
+ d = WasmI32.divU(p1, 1000000000n)
1144
+ p1 = WasmI32.remU(p1, 1000000000n)
1145
+ },
1146
+ 9n => {
1147
+ d = WasmI32.divU(p1, 100000000n)
1148
+ p1 = WasmI32.remU(p1, 100000000n)
1149
+ },
1150
+ 8n => {
1151
+ d = WasmI32.divU(p1, 10000000n)
1152
+ p1 = WasmI32.remU(p1, 10000000n)
1153
+ },
1154
+ 7n => {
1155
+ d = WasmI32.divU(p1, 1000000n)
1156
+ p1 = WasmI32.remU(p1, 1000000n)
1157
+ },
1158
+ 6n => {
1159
+ d = WasmI32.divU(p1, 100000n)
1160
+ p1 = WasmI32.remU(p1, 100000n)
1161
+ },
1162
+ 5n => {
1163
+ d = WasmI32.divU(p1, 10000n)
1164
+ p1 = WasmI32.remU(p1, 10000n)
1165
+ },
1166
+ 4n => {
1167
+ d = WasmI32.divU(p1, 1000n)
1168
+ p1 = WasmI32.remU(p1, 1000n)
1169
+ },
1170
+ 3n => {
1171
+ d = WasmI32.divU(p1, 100n)
1172
+ p1 = WasmI32.remU(p1, 100n)
1173
+ },
1174
+ 2n => {
1175
+ d = WasmI32.divU(p1, 10n)
1176
+ p1 = WasmI32.remU(p1, 10n)
1177
+ },
1178
+ 1n => {
1179
+ d = p1
1180
+ p1 = 0n
1181
+ },
1182
+ _ => {
1183
+ d = 0n
1184
+ },
1105
1185
  }
1106
1186
 
1107
1187
  if (WasmI32.ne(d | len, 0n)) {
@@ -1110,34 +1190,57 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
1110
1190
  }
1111
1191
 
1112
1192
  kappa -= 1n
1113
- let tmp = WasmI64.add(WasmI64.shl(WasmI64.extendI32U(p1), WasmI64.extendI32U(one_exp)), p2)
1193
+ let tmp = WasmI64.add(
1194
+ WasmI64.shl(WasmI64.extendI32U(p1), WasmI64.extendI32U(one_exp)),
1195
+ p2
1196
+ )
1114
1197
  if (WasmI64.leU(tmp, delta)) {
1115
1198
  _K += kappa
1116
- grisuRound(buffer, len, delta, tmp, WasmI64.shl(WasmI64.extendI32U(WasmI32.load(get_POWERS10() + (kappa << 2n), 0n)), WasmI64.extendI32U(one_exp)), wp_w_frc)
1199
+ grisuRound(
1200
+ buffer,
1201
+ len,
1202
+ delta,
1203
+ tmp,
1204
+ WasmI64.shl(
1205
+ WasmI64.extendI32U(WasmI32.load(get_POWERS10() + (kappa << 2n), 0n)),
1206
+ WasmI64.extendI32U(one_exp)
1207
+ ),
1208
+ wp_w_frc
1209
+ )
1117
1210
  done = true
1118
1211
  break
1119
1212
  }
1120
1213
  }
1121
1214
 
1122
- if (!done) while (true) {
1123
- p2 = WasmI64.mul(p2, 10N)
1124
- delta = WasmI64.mul(delta, 10N)
1125
-
1126
- let d = WasmI64.shrU(p2, WasmI64.extendI32U(one_exp))
1127
- if (WasmI64.ne(WasmI64.or(d, WasmI64.extendI32U(len)), 0N)) {
1128
- WasmI32.store8(buffer + len, _CHAR_CODE_0 + (WasmI32.wrapI64(d) & 0xffn), 0n)
1129
- len += 1n
1130
- }
1131
-
1132
- p2 = WasmI64.and(p2, mask)
1133
- kappa -= 1n
1134
- if (WasmI64.ltU(p2, delta)) {
1135
- _K += kappa
1136
- wp_w_frc = WasmI64.mul(wp_w_frc, WasmI64.extendI32U(WasmI32.load(get_POWERS10() + ((0n - kappa) << 2n), 0n)))
1137
- grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc)
1138
- break
1215
+ if (!done)
1216
+ while (true) {
1217
+ p2 = WasmI64.mul(p2, 10N)
1218
+ delta = WasmI64.mul(delta, 10N)
1219
+
1220
+ let d = WasmI64.shrU(p2, WasmI64.extendI32U(one_exp))
1221
+ if (WasmI64.ne(WasmI64.or(d, WasmI64.extendI32U(len)), 0N)) {
1222
+ WasmI32.store8(
1223
+ buffer + len,
1224
+ _CHAR_CODE_0 + (WasmI32.wrapI64(d) & 0xffn),
1225
+ 0n
1226
+ )
1227
+ len += 1n
1228
+ }
1229
+
1230
+ p2 = WasmI64.and(p2, mask)
1231
+ kappa -= 1n
1232
+ if (WasmI64.ltU(p2, delta)) {
1233
+ _K += kappa
1234
+ wp_w_frc = WasmI64.mul(
1235
+ wp_w_frc,
1236
+ WasmI64.extendI32U(
1237
+ WasmI32.load(get_POWERS10() + (0n - kappa << 2n), 0n)
1238
+ )
1239
+ )
1240
+ grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc)
1241
+ break
1242
+ }
1139
1243
  }
1140
- }
1141
1244
 
1142
1245
  len
1143
1246
  }
@@ -1148,16 +1251,21 @@ let genExponent = (buffer, k) => {
1148
1251
  if (sign) k = 0n - k
1149
1252
  let decimals = decimalCount32(k) + 1n
1150
1253
  utoa32_dec_core(buffer, k, decimals)
1151
- WasmI32.store8(buffer, (if (sign) _CHAR_CODE_MINUS else _CHAR_CODE_PLUS), 0n)
1254
+ WasmI32.store8(buffer, if (sign) _CHAR_CODE_MINUS else _CHAR_CODE_PLUS, 0n)
1152
1255
  decimals
1153
1256
  }
1154
1257
 
1155
1258
  let grisu2 = (value, buffer, sign) => {
1156
1259
  // frexp routine
1157
- let uv = WasmI64.reinterpretF64(value)
1158
- let mut exp = WasmI32.wrapI64(WasmI64.shrU(WasmI64.and(uv, 0x7FF0000000000000N), 52N))
1260
+ let uv = WasmI64.reinterpretF64(value)
1261
+ let mut exp = WasmI32.wrapI64(
1262
+ WasmI64.shrU(WasmI64.and(uv, 0x7FF0000000000000N), 52N)
1263
+ )
1159
1264
  let sid = WasmI64.and(uv, 0x000FFFFFFFFFFFFFN)
1160
- let mut frc = WasmI64.add(WasmI64.shl((if (WasmI32.eqz(exp)) 0N else 1N), 52N), sid)
1265
+ let mut frc = WasmI64.add(
1266
+ WasmI64.shl(if (WasmI32.eqz(exp)) 0N else 1N, 52N),
1267
+ sid
1268
+ )
1161
1269
  exp = (if (WasmI32.eqz(exp)) 1n else exp) - (0x3FFn + 52n)
1162
1270
 
1163
1271
  // normalize boundaries
@@ -1165,29 +1273,38 @@ let grisu2 = (value, buffer, sign) => {
1165
1273
  let mut exp_norm = exp - 1n
1166
1274
  let off_norm = WasmI64.clz(frc_norm)
1167
1275
  frc_norm = WasmI64.shl(frc_norm, off_norm)
1168
- exp_norm -= WasmI32.wrapI64(off_norm)
1276
+ exp_norm -= WasmI32.wrapI64(off_norm)
1169
1277
 
1170
1278
  let m_norm = 1n + (if (WasmI64.eq(frc, 0x0010000000000000N)) 1n else 0n)
1171
1279
 
1172
- let _frc_plus = frc_norm
1173
- let _frc_minus = WasmI64.shl(WasmI64.sub(WasmI64.shl(frc, WasmI64.extendI32U(m_norm)), 1N), WasmI64.extendI32U(exp - m_norm - exp_norm))
1280
+ let _frc_plus = frc_norm
1281
+ let _frc_minus = WasmI64.shl(
1282
+ WasmI64.sub(WasmI64.shl(frc, WasmI64.extendI32U(m_norm)), 1N),
1283
+ WasmI64.extendI32U(exp - m_norm - exp_norm)
1284
+ )
1174
1285
  let _exp = exp_norm
1175
1286
 
1176
1287
  // get cached power
1177
- let c = WasmF64.reinterpretI64(0x3FD34413509F79FEN) // 1 / lg(10) = 0.30102999566398114
1178
- let dk = WasmF64.add(WasmF64.mul(WasmF64.convertI32S(-61n - _exp), c), 347.0W) // dk must be positive, so can do ceiling in positive
1288
+ let c = WasmF64.reinterpretI64(
1289
+ 0x3FD34413509F79FEN
1290
+ ) // 1 / lg(10) = 0.30102999566398114
1291
+ let dk = WasmF64.add(
1292
+ WasmF64.mul(WasmF64.convertI32S(-61n - _exp), c),
1293
+ 347.0W
1294
+ ) // dk must be positive, so can do ceiling in positive
1179
1295
  let mut k = WasmI32.truncF64S(dk)
1180
- k += if (WasmF64.ne(WasmF64.convertI32S(k), dk)) 1n else 0n // conversion with ceil
1296
+ k += if (WasmF64.ne(WasmF64.convertI32S(k), dk)) 1n
1297
+ else 0n // conversion with ceil
1181
1298
 
1182
1299
  let index = WasmI32.shrS(k, 3n) + 1n
1183
- _K = 348n - (index << 3n) // decimal exponent doesn't need lookup table
1300
+ _K = 348n - (index << 3n) // decimal exponent doesn't need lookup table
1184
1301
  let _frc_pow = WasmI64.load(get_FRC_POWERS() + (index << 3n), 0n)
1185
1302
  let _exp_pow = WasmI32.load16S(get_EXP_POWERS() + (index << 1n), 0n)
1186
1303
 
1187
1304
  // normalize
1188
1305
  let off = WasmI32.wrapI64(WasmI64.clz(frc))
1189
1306
  frc = WasmI64.shl(frc, WasmI64.extendI32U(off))
1190
- exp -= off
1307
+ exp -= off
1191
1308
 
1192
1309
  let frc_pow = _frc_pow
1193
1310
  let exp_pow = _exp_pow
@@ -1199,7 +1316,7 @@ let grisu2 = (value, buffer, sign) => {
1199
1316
  let wp_exp = umul64e(_exp, exp_pow)
1200
1317
 
1201
1318
  let wm_frc = WasmI64.add(umul64f(_frc_minus, frc_pow), 1N)
1202
- let delta = WasmI64.sub(wp_frc, wm_frc)
1319
+ let delta = WasmI64.sub(wp_frc, wm_frc)
1203
1320
 
1204
1321
  genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign)
1205
1322
  }
@@ -1208,34 +1325,26 @@ let prettify = (buffer, length, k) => {
1208
1325
  let mut length = length
1209
1326
  let kk = length + k
1210
1327
  if (WasmI32.eqz(k)) {
1211
- WasmI32.store16(buffer + length, _CHAR_CODE_DOT | (_CHAR_CODE_0 << 8n), 0n)
1328
+ WasmI32.store16(buffer + length, _CHAR_CODE_DOT | _CHAR_CODE_0 << 8n, 0n)
1212
1329
  length + 2n
1213
1330
  } else if (WasmI32.leS(length, kk) && WasmI32.leS(kk, 21n)) {
1214
1331
  // 1234e7 -> 12340000000
1215
1332
  for (let mut i = length; WasmI32.ltS(i, kk); i += 1n) {
1216
1333
  WasmI32.store8(buffer + i, _CHAR_CODE_0, 0n)
1217
1334
  }
1218
- WasmI32.store16(buffer + kk, _CHAR_CODE_DOT | (_CHAR_CODE_0 << 8n), 0n)
1335
+ WasmI32.store16(buffer + kk, _CHAR_CODE_DOT | _CHAR_CODE_0 << 8n, 0n)
1219
1336
  kk + 2n
1220
1337
  } else if (WasmI32.gtS(kk, 0n) && WasmI32.leS(kk, 21n)) {
1221
1338
  // 1234e-2 -> 12.34
1222
1339
  let ptr = buffer + kk
1223
- Memory.copy(
1224
- ptr + 1n,
1225
- ptr,
1226
- 0n - k
1227
- )
1340
+ Memory.copy(ptr + 1n, ptr, 0n - k)
1228
1341
  WasmI32.store8(buffer + kk, _CHAR_CODE_DOT, 0n)
1229
1342
  length + 1n
1230
1343
  } else if (WasmI32.ltS(-6n, kk) && WasmI32.leS(kk, 0n)) {
1231
1344
  // 1234e-6 -> 0.001234
1232
1345
  let offset = 2n - kk
1233
- Memory.copy(
1234
- buffer + offset,
1235
- buffer,
1236
- length
1237
- )
1238
- WasmI32.store16(buffer, _CHAR_CODE_0 | (_CHAR_CODE_DOT << 8n), 0n)
1346
+ Memory.copy(buffer + offset, buffer, length)
1347
+ WasmI32.store16(buffer, _CHAR_CODE_0 | _CHAR_CODE_DOT << 8n, 0n)
1239
1348
  for (let mut i = 2n; WasmI32.ltS(i, offset); i += 1n) {
1240
1349
  WasmI32.store8(buffer + i, _CHAR_CODE_0, 0n)
1241
1350
  }
@@ -1247,13 +1356,9 @@ let prettify = (buffer, length, k) => {
1247
1356
  length + 2n
1248
1357
  } else {
1249
1358
  let len = length
1250
- Memory.copy(
1251
- buffer + 2n,
1252
- buffer + 1n,
1253
- len - 1n
1254
- )
1255
- WasmI32.store8(buffer, _CHAR_CODE_DOT, 1n)
1256
- WasmI32.store8(buffer + len, _CHAR_CODE_e, 1n)
1359
+ Memory.copy(buffer + 2n, buffer + 1n, len - 1n)
1360
+ WasmI32.store8(buffer, _CHAR_CODE_DOT, 1n)
1361
+ WasmI32.store8(buffer + len, _CHAR_CODE_e, 1n)
1257
1362
  length += genExponent(buffer + len + 2n, kk - 1n)
1258
1363
  length + 2n
1259
1364
  }
@@ -1281,15 +1386,15 @@ let get_dtoa_buf = () => {
1281
1386
  _dtoa_buf
1282
1387
  }
1283
1388
 
1284
- let isFinite = (value) => {
1389
+ let isFinite = value => {
1285
1390
  WasmF64.eq(WasmF64.sub(value, value), 0.W)
1286
1391
  }
1287
1392
 
1288
- let isNaN = (value) => {
1393
+ let isNaN = value => {
1289
1394
  WasmF64.ne(value, value)
1290
1395
  }
1291
1396
 
1292
- export let dtoa = (value) => {
1397
+ export let dtoa = value => {
1293
1398
  let str = if (WasmF64.eq(value, 0.W)) {
1294
1399
  let ret = allocateString(3n)
1295
1400
  WasmI32.store8(ret, _CHAR_CODE_0, 8n)