Skip to main content

core/Nat

Natural numbers with infinite precision.

Most operations on natural numbers (e.g. addition) are available as built-in operators (e.g. 1 + 1). This module provides equivalent functions and Text conversion.

Import from the core package to use this module.

import Nat "mo:core/Nat";

Type Nat​

type Nat = Prim.Types.Nat

Infinite precision natural numbers.

Function toText​

func toText(self : Nat) : Text

Converts a natural number to its textual representation. Textual representation do not contain underscores to represent commas.

Example:

assert Nat.toText(1234) == "1234";

Function fromText​

func fromText(text : Text) : ?Nat

Creates a natural number from its textual representation. Returns null if the input is not a valid natural number.

The textual representation must not contain underscores.

Example:

assert Nat.fromText("1234") == ?1234;

Function toNat​

func toNat(self : Text) : ?Nat

Creates a natural number from its textual representation. Returns null if the input is not a valid natural number.

The textual representation must not contain underscores.

This functions is meant to be used with contextual-dot notation.

Example:

assert "1234".toNat() == ?1234;

Function fromInt​

func fromInt(int : Int) : Nat

Converts an integer to a natural number. Traps if the integer is negative.

Example:

assert Nat.fromInt(1234) == (1234 : Nat);

@deprecated M0235

Function toFloat​

func toFloat(self : Nat) : Float

Conversion to Float. May result in Inf.

Note: The floating point number may be imprecise for large Nat values. Returns inf if the integer is greater than the maximum floating point number.

Example:

assert Nat.toFloat(123) == 123.0;

Function toInt​

func toInt(self : Nat) : Int

Converts a natural number to an integer.

Example:

assert Nat.toInt(1234) == 1234;

Function toNat8​

func toNat8(self : Nat) : Nat8

Converts an unsigned integer with infinite precision to an 8-bit unsigned integer.

Traps on overflow.

Example:

assert Nat.toNat8(123) == (123 : Nat8);

Function toNat16​

func toNat16(self : Nat) : Nat16

Converts an unsigned integer with infinite precision to a 16-bit unsigned integer.

Traps on overflow.

Example:

assert Nat.toNat16(123) == (123 : Nat16);

Function toNat32​

func toNat32(self : Nat) : Nat32

Converts an unsigned integer with infinite precision to a 32-bit unsigned integer.

Traps on overflow.

Example:

assert Nat.toNat32(123) == (123 : Nat32);

Function toNat64​

func toNat64(self : Nat) : Nat64

Converts an unsigned integer with infinite precision to a 64-bit unsigned integer.

Traps on overflow.

Example:

assert Nat.toNat64(123) == (123 : Nat64);

Function fromNat8​

func fromNat8(_ : Nat8) : Nat

Converts an 8-bit unsigned integer to an unsigned integer with infinite precision.

Example:

assert Nat.fromNat8(123) == (123 : Nat);

Function fromNat16​

func fromNat16(_ : Nat16) : Nat

Converts a 16-bit unsigned integer to an unsigned integer with infinite precision.

Example:

assert Nat.fromNat16(123) == (123 : Nat);

Function fromNat32​

func fromNat32(_ : Nat32) : Nat

Converts a 32-bit unsigned integer to an unsigned integer with infinite precision.

Example:

assert Nat.fromNat32(123) == (123 : Nat);

Function fromNat64​

func fromNat64(_ : Nat64) : Nat

Converts a 64-bit unsigned integer to an unsigned integer with infinite precision.

Example:

assert Nat.fromNat64(123) == (123 : Nat);

Function min​

func min(x : Nat, y : Nat) : Nat

Returns the minimum of x and y.

Example:

assert Nat.min(1, 2) == 1;

Function max​

func max(x : Nat, y : Nat) : Nat

Returns the maximum of x and y.

Example:

assert Nat.max(1, 2) == 2;

Function equal​

func equal(x : Nat, y : Nat) : Bool

Equality function for Nat types. This is equivalent to x == y.

Example:

assert Nat.equal(1, 1);
assert 1 == 1;

Note: The reason why this function is defined in this library (in addition to the existing == operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use == as a function value at the moment.

Example:

let a = 111;
let b = 222;
assert not Nat.equal(a, b);

Function notEqual​

func notEqual(x : Nat, y : Nat) : Bool

Inequality function for Nat types. This is equivalent to x != y.

Example:

assert Nat.notEqual(1, 2);
assert 1 != 2;

Note: The reason why this function is defined in this library (in addition to the existing != operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use != as a function value at the moment.

Function less​

func less(x : Nat, y : Nat) : Bool

"Less than" function for Nat types. This is equivalent to x < y.

Example:

assert Nat.less(1, 2);
assert 1 < 2;

Note: The reason why this function is defined in this library (in addition to the existing < operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use < as a function value at the moment.

Function lessOrEqual​

func lessOrEqual(x : Nat, y : Nat) : Bool

"Less than or equal" function for Nat types. This is equivalent to x <= y.

Example:

assert Nat.lessOrEqual(1, 2);
assert 1 <= 2;

Note: The reason why this function is defined in this library (in addition to the existing <= operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use <= as a function value at the moment.

Function greater​

func greater(x : Nat, y : Nat) : Bool

"Greater than" function for Nat types. This is equivalent to x > y.

Example:

assert Nat.greater(2, 1);
assert 2 > 1;

Note: The reason why this function is defined in this library (in addition to the existing > operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use > as a function value at the moment.

Function greaterOrEqual​

func greaterOrEqual(x : Nat, y : Nat) : Bool

"Greater than or equal" function for Nat types. This is equivalent to x >= y.

Example:

assert Nat.greaterOrEqual(2, 1);
assert 2 >= 1;

Note: The reason why this function is defined in this library (in addition to the existing >= operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use >= as a function value at the moment.

Function compare​

func compare(x : Nat, y : Nat) : Order.Order

General purpose comparison function for Nat. Returns the Order ( either #less, #equal, or #greater) of comparing x with y.

Example:

assert Nat.compare(2, 3) == #less;

This function can be used as value for a high order function, such as a sort function.

Example:

import Array "mo:core/Array";
assert Array.sort([2, 3, 1], Nat.compare) == [1, 2, 3];

Function add​

func add(x : Nat, y : Nat) : Nat

Returns the sum of x and y, x + y. This operator will never overflow because Nat is infinite precision.

Example:

assert Nat.add(1, 2) == 3;
assert 1 + 2 == 3;

Note: The reason why this function is defined in this library (in addition to the existing + operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use + as a function value at the moment.

Example:

import Array "mo:core/Array";
assert Array.foldLeft([2, 3, 1], 0, Nat.add) == 6;

Function sub​

func sub(x : Nat, y : Nat) : Nat

Returns the difference of x and y, x - y. Traps on underflow below 0.

Example:

assert Nat.sub(2, 1) == 1;
// Add a type annotation to avoid a warning about the subtraction
assert 2 - 1 : Nat == 1;

Note: The reason why this function is defined in this library (in addition to the existing - operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use - as a function value at the moment.

Example:

import Array "mo:core/Array";
assert Array.foldLeft([2, 3, 1], 10, Nat.sub) == 4;

Function mul​

func mul(x : Nat, y : Nat) : Nat

Returns the product of x and y, x * y. This operator will never overflow because Nat is infinite precision.

Example:

assert Nat.mul(2, 3) == 6;
assert 2 * 3 == 6;

Note: The reason why this function is defined in this library (in addition to the existing * operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use * as a function value at the moment.

Example:

import Array "mo:core/Array";
assert Array.foldLeft([2, 3, 1], 1, Nat.mul) == 6;

Function div​

func div(x : Nat, y : Nat) : Nat

Returns the unsigned integer division of x by y, x / y. Traps when y is zero.

The quotient is rounded down, which is equivalent to truncating the decimal places of the quotient.

Example:

assert Nat.div(6, 2) == 3;
assert 6 / 2 == 3;

Note: The reason why this function is defined in this library (in addition to the existing / operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use / as a function value at the moment.

Function rem​

func rem(x : Nat, y : Nat) : Nat

Returns the remainder of unsigned integer division of x by y, x % y. Traps when y is zero.

Example:

assert Nat.rem(6, 4) == 2;
assert 6 % 4 == 2;

Note: The reason why this function is defined in this library (in addition to the existing % operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use % as a function value at the moment.

Function pow​

func pow(x : Nat, y : Nat) : Nat

Returns x to the power of y, x ** y. Traps when y > 2^32. This operator will never overflow because Nat is infinite precision.

Example:

assert Nat.pow(2, 3) == 8;
assert 2 ** 3 == 8;

Note: The reason why this function is defined in this library (in addition to the existing ** operator) is so that you can use it as a function value to pass to a higher order function. It is not possible to use ** as a function value at the moment.

Function bitshiftLeft​

func bitshiftLeft(x : Nat, y : Nat32) : Nat

Returns the (conceptual) bitwise shift left of x by y, x * (2 ** y).

Example:

assert Nat.bitshiftLeft(1, 3) == 8;

Note: The reason why this function is defined in this library (in absence of the << operator) is so that you can use it as a function value to pass to a higher order function. While Nat is not defined in terms of bit patterns, conceptually it can be regarded as such, and the operation is provided as a high-performance version of the corresponding arithmetic rule.

Function bitshiftRight​

func bitshiftRight(x : Nat, y : Nat32) : Nat

Returns the (conceptual) bitwise shift right of x by y, x / (2 ** y).

Example:

assert Nat.bitshiftRight(8, 3) == 1;

Note: The reason why this function is defined in this library (in absence of the >> operator) is so that you can use it as a function value to pass to a higher order function. While Nat is not defined in terms of bit patterns, conceptually it can be regarded as such, and the operation is provided as a high-performance version of the corresponding arithmetic rule.

Function range​

func range(fromInclusive : Nat, toExclusive : Nat) : Iter.Iter<Nat>

Returns an iterator over Nat values from the first to second argument with an exclusive upper bound.

import Iter "mo:core/Iter";

let iter = Nat.range(1, 4);
assert iter.next() == ?1;
assert iter.next() == ?2;
assert iter.next() == ?3;
assert iter.next() == null;

If the first argument is greater than the second argument, the function returns an empty iterator.

import Iter "mo:core/Iter";

let iter = Nat.range(4, 1);
assert iter.next() == null; // empty iterator

Function rangeBy​

func rangeBy(fromInclusive : Nat, toExclusive : Nat, step : Int) : Iter.Iter<Nat>

Returns an iterator over Nat values from the first to second argument with an exclusive upper bound, incrementing by the specified step size. The step can be positive or negative.

import Iter "mo:core/Iter";

// Positive step
let iter1 = Nat.rangeBy(1, 7, 2);
assert iter1.next() == ?1;
assert iter1.next() == ?3;
assert iter1.next() == ?5;
assert iter1.next() == null;

// Negative step
let iter2 = Nat.rangeBy(7, 1, -2);
assert iter2.next() == ?7;
assert iter2.next() == ?5;
assert iter2.next() == ?3;
assert iter2.next() == null;

If step is 0 or if the iteration would not progress towards the bound, returns an empty iterator.

Function rangeInclusive​

func rangeInclusive(from : Nat, to : Nat) : Iter.Iter<Nat>

Returns an iterator over the integers from the first to second argument, inclusive.

import Iter "mo:core/Iter";

let iter = Nat.rangeInclusive(1, 3);
assert iter.next() == ?1;
assert iter.next() == ?2;
assert iter.next() == ?3;
assert iter.next() == null;

If the first argument is greater than the second argument, the function returns an empty iterator.

import Iter "mo:core/Iter";

let iter = Nat.rangeInclusive(3, 1);
assert iter.next() == null; // empty iterator

Function rangeByInclusive​

func rangeByInclusive(from : Nat, to : Nat, step : Int) : Iter.Iter<Nat>

Returns an iterator over the integers from the first to second argument, inclusive, incrementing by the specified step size. The step can be positive or negative.

import Iter "mo:core/Iter";

// Positive step
let iter1 = Nat.rangeByInclusive(1, 7, 2);
assert iter1.next() == ?1;
assert iter1.next() == ?3;
assert iter1.next() == ?5;
assert iter1.next() == ?7;
assert iter1.next() == null;

// Negative step
let iter2 = Nat.rangeByInclusive(7, 1, -2);
assert iter2.next() == ?7;
assert iter2.next() == ?5;
assert iter2.next() == ?3;
assert iter2.next() == ?1;
assert iter2.next() == null;

If from == to, return an iterator which only returns that value.

Otherwise, if step is 0 or if the iteration would not progress towards the bound, returns an empty iterator.

Function allValues​

func allValues() : Iter.Iter<Nat>

Returns an infinite iterator over all possible Nat values.

import Iter "mo:core/Iter";

let iter = Nat.allValues();
assert iter.next() == ?0;
assert iter.next() == ?1;
assert iter.next() == ?2;
// ...