12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import std/private/jsutils
- type JsBigIntImpl {.importc: "bigint".} = int
- type JsBigInt = distinct JsBigIntImpl
- doAssert JsBigInt isnot int
- func big*(integer: SomeInteger): JsBigInt {.importjs: "BigInt(#)".}
- func big*(integer: cstring): JsBigInt {.importjs: "BigInt(#)".}
- func `<=`*(x, y: JsBigInt): bool {.importjs: "(# $1 #)".}
- func `==`*(x, y: JsBigInt): bool {.importjs: "(# === #)".}
- func inc*(x: var JsBigInt) {.importjs: "[#][0][0]++".}
- func inc2*(x: var JsBigInt) {.importjs: "#++".}
- func toCstring*(this: JsBigInt): cstring {.importjs: "#.toString()".}
- func `$`*(this: JsBigInt): string =
- $toCstring(this)
- block:
- doAssert defined(nimHasJsBigIntBackend)
- let z1 = big"10"
- let z2 = big"15"
- doAssert z1 == big"10"
- doAssert z1 == z1
- doAssert z1 != z2
- var s: seq[cstring]
- for i in z1 .. z2:
- s.add $i
- doAssert s == @["10".cstring, "11", "12", "13", "14", "15"]
- block:
- var a=big"3"
- a.inc
- doAssert a == big"4"
- block:
- var z: JsBigInt
- doAssert $z == "0"
- doAssert z.jsTypeOf == "bigint" # would fail without codegen change
- doAssert z != big(1)
- doAssert z == big"0" # ditto
- # ditto below
- block:
- let z: JsBigInt = big"1"
- doAssert $z == "1"
- doAssert z.jsTypeOf == "bigint"
- doAssert z == big"1"
- block:
- let z = JsBigInt.default
- doAssert $z == "0"
- doAssert z.jsTypeOf == "bigint"
- doAssert z == big"0"
- block:
- var a: seq[JsBigInt]
- a.setLen 3
- doAssert a[^1].jsTypeOf == "bigint"
- doAssert a[^1] == big"0"
|