Skip to content
Effect Days 2026 Get your ticket

BigInt

This module provides utility functions and type class instances for working with the bigint type in TypeScript. It includes functions for basic arithmetic operations, as well as type class instances for Equivalence and Order.

See

  • :BigDecimal for more similar operations on BigDecimal types
  • :Number for more similar operations on number types
29 exports Added in v2.0.0 Source

Conversions

fromNumber

Added in v2.4.12 Source

Takes a number and returns an Option of bigint.

If the number is outside the safe integer range for JavaScript (Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER), it returns Option.none(). Otherwise, it attempts to convert the number to a bigint and returns Option.some(bigint).

Signature

declare function fromNumber(n: number): Option<bigint>

Example

import * as assert from "node:assert"
import { BigInt as BI, Option } from "effect"
assert.deepStrictEqual(BI.fromNumber(42), Option.some(BigInt(42)))
assert.deepStrictEqual(BI.fromNumber(Number.MAX_SAFE_INTEGER + 1), Option.none())
assert.deepStrictEqual(BI.fromNumber(Number.MIN_SAFE_INTEGER - 1), Option.none())

fromString

Added in v2.4.12 Source

Takes a string and returns an Option of bigint.

If the string is empty or contains characters that cannot be converted into a bigint, it returns Option.none(), otherwise, it returns Option.some(bigint).

Signature

declare function fromString(s: string): Option<bigint>

Example

import * as assert from "node:assert"
import { BigInt as BI, Option } from "effect"
assert.deepStrictEqual(BI.fromString("42"), Option.some(BigInt(42)))
assert.deepStrictEqual(BI.fromString(" "), Option.none())
assert.deepStrictEqual(BI.fromString("a"), Option.none())

toNumber

Added in v2.0.0 Source

Takes a bigint and returns an Option of number.

If the bigint is outside the safe integer range for JavaScript (Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER), it returns Option.none(). Otherwise, it converts the bigint to a number and returns Option.some(number).

Signature

declare function toNumber(b: bigint): Option<number>

Example

import * as assert from "node:assert"
import { BigInt as BI, Option } from "effect"
assert.deepStrictEqual(BI.toNumber(BigInt(42)), Option.some(42))
assert.deepStrictEqual(BI.toNumber(BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1)), Option.none())
assert.deepStrictEqual(BI.toNumber(BigInt(Number.MIN_SAFE_INTEGER) - BigInt(1)), Option.none())

Guards

isBigInt

Added in v2.0.0 Source

Tests if a value is a bigint.

Signature

declare const isBigInt: (u: unknown) => u is bigint

Example

import * as assert from "node:assert"
import { isBigInt } from "effect/BigInt"
assert.deepStrictEqual(isBigInt(1n), true)
assert.deepStrictEqual(isBigInt(1), false)

Instances

Equivalence

Added in v2.0.0 Source

Signature

declare const Equivalence: equivalence.Equivalence<bigint>

Order

Added in v2.0.0 Source

Signature

declare const Order: order.Order<bigint>

Math

abs

Added in v2.0.0 Source

Determines the absolute value of a given bigint.

Signature

declare function abs(n: bigint): bigint

Example

import * as assert from "node:assert"
import { abs } from "effect/BigInt"
assert.deepStrictEqual(abs(-5n), 5n)
assert.deepStrictEqual(abs(0n), 0n)
assert.deepStrictEqual(abs(5n), 5n)

decrement

Added in v2.0.0 Source

Decrements a number by 1n.

Signature

declare function decrement(n: bigint): bigint

Example

import * as assert from "node:assert"
import { decrement } from "effect/BigInt"
assert.deepStrictEqual(decrement(3n), 2n)

divide

Added in v2.0.0 Source

Provides a division operation on bigints.

If the dividend is not a multiple of the divisor the result will be a bigint value which represents the integer division rounded down to the nearest integer.

Returns None if the divisor is 0n.

Signature

declare const divide: {
(that: bigint): (self: bigint) => Option<bigint>;
(self: bigint, that: bigint): Option<bigint>;
}

Example

import * as assert from "node:assert"
import { BigInt, Option } from "effect"
assert.deepStrictEqual(BigInt.divide(6n, 3n), Option.some(2n))
assert.deepStrictEqual(BigInt.divide(6n, 0n), Option.none())

gcd

Added in v2.0.0 Source

Determines the greatest common divisor of two bigints.

Signature

declare const gcd: {
(that: bigint): (self: bigint) => bigint;
(self: bigint, that: bigint): bigint;
}

Example

import * as assert from "node:assert"
import { gcd } from "effect/BigInt"
assert.deepStrictEqual(gcd(2n, 3n), 1n)
assert.deepStrictEqual(gcd(2n, 4n), 2n)
assert.deepStrictEqual(gcd(16n, 24n), 8n)

increment

Added in v2.0.0 Source

Returns the result of adding 1n to a given number.

Signature

declare function increment(n: bigint): bigint

Example

import * as assert from "node:assert"
import { increment } from "effect/BigInt"
assert.deepStrictEqual(increment(2n), 3n)

lcm

Added in v2.0.0 Source

Determines the least common multiple of two bigints.

Signature

declare const lcm: {
(that: bigint): (self: bigint) => bigint;
(self: bigint, that: bigint): bigint;
}

Example

import * as assert from "node:assert"
import { lcm } from "effect/BigInt"
assert.deepStrictEqual(lcm(2n, 3n), 6n)
assert.deepStrictEqual(lcm(2n, 4n), 4n)
assert.deepStrictEqual(lcm(16n, 24n), 48n)

multiply

Added in v2.0.0 Source

Provides a multiplication operation on bigints.

Signature

declare const multiply: {
(that: bigint): (self: bigint) => bigint;
(self: bigint, that: bigint): bigint;
}

Example

import * as assert from "node:assert"
import { multiply } from "effect/BigInt"
assert.deepStrictEqual(multiply(2n, 3n), 6n)

multiplyAll

Added in v2.0.0 Source

Takes an Iterable of bigints and returns their multiplication as a single number.

Signature

declare function multiplyAll(collection: Iterable<bigint>): bigint

Example

import * as assert from "node:assert"
import { multiplyAll } from "effect/BigInt"
assert.deepStrictEqual(multiplyAll([2n, 3n, 4n]), 24n)

sign

Added in v2.0.0 Source

Determines the sign of a given bigint.

Signature

declare function sign(n: bigint): Ordering

Example

import * as assert from "node:assert"
import { sign } from "effect/BigInt"
assert.deepStrictEqual(sign(-5n), -1)
assert.deepStrictEqual(sign(0n), 0)
assert.deepStrictEqual(sign(5n), 1)

sqrt

Added in v2.0.0 Source

Determines the square root of a given bigint safely. Returns none if the given bigint is negative.

Signature

declare function sqrt(n: bigint): Option<bigint>

Example

import * as assert from "node:assert"
import { BigInt, Option } from "effect"
assert.deepStrictEqual(BigInt.sqrt(4n), Option.some(2n))
assert.deepStrictEqual(BigInt.sqrt(9n), Option.some(3n))
assert.deepStrictEqual(BigInt.sqrt(16n), Option.some(4n))
assert.deepStrictEqual(BigInt.sqrt(-1n), Option.none())

subtract

Added in v2.0.0 Source

Provides a subtraction operation on bigints.

Signature

declare const subtract: {
(that: bigint): (self: bigint) => bigint;
(self: bigint, that: bigint): bigint;
}

Example

import * as assert from "node:assert"
import { subtract } from "effect/BigInt"
assert.deepStrictEqual(subtract(2n, 3n), -1n)

sum

Added in v2.0.0 Source

Provides an addition operation on bigints.

Signature

declare const sum: {
(that: bigint): (self: bigint) => bigint;
(self: bigint, that: bigint): bigint;
}

Example

import * as assert from "node:assert"
import { sum } from "effect/BigInt"
assert.deepStrictEqual(sum(2n, 3n), 5n)

sumAll

Added in v2.0.0 Source

Takes an Iterable of bigints and returns their sum as a single `bigint

Signature

declare function sumAll(collection: Iterable<bigint>): bigint

Example

import * as assert from "node:assert"
import { sumAll } from "effect/BigInt"
assert.deepStrictEqual(sumAll([2n, 3n, 4n]), 9n)

unsafeDivide

Added in v2.0.0 Source

Provides a division operation on bigints.

If the dividend is not a multiple of the divisor the result will be a bigint value which represents the integer division rounded down to the nearest integer.

Throws a RangeError if the divisor is 0n.

Signature

declare const unsafeDivide: {
(that: bigint): (self: bigint) => bigint;
(self: bigint, that: bigint): bigint;
}

Example

import * as assert from "node:assert"
import { unsafeDivide } from "effect/BigInt"
assert.deepStrictEqual(unsafeDivide(6n, 3n), 2n)
assert.deepStrictEqual(unsafeDivide(6n, 4n), 1n)

unsafeSqrt

Added in v2.0.0 Source

Determines the square root of a given bigint unsafely. Throws if the given bigint is negative.

Signature

declare function unsafeSqrt(n: bigint): bigint

Example

import * as assert from "node:assert"
import { unsafeSqrt } from "effect/BigInt"
assert.deepStrictEqual(unsafeSqrt(4n), 2n)
assert.deepStrictEqual(unsafeSqrt(9n), 3n)
assert.deepStrictEqual(unsafeSqrt(16n), 4n)

Other

clamp

Added in v2.0.0 Source

Restricts the given bigint to be within the range specified by the minimum and maximum values.

  • If the bigint is less than the minimum value, the function returns the minimum value.
  • If the bigint is greater than the maximum value, the function returns the maximum value.
  • Otherwise, it returns the original bigint.

Signature

declare const clamp: {
(options: {
maximum: bigint;
minimum: bigint;
}): (self: bigint) => bigint;
(self: bigint, options: {
maximum: bigint;
minimum: bigint;
}): bigint;
}

Example

import * as assert from "node:assert"
import { BigInt } from "effect"
const clamp = BigInt.clamp({ minimum: 1n, maximum: 5n })
assert.equal(clamp(3n), 3n)
assert.equal(clamp(0n), 1n)
assert.equal(clamp(6n), 5n)

max

Added in v2.0.0 Source

Returns the maximum between two bigints.

Signature

declare const max: {
(that: bigint): (self: bigint) => bigint;
(self: bigint, that: bigint): bigint;
}

Example

import * as assert from "node:assert"
import { max } from "effect/BigInt"
assert.deepStrictEqual(max(2n, 3n), 3n)

min

Added in v2.0.0 Source

Returns the minimum between two bigints.

Signature

declare const min: {
(that: bigint): (self: bigint) => bigint;
(self: bigint, that: bigint): bigint;
}

Example

import * as assert from "node:assert"
import { min } from "effect/BigInt"
assert.deepStrictEqual(min(2n, 3n), 2n)

Predicates

between

Added in v2.0.0 Source

Checks if a bigint is between a minimum and maximum value (inclusive).

Signature

declare const between: {
(options: {
maximum: bigint;
minimum: bigint;
}): (self: bigint) => boolean;
(self: bigint, options: {
maximum: bigint;
minimum: bigint;
}): boolean;
}

Example

import * as assert from "node:assert"
import { BigInt } from "effect"
const between = BigInt.between({ minimum: 0n, maximum: 5n })
assert.deepStrictEqual(between(3n), true)
assert.deepStrictEqual(between(-1n), false)
assert.deepStrictEqual(between(6n), false)

greaterThan

Added in v2.0.0 Source

Returns true if the first argument is greater than the second, otherwise false.

Signature

declare const greaterThan: {
(that: bigint): (self: bigint) => boolean;
(self: bigint, that: bigint): boolean;
}

Example

import * as assert from "node:assert"
import { greaterThan } from "effect/BigInt"
assert.deepStrictEqual(greaterThan(2n, 3n), false)
assert.deepStrictEqual(greaterThan(3n, 3n), false)
assert.deepStrictEqual(greaterThan(4n, 3n), true)

Returns a function that checks if a given bigint is greater than or equal to the provided one.

Signature

declare const greaterThanOrEqualTo: {
(that: bigint): (self: bigint) => boolean;
(self: bigint, that: bigint): boolean;
}

Example

import * as assert from "node:assert"
import { greaterThanOrEqualTo } from "effect/BigInt"
assert.deepStrictEqual(greaterThanOrEqualTo(2n, 3n), false)
assert.deepStrictEqual(greaterThanOrEqualTo(3n, 3n), true)
assert.deepStrictEqual(greaterThanOrEqualTo(4n, 3n), true)

lessThan

Added in v2.0.0 Source

Returns true if the first argument is less than the second, otherwise false.

Signature

declare const lessThan: {
(that: bigint): (self: bigint) => boolean;
(self: bigint, that: bigint): boolean;
}

Example

import * as assert from "node:assert"
import { lessThan } from "effect/BigInt"
assert.deepStrictEqual(lessThan(2n, 3n), true)
assert.deepStrictEqual(lessThan(3n, 3n), false)
assert.deepStrictEqual(lessThan(4n, 3n), false)

Returns a function that checks if a given bigint is less than or equal to the provided one.

Signature

declare const lessThanOrEqualTo: {
(that: bigint): (self: bigint) => boolean;
(self: bigint, that: bigint): boolean;
}

Example

import * as assert from "node:assert"
import { lessThanOrEqualTo } from "effect/BigInt"
assert.deepStrictEqual(lessThanOrEqualTo(2n, 3n), true)
assert.deepStrictEqual(lessThanOrEqualTo(3n, 3n), true)
assert.deepStrictEqual(lessThanOrEqualTo(4n, 3n), false)