@grain/stdlib 0.4.1 → 0.4.5

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 (57) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/LICENSE +21 -0
  3. package/README.md +34 -0
  4. package/array.gr +200 -89
  5. package/array.md +81 -5
  6. package/buffer.gr +93 -36
  7. package/bytes.gr +512 -407
  8. package/bytes.md +621 -0
  9. package/char.gr +119 -55
  10. package/char.md +200 -0
  11. package/hash.gr +42 -15
  12. package/hash.md +44 -0
  13. package/list.gr +121 -50
  14. package/map.gr +106 -110
  15. package/number.gr +37 -1
  16. package/number.md +66 -0
  17. package/option.gr +260 -53
  18. package/option.md +579 -0
  19. package/package.json +33 -29
  20. package/pervasives.gr +32 -20
  21. package/queue.gr +102 -30
  22. package/queue.md +191 -0
  23. package/range.gr +26 -26
  24. package/range.md +1 -1
  25. package/regex.gr +3055 -0
  26. package/regex.md +449 -0
  27. package/result.gr +216 -70
  28. package/result.md +446 -0
  29. package/runtime/dataStructures.gr +28 -29
  30. package/runtime/debug.gr +0 -1
  31. package/runtime/equal.gr +37 -16
  32. package/runtime/exception.gr +28 -15
  33. package/runtime/gc.gr +33 -20
  34. package/runtime/malloc.gr +19 -11
  35. package/runtime/numberUtils.gr +208 -105
  36. package/runtime/numbers.gr +217 -118
  37. package/runtime/string.gr +150 -59
  38. package/runtime/stringUtils.gr +176 -0
  39. package/runtime/unsafe/conv.gr +51 -8
  40. package/runtime/unsafe/memory.gr +14 -3
  41. package/runtime/unsafe/printWasm.gr +4 -4
  42. package/runtime/unsafe/tags.gr +2 -2
  43. package/runtime/unsafe/wasmf32.gr +9 -2
  44. package/runtime/unsafe/wasmf64.gr +9 -2
  45. package/runtime/unsafe/wasmi32.gr +65 -47
  46. package/runtime/unsafe/wasmi64.gr +78 -50
  47. package/runtime/wasi.gr +199 -45
  48. package/set.gr +281 -119
  49. package/set.md +502 -0
  50. package/stack.gr +26 -26
  51. package/stack.md +143 -0
  52. package/string.gr +697 -329
  53. package/string.md +815 -0
  54. package/sys/file.gr +356 -177
  55. package/sys/process.gr +10 -6
  56. package/sys/random.gr +3 -6
  57. 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,10 +1103,12 @@ 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) && (
1065
- 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))
1067
- )
1106
+ WasmI64.geU(WasmI64.sub(delta, rest), ten_kappa) &&
1107
+ (WasmI64.ltU(WasmI64.add(rest, ten_kappa), wp_w) ||
1108
+ WasmI64.gtU(
1109
+ WasmI64.sub(wp_w, rest),
1110
+ WasmI64.sub(WasmI64.add(rest, ten_kappa), wp_w)
1111
+ ))
1068
1112
  ) {
1069
1113
  digit -= 1n
1070
1114
  rest = WasmI64.add(rest, ten_kappa)
@@ -1076,11 +1120,13 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
1076
1120
  let mut delta = delta
1077
1121
  let one_exp = 0n - mp_exp
1078
1122
  let one_frc = WasmI64.shl(1N, WasmI64.extendI32U(one_exp))
1079
- let mask = WasmI64.sub(one_frc, 1N)
1123
+ let mask = WasmI64.sub(one_frc, 1N)
1080
1124
 
1081
1125
  let mut wp_w_frc = WasmI64.sub(mp_frc, w_frc)
1082
1126
 
1083
- let mut p1 = WasmI32.wrapI64(WasmI64.shrU(mp_frc, WasmI64.extendI32U(one_exp)))
1127
+ let mut p1 = WasmI32.wrapI64(
1128
+ WasmI64.shrU(mp_frc, WasmI64.extendI32U(one_exp))
1129
+ )
1084
1130
  let mut p2 = WasmI64.and(mp_frc, mask)
1085
1131
 
1086
1132
  let mut kappa = decimalCount32(p1)
@@ -1091,17 +1137,49 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
1091
1137
  while (WasmI32.gtS(kappa, 0n)) {
1092
1138
  let mut d = 0n
1093
1139
  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 }
1140
+ 10n => {
1141
+ d = WasmI32.divU(p1, 1000000000n)
1142
+ p1 = WasmI32.remU(p1, 1000000000n)
1143
+ },
1144
+ 9n => {
1145
+ d = WasmI32.divU(p1, 100000000n)
1146
+ p1 = WasmI32.remU(p1, 100000000n)
1147
+ },
1148
+ 8n => {
1149
+ d = WasmI32.divU(p1, 10000000n)
1150
+ p1 = WasmI32.remU(p1, 10000000n)
1151
+ },
1152
+ 7n => {
1153
+ d = WasmI32.divU(p1, 1000000n)
1154
+ p1 = WasmI32.remU(p1, 1000000n)
1155
+ },
1156
+ 6n => {
1157
+ d = WasmI32.divU(p1, 100000n)
1158
+ p1 = WasmI32.remU(p1, 100000n)
1159
+ },
1160
+ 5n => {
1161
+ d = WasmI32.divU(p1, 10000n)
1162
+ p1 = WasmI32.remU(p1, 10000n)
1163
+ },
1164
+ 4n => {
1165
+ d = WasmI32.divU(p1, 1000n)
1166
+ p1 = WasmI32.remU(p1, 1000n)
1167
+ },
1168
+ 3n => {
1169
+ d = WasmI32.divU(p1, 100n)
1170
+ p1 = WasmI32.remU(p1, 100n)
1171
+ },
1172
+ 2n => {
1173
+ d = WasmI32.divU(p1, 10n)
1174
+ p1 = WasmI32.remU(p1, 10n)
1175
+ },
1176
+ 1n => {
1177
+ d = p1
1178
+ p1 = 0n
1179
+ },
1180
+ _ => {
1181
+ d = 0n
1182
+ },
1105
1183
  }
1106
1184
 
1107
1185
  if (WasmI32.ne(d | len, 0n)) {
@@ -1110,35 +1188,58 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
1110
1188
  }
1111
1189
 
1112
1190
  kappa -= 1n
1113
- let tmp = WasmI64.add(WasmI64.shl(WasmI64.extendI32U(p1), WasmI64.extendI32U(one_exp)), p2)
1191
+ let tmp = WasmI64.add(
1192
+ WasmI64.shl(WasmI64.extendI32U(p1), WasmI64.extendI32U(one_exp)),
1193
+ p2
1194
+ )
1114
1195
  if (WasmI64.leU(tmp, delta)) {
1115
1196
  _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)
1197
+ grisuRound(
1198
+ buffer,
1199
+ len,
1200
+ delta,
1201
+ tmp,
1202
+ WasmI64.shl(
1203
+ WasmI64.extendI32U(WasmI32.load(get_POWERS10() + (kappa << 2n), 0n)),
1204
+ WasmI64.extendI32U(one_exp)
1205
+ ),
1206
+ wp_w_frc
1207
+ )
1117
1208
  done = true
1118
1209
  break
1119
1210
  }
1120
1211
  }
1121
1212
 
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
1213
+ if (!done)
1214
+ while (true) {
1215
+ p2 = WasmI64.mul(p2, 10N)
1216
+ delta = WasmI64.mul(delta, 10N)
1217
+
1218
+ let d = WasmI64.shrU(p2, WasmI64.extendI32U(one_exp))
1219
+ if (WasmI64.ne(WasmI64.or(d, WasmI64.extendI32U(len)), 0N)) {
1220
+ WasmI32.store8(
1221
+ buffer + len,
1222
+ _CHAR_CODE_0 + (WasmI32.wrapI64(d) & 0xffn),
1223
+ 0n
1224
+ )
1225
+ len += 1n
1226
+ }
1227
+
1228
+ p2 = WasmI64.and(p2, mask)
1229
+ kappa -= 1n
1230
+ if (WasmI64.ltU(p2, delta)) {
1231
+ _K += kappa
1232
+ wp_w_frc = WasmI64.mul(
1233
+ wp_w_frc,
1234
+ WasmI64.extendI32U(
1235
+ WasmI32.load(get_POWERS10() + (0n - kappa << 2n), 0n)
1236
+ )
1237
+ )
1238
+ grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc)
1239
+ break
1240
+ }
1130
1241
  }
1131
1242
 
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
1139
- }
1140
- }
1141
-
1142
1243
  len
1143
1244
  }
1144
1245
 
@@ -1148,16 +1249,21 @@ let genExponent = (buffer, k) => {
1148
1249
  if (sign) k = 0n - k
1149
1250
  let decimals = decimalCount32(k) + 1n
1150
1251
  utoa32_dec_core(buffer, k, decimals)
1151
- WasmI32.store8(buffer, (if (sign) _CHAR_CODE_MINUS else _CHAR_CODE_PLUS), 0n)
1252
+ WasmI32.store8(buffer, if (sign) _CHAR_CODE_MINUS else _CHAR_CODE_PLUS, 0n)
1152
1253
  decimals
1153
1254
  }
1154
1255
 
1155
1256
  let grisu2 = (value, buffer, sign) => {
1156
1257
  // frexp routine
1157
- let uv = WasmI64.reinterpretF64(value)
1158
- let mut exp = WasmI32.wrapI64(WasmI64.shrU(WasmI64.and(uv, 0x7FF0000000000000N), 52N))
1258
+ let uv = WasmI64.reinterpretF64(value)
1259
+ let mut exp = WasmI32.wrapI64(
1260
+ WasmI64.shrU(WasmI64.and(uv, 0x7FF0000000000000N), 52N)
1261
+ )
1159
1262
  let sid = WasmI64.and(uv, 0x000FFFFFFFFFFFFFN)
1160
- let mut frc = WasmI64.add(WasmI64.shl((if (WasmI32.eqz(exp)) 0N else 1N), 52N), sid)
1263
+ let mut frc = WasmI64.add(
1264
+ WasmI64.shl(if (WasmI32.eqz(exp)) 0N else 1N, 52N),
1265
+ sid
1266
+ )
1161
1267
  exp = (if (WasmI32.eqz(exp)) 1n else exp) - (0x3FFn + 52n)
1162
1268
 
1163
1269
  // normalize boundaries
@@ -1165,29 +1271,38 @@ let grisu2 = (value, buffer, sign) => {
1165
1271
  let mut exp_norm = exp - 1n
1166
1272
  let off_norm = WasmI64.clz(frc_norm)
1167
1273
  frc_norm = WasmI64.shl(frc_norm, off_norm)
1168
- exp_norm -= WasmI32.wrapI64(off_norm)
1274
+ exp_norm -= WasmI32.wrapI64(off_norm)
1169
1275
 
1170
1276
  let m_norm = 1n + (if (WasmI64.eq(frc, 0x0010000000000000N)) 1n else 0n)
1171
1277
 
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))
1278
+ let _frc_plus = frc_norm
1279
+ let _frc_minus = WasmI64.shl(
1280
+ WasmI64.sub(WasmI64.shl(frc, WasmI64.extendI32U(m_norm)), 1N),
1281
+ WasmI64.extendI32U(exp - m_norm - exp_norm)
1282
+ )
1174
1283
  let _exp = exp_norm
1175
1284
 
1176
1285
  // 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
1286
+ let c = WasmF64.reinterpretI64(
1287
+ 0x3FD34413509F79FEN
1288
+ ) // 1 / lg(10) = 0.30102999566398114
1289
+ let dk = WasmF64.add(
1290
+ WasmF64.mul(WasmF64.convertI32S(-61n - _exp), c),
1291
+ 347.0W
1292
+ ) // dk must be positive, so can do ceiling in positive
1179
1293
  let mut k = WasmI32.truncF64S(dk)
1180
- k += if (WasmF64.ne(WasmF64.convertI32S(k), dk)) 1n else 0n // conversion with ceil
1294
+ k += if (WasmF64.ne(WasmF64.convertI32S(k), dk)) 1n
1295
+ else 0n // conversion with ceil
1181
1296
 
1182
1297
  let index = WasmI32.shrS(k, 3n) + 1n
1183
- _K = 348n - (index << 3n) // decimal exponent doesn't need lookup table
1298
+ _K = 348n - (index << 3n) // decimal exponent doesn't need lookup table
1184
1299
  let _frc_pow = WasmI64.load(get_FRC_POWERS() + (index << 3n), 0n)
1185
1300
  let _exp_pow = WasmI32.load16S(get_EXP_POWERS() + (index << 1n), 0n)
1186
1301
 
1187
1302
  // normalize
1188
1303
  let off = WasmI32.wrapI64(WasmI64.clz(frc))
1189
1304
  frc = WasmI64.shl(frc, WasmI64.extendI32U(off))
1190
- exp -= off
1305
+ exp -= off
1191
1306
 
1192
1307
  let frc_pow = _frc_pow
1193
1308
  let exp_pow = _exp_pow
@@ -1199,7 +1314,7 @@ let grisu2 = (value, buffer, sign) => {
1199
1314
  let wp_exp = umul64e(_exp, exp_pow)
1200
1315
 
1201
1316
  let wm_frc = WasmI64.add(umul64f(_frc_minus, frc_pow), 1N)
1202
- let delta = WasmI64.sub(wp_frc, wm_frc)
1317
+ let delta = WasmI64.sub(wp_frc, wm_frc)
1203
1318
 
1204
1319
  genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign)
1205
1320
  }
@@ -1208,34 +1323,26 @@ let prettify = (buffer, length, k) => {
1208
1323
  let mut length = length
1209
1324
  let kk = length + k
1210
1325
  if (WasmI32.eqz(k)) {
1211
- WasmI32.store16(buffer + length, _CHAR_CODE_DOT | (_CHAR_CODE_0 << 8n), 0n)
1326
+ WasmI32.store16(buffer + length, _CHAR_CODE_DOT | _CHAR_CODE_0 << 8n, 0n)
1212
1327
  length + 2n
1213
1328
  } else if (WasmI32.leS(length, kk) && WasmI32.leS(kk, 21n)) {
1214
1329
  // 1234e7 -> 12340000000
1215
1330
  for (let mut i = length; WasmI32.ltS(i, kk); i += 1n) {
1216
1331
  WasmI32.store8(buffer + i, _CHAR_CODE_0, 0n)
1217
1332
  }
1218
- WasmI32.store16(buffer + kk, _CHAR_CODE_DOT | (_CHAR_CODE_0 << 8n), 0n)
1333
+ WasmI32.store16(buffer + kk, _CHAR_CODE_DOT | _CHAR_CODE_0 << 8n, 0n)
1219
1334
  kk + 2n
1220
1335
  } else if (WasmI32.gtS(kk, 0n) && WasmI32.leS(kk, 21n)) {
1221
1336
  // 1234e-2 -> 12.34
1222
1337
  let ptr = buffer + kk
1223
- Memory.copy(
1224
- ptr + 1n,
1225
- ptr,
1226
- 0n - k
1227
- )
1338
+ Memory.copy(ptr + 1n, ptr, 0n - k)
1228
1339
  WasmI32.store8(buffer + kk, _CHAR_CODE_DOT, 0n)
1229
1340
  length + 1n
1230
1341
  } else if (WasmI32.ltS(-6n, kk) && WasmI32.leS(kk, 0n)) {
1231
1342
  // 1234e-6 -> 0.001234
1232
1343
  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)
1344
+ Memory.copy(buffer + offset, buffer, length)
1345
+ WasmI32.store16(buffer, _CHAR_CODE_0 | _CHAR_CODE_DOT << 8n, 0n)
1239
1346
  for (let mut i = 2n; WasmI32.ltS(i, offset); i += 1n) {
1240
1347
  WasmI32.store8(buffer + i, _CHAR_CODE_0, 0n)
1241
1348
  }
@@ -1247,13 +1354,9 @@ let prettify = (buffer, length, k) => {
1247
1354
  length + 2n
1248
1355
  } else {
1249
1356
  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)
1357
+ Memory.copy(buffer + 2n, buffer + 1n, len - 1n)
1358
+ WasmI32.store8(buffer, _CHAR_CODE_DOT, 1n)
1359
+ WasmI32.store8(buffer + len, _CHAR_CODE_e, 1n)
1257
1360
  length += genExponent(buffer + len + 2n, kk - 1n)
1258
1361
  length + 2n
1259
1362
  }
@@ -1281,15 +1384,15 @@ let get_dtoa_buf = () => {
1281
1384
  _dtoa_buf
1282
1385
  }
1283
1386
 
1284
- let isFinite = (value) => {
1387
+ let isFinite = value => {
1285
1388
  WasmF64.eq(WasmF64.sub(value, value), 0.W)
1286
1389
  }
1287
1390
 
1288
- let isNaN = (value) => {
1391
+ let isNaN = value => {
1289
1392
  WasmF64.ne(value, value)
1290
1393
  }
1291
1394
 
1292
- export let dtoa = (value) => {
1395
+ export let dtoa = value => {
1293
1396
  let str = if (WasmF64.eq(value, 0.W)) {
1294
1397
  let ret = allocateString(3n)
1295
1398
  WasmI32.store8(ret, _CHAR_CODE_0, 8n)