std/jsbigints

  Source   Edit

Arbitrary precision integers.

Example:

import std/jsbigints
block:
  let big1: JsBigInt = big"2147483647"
  let big2: JsBigInt = big"666"
  doAssert JsBigInt isnot int
  doAssert big1 != big2
  doAssert big1 > big2
  doAssert big1 >= big2
  doAssert big2 < big1
  doAssert big2 <= big1
  doAssert not(big1 == big2)
  let z = JsBigInt.default
  doAssert $z == "0n"
block:
  var a: seq[JsBigInt]
  a.setLen 2
  doAssert a == @[big"0", big"0"]
  doAssert a[^1] == big"0"
  var b: JsBigInt
  doAssert b == big"0"
  doAssert b == JsBigInt.default

Types

JsBigInt = distinct JsBigIntImpl
Arbitrary precision integer for JavaScript target.   Source   Edit

Procs

func big(integer: SomeInteger): JsBigInt {.importjs: "BigInt(#)".}
Constructor for JsBigInt.

Example:

doAssert big(1234567890) == big"1234567890"
doAssert 0b1111100111.big == 0o1747.big and 0o1747.big == 999.big
  Source   Edit
func `'big`(num: cstring): JsBigInt {.importjs: "BigInt(#)".}
Constructor for JsBigInt.

Example:

doAssert -1'big == 1'big - 2'big
# supports decimal, binary, octal, hex:
doAssert -12'big == big"-12"
doAssert 12'big == 12.big
doAssert 0b101'big == 0b101.big
doAssert 0o701'big == 0o701.big
doAssert 0xdeadbeaf'big == 0xdeadbeaf.big
doAssert 0xffffffffffffffff'big == (1'big shl 64'big) - 1'big
doAssert not compiles(static(12'big))
  Source   Edit
func big(integer: cstring): JsBigInt {.importjs: "BigInt(#)".}
Alias for 'big   Source   Edit
func toCstring(this: JsBigInt; radix: 2 .. 36): cstring {.
    importjs: "#.toString(#)".}
Converts from JsBigInt to cstring representation.
  • radix Base to use for representing numeric values.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toString

Example:

doAssert big"2147483647".toCstring(2) == "1111111111111111111111111111111".cstring
  Source   Edit
func toCstring(this: JsBigInt): cstring {.importjs: "#.toString()".}
Converts from JsBigInt to cstring representation. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toString   Source   Edit
func `$`(this: JsBigInt): string {....raises: [], tags: [].}
Returns a string representation of JsBigInt.

Example:

doAssert $big"1024" == "1024n"
  Source   Edit
func wrapToInt(this: JsBigInt; bits: Natural): JsBigInt {.
    importjs: "(() => { const i = #, b = #; return BigInt.asIntN(b, i) })()".}
Wraps this to a signed JsBigInt of bits bits in -2 ^ (bits - 1) .. 2 ^ (bits - 1) - 1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/asIntN

Example:

doAssert (big("3") + big("2") ** big("66")).wrapToInt(13) == big("3")
  Source   Edit
func wrapToUint(this: JsBigInt; bits: Natural): JsBigInt {.
    importjs: "(() => { const i = #, b = #; return BigInt.asUintN(b, i) })()".}
Wraps this to an unsigned JsBigInt of bits bits in 0 .. 2 ^ bits - 1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/asUintN

Example:

doAssert (big("3") + big("2") ** big("66")).wrapToUint(66) == big("3")
  Source   Edit
func toNumber(this: JsBigInt): BiggestInt {.importjs: "Number(#)".}
Does not do any bounds check and may or may not return an inexact representation.

Example:

doAssert toNumber(big"2147483647") == 2147483647.BiggestInt
  Source   Edit
func `+`(x, y: JsBigInt): JsBigInt {.importjs: "(# $1 #)".}

Example:

doAssert (big"9" + big"1") == big"10"
  Source   Edit
func `-`(x, y: JsBigInt): JsBigInt {.importjs: "(# $1 #)".}

Example:

doAssert (big"9" - big"1") == big"8"
  Source   Edit
func `*`(x, y: JsBigInt): JsBigInt {.importjs: "(# $1 #)".}

Example:

doAssert (big"42" * big"9") == big"378"
  Source   Edit
func `div`(x, y: JsBigInt): JsBigInt {.importjs: "(# / #)".}
Same as div but for JsBigInt(uses JavaScript BigInt() / BigInt()).

Example:

doAssert big"13" div big"3" == big"4"
doAssert big"-13" div big"3" == big"-4"
doAssert big"13" div big"-3" == big"-4"
doAssert big"-13" div big"-3" == big"4"
  Source   Edit
func `mod`(x, y: JsBigInt): JsBigInt {.importjs: "(# % #)".}
Same as mod but for JsBigInt (uses JavaScript BigInt() % BigInt()).

Example:

doAssert big"13" mod big"3" == big"1"
doAssert big"-13" mod big"3" == big"-1"
doAssert big"13" mod big"-3" == big"1"
doAssert big"-13" mod big"-3" == big"-1"
  Source   Edit
func `<`(x, y: JsBigInt): bool {.importjs: "(# $1 #)".}

Example:

doAssert big"2" < big"9"
  Source   Edit
func `<=`(x, y: JsBigInt): bool {.importjs: "(# $1 #)".}

Example:

doAssert big"1" <= big"5"
  Source   Edit
func `==`(x, y: JsBigInt): bool {.importjs: "(# == #)".}

Example:

doAssert big"42" == big"42"
  Source   Edit
func `**`(x, y: JsBigInt): JsBigInt {.importjs: "((#) $1 #)".}

Example:

doAssert big"2" ** big"64" == big"18446744073709551616"
doAssert big"-2" ** big"3" == big"-8"
doAssert -big"2" ** big"2" == big"4" # parsed as: (-2n) ** 2n
doAssert big"0" ** big"0" == big"1" # edge case
var ok = false
try: discard big"2" ** big"-1" # raises foreign `RangeError`
except: ok = true
doAssert ok
  Source   Edit
func `and`(x, y: JsBigInt): JsBigInt {.importjs: "(# & #)".}

Example:

doAssert (big"555" and big"2") == big"2"
  Source   Edit
func `or`(x, y: JsBigInt): JsBigInt {.importjs: "(# | #)".}

Example:

doAssert (big"555" or big"2") == big"555"
  Source   Edit
func `xor`(x, y: JsBigInt): JsBigInt {.importjs: "(# ^ #)".}

Example:

doAssert (big"555" xor big"2") == big"553"
  Source   Edit
func `shl`(a, b: JsBigInt): JsBigInt {.importjs: "(# << #)".}

Example:

doAssert (big"999" shl big"2") == big"3996"
  Source   Edit
func `shr`(a, b: JsBigInt): JsBigInt {.importjs: "(# >> #)".}

Example:

doAssert (big"999" shr big"2") == big"249"
  Source   Edit
func `-`(this: JsBigInt): JsBigInt {.importjs: "($1#)".}

Example:

doAssert -(big"10101010101") == big"-10101010101"
  Source   Edit
func inc(this: var JsBigInt) {.importjs: "(++[#][0][0])".}

Example:

var big1: JsBigInt = big"1"
inc big1
doAssert big1 == big"2"
  Source   Edit
func dec(this: var JsBigInt) {.importjs: "(--[#][0][0])".}

Example:

var big1: JsBigInt = big"2"
dec big1
doAssert big1 == big"1"
  Source   Edit
func inc(this: var JsBigInt; amount: JsBigInt) {.importjs: "([#][0][0] += #)".}

Example:

var big1: JsBigInt = big"1"
inc big1, big"2"
doAssert big1 == big"3"
  Source   Edit
func dec(this: var JsBigInt; amount: JsBigInt) {.importjs: "([#][0][0] -= #)".}

Example:

var big1: JsBigInt = big"1"
dec big1, big"2"
doAssert big1 == big"-1"
  Source   Edit
func `+=`(x: var JsBigInt; y: JsBigInt) {.importjs: "([#][0][0] $1 #)".}

Example:

var big1: JsBigInt = big"1"
big1 += big"2"
doAssert big1 == big"3"
  Source   Edit
func `-=`(x: var JsBigInt; y: JsBigInt) {.importjs: "([#][0][0] $1 #)".}

Example:

var big1: JsBigInt = big"1"
big1 -= big"2"
doAssert big1 == big"-1"
  Source   Edit
func `*=`(x: var JsBigInt; y: JsBigInt) {.importjs: "([#][0][0] $1 #)".}

Example:

var big1: JsBigInt = big"2"
big1 *= big"4"
doAssert big1 == big"8"
  Source   Edit
func `/=`(x: var JsBigInt; y: JsBigInt) {.importjs: "([#][0][0] $1 #)".}
Same as x = x div y.

Example:

var big1: JsBigInt = big"11"
big1 /= big"2"
doAssert big1 == big"5"
  Source   Edit
proc `+`(_: JsBigInt): JsBigInt {.error: "See https://github.com/tc39/proposal-bigint/blob/master/ADVANCED.md#dont-break-asmjs".}
Do NOT use. https://github.com/tc39/proposal-bigint/blob/master/ADVANCED.md#dont-break-asmjs   Source   Edit
proc low(_: typedesc[JsBigInt]): JsBigInt {.
    error: "Arbitrary precision integers do not have a known low.".}
Do NOT use.   Source   Edit
proc high(_: typedesc[JsBigInt]): JsBigInt {.
    error: "Arbitrary precision integers do not have a known high.".}
Do NOT use.   Source   Edit