1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
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"
|