> ## Documentation Index
> Fetch the complete documentation index at: https://companyname-a7d5b98e-ton-storage.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Functions and methods

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

Tolk allows declaring functions and methods:

* `fun f(<params>)` — a function
* `fun <receiver>.f(<params>)` — a method:
  * `fun <receiver>.f(self, ...)` — an instance method
  * `fun <receiver>.f(...)` — a static method (no `self`)

All features are identical except for the receiver.
Most examples below use functions, but all concepts equally apply to methods.

## Types for parameters are required

```tolk theme={null}
// invalid:
fun sum(a, b) {}

// valid:
fun sum(a: int, b: bool) {}
```

## The return type is auto-inferred if omitted

Either specify return type manually:

```tolk theme={null}
fun demo(): int {
    // ...
}
```

or it is inferred from the `return` statements, similar to TypeScript:

```tolk theme={null}
fun demo() {   // auto-infer `int`
    // ...
    return 10;
}
```

If various returns have different types, the compiler will fire an error instead of inferring a union type, because this typically indicates a bug.

## Default values for parameters

Default values are placed after the type, allowing constant expressions:

```tolk theme={null}
fun plus(value: int, delta: int = 1) {
    return value + delta
}

fun demo() {
    plus(10);     // 11
    plus(10, 5);  // 15
}
```

## Methods: for any type, including structures

A method is declared as an extension function, similar to Kotlin.
If the first parameter is `self`, it's an instance method. Otherwise, it's a static method.

```tolk theme={null}
struct Point {
    x: int
    y: int
}

// no `self` — static method
fun Point.createZero(): Point {
    return { x: 0, y: 0 }
}

// has `self` — instance method
fun Point.sumCoords(self) {
    return self.x + self.y
}
```

Instance methods are invoked via `obj.method()`, whereas static methods — on a type:

```tolk theme={null}
fun demo() {
    val p = Point.createZero();
    return p.sumCoords();    // 0
}
```

Methods are not limited to structures. They may exist for any receiver, including unions, aliases, and primitives:

```tolk theme={null}
fun int.one() {
    return 1
}

fun int.negate(self) {
    return -self
}

fun demo() {
    return int.one().negate()   // -1
}
```

All standard methods are declared this way: `fun cell.hash(self)`, etc.

The type of `self` is determined by the receiver.
All parameters after should have their types set.
The return type is inferred if omitted.

```tolk theme={null}
fun Point.equalTo(self, r: Point) {   // auto-infer `bool`
    return self.x == r.x && self.y == r.y
}
```

## `self` is immutable by default

To allow modifications, declare `mutate self` explicitly.
For details, see [mutability](/languages/tolk/syntax/mutability).

```tolk theme={null}
// mind `mutate` — to allow modifications
fun Point.reset(mutate self) {
    self.x = 0;
    self.y = 0;
}
```

## `return self` makes a chainable method

To make a method chainable, declare it as `fun (...): self`.
For instance, all methods for `builder` return `self`,
which allows `b.storeXXX().storeXXX()`:

```tolk theme={null}
fun builder.myStoreInt32(mutate self, v: int): self {
    self.storeInt(v, 32);
    return self;
}

fun demo() {
    return beginCell()
        .storeAddress(SOME_ADDR)
        .myStoreInt32(123)
        .endCell();
}
```

## Small functions are automatically inlined

Create one-liner methods without any worries.
The compiler automatically inlines them in-place, targeting zero overhead. For example, this program

```tolk theme={null}
fun int.zero() {
    return 0
}

fun int.inc(mutate self, byValue: int = 1): self {
    self += byValue;
    return self;
}

fun main() {
    return int.zero().inc().inc()
}
```

is reduced to "return 2" in assembler:

```fift theme={null}
main() PROC:<{
    2 PUSHINT
}>
```

For details, see [compiler optimizations](/languages/tolk/features/compiler-optimizations).

## @attributes

A function or method may be preceded by one or several attributes:

```tolk theme={null}
@noinline
@custom("any contents here")
fun slowSum(a: int, b: int) {
    return a + b
}
```

The following attributes are allowed:

* `@inline` — Forces a function to be inlined in-place. Typically unnecessary, as the compiler performs inlining automatically.
* `@inline_ref` — Turns on a special version of inlining: its body will be embedded as a child cell reference in the resulting bytecode.
* `@noinline` — Disables inlining for a function. For example, if it's a "slow path".
* `@method_id(<number>)` — Low-level annotation to manually override TVM method\_id.
* `@pure` — Indicates that a function does not modify global state (including TVM one). If its result is unused, a call could be deleted. Typically used in assembler functions.
* `@deprecated` — A function is not recommended for use and exists only for backwards compatibility.
* `@custom(<anything>)` — A custom expression, not analyzed by the compiler.

## Assembler functions

Tolk supports declaring low-level assembler functions with embedded Fift code:

```tolk theme={null}
@pure
fun minMax(x: int, y: int): (int, int)
    asm "MINMAX"
```

It's a low-level feature and requires deep knowledge of [Fift](/languages/fift/overview) and [TVM](/tvm/overview).
See [assembler functions](/languages/tolk/features/asm-functions).

## Anonymous functions (lambdas)

Tolk supports first-class functions: they can be passed as callbacks.
Both named functions and function expressions may be referenced:

```tolk theme={null}
fun customRead(reader: (slice) -> int) {
    // ...
}

fun demo() {
    customRead(fun(s) {
        return s.loadUint(32)
    })
}
```

See [callables](/languages/tolk/types/callables).

## Generic functions

A function declared as `fun f<T>(...)` is a generic one. `T` is called a "type parameter".

```tolk theme={null}
fun duplicate<T>(value: T): (T, T) {
    var copy: T = value;
    return (value, copy);
}
```

When calling a generic function, the compiler automatically infers type arguments:

```tolk theme={null}
fun demo() {
    duplicate(1);         // duplicate<int>
    duplicate(somePoint); // duplicate<Point>
    duplicate((1, 2));    // duplicate<(int, int)>
}
```

Type arguments may also be specified explicitly using `f<...>(args)`:

```tolk theme={null}
fun demo() {
    duplicate<int32>(1);
    duplicate<Point?>(null);    // two nullable points
}
```

Functions may declare multiple type parameters:

```tolk theme={null}
// returns `(tensor.0 || defA, tensor.1 || defB)`
fun replaceNulls<T1, T2>(tensor: (T1?, T2?), defA: T1, defB: T2): (T1, T2) {
    var (a, b) = tensor;
    return (a == null ? defA : a, b == null ? defB : b);
}
```

Since Tolk supports first-class functions, various custom invokers for general-purpose frameworks can be expressed:

```tolk theme={null}
fun customInvoke<TArg, R>(f: TArg -> R, arg: TArg) {
    return f(arg);
}
```

Default type parameters are supported, like `fun f<T1, T2 = int>`, but they cannot reference one another currently.

Although type parameters are usually inferred from the arguments, there are edge cases where `T` cannot be inferred because it does not depend on them.
For example, tuples. A tuple may have anything inside it, that's why invoking `tuple.get` lacks without `T`:

```tolk theme={null}
// a method `tuple.get` is declared this way in stdlib:
fun tuple.get<T>(self, index: int): T;

fun demo(t: tuple) {
    var mid = t.get(1);    // error, can not deduce T

    // correct is:
    var mid = t.get<int>(1);
    // or
    var mid: int = t.get(1);
}
```

A generic function may be assigned to a variable, but `T` must be specified explicitly because this is not a call:

```tolk theme={null}
fun genericFn<T>(v: T) {
    // ...
}

fun demo() {
    var callable = genericFn<builder>;
    callable(beginCell());
}
```

## Generic methods

Declaring a method for a generic type does not differ from declaring any other method.
The compiler treats unknown symbols as type parameters while parsing the receiver:

```tolk theme={null}
struct Pair<T1, T2> {
    first: T1
    second: T2
}

// both <T1,T2>, <A,B>, etc. work: any unknown symbols
fun Pair<A, B>.create(f: A, s: B): Pair<A, B> {
    return {
        first: f,
        second: s,
    }
}

// instance method with `self`
fun Pair<A, B>.compareFirst(self, rhs: A) {
    return self.first <=> rhs
}
```

Generic methods can be also used as first-class functions:

```tolk theme={null}
var callable = Pair<int, slice>.compareFirst;
callable(somePair, 123);    // pass somePair as self
```

Methods for generic structures can themselves be generic:

```tolk theme={null}
fun Pair<A, B>.createFrom<U, V>(f: U, s: V): Pair<A, B> {
    return {
        first: f as A,
        second: s as B,
    }
}

fun demo() {
    return Pair<int?, int?>.createFrom(1, 2);
}
```

## Methods for "any receiver"

Any unknown symbol (typically `T`) may be used to define a method applicable to any type:

```tolk theme={null}
// any receiver
fun T.copy(self): T {
    return self
}

// any nullable receiver
fun T?.isNull(self): bool {
    return self == null
}
```

Note that "any receivers" do not conflict with specific ones.

```tolk theme={null}
fun T.someMethod(self) { ... }
fun int.someMethod(self) { ... }

fun demo() {
    42.someMethod();              // (2)
    address("...").someMethod();  // (1) with T=address
}
```

This is known as "overloading" or "partial specialization".

## Partial specialization of generic methods

Specializing generic methods allows some logic to work differently for predefined types or patterns.
Consider the following example.
Suppose, there is an iterator over a tuple of slices, each slice contains encoded `T`.

```tolk theme={null}
struct TupleIterator<T> {
    data: tuple      // [slice, slice, ...]
    nextIndex: int
}

fun TupleIterator<T>.next(self): T {
    val v = self.data.get<slice>(self.nextIndex);
    self.nextIndex += 1;
    return T.fromSlice(v);
}
```

Thus, given `TupleIterator<int32>` or `TupleIterator<Point>`, `next()` will decode the next slice and return it.
But additional requirements are:

* `TupleIterator<slice>` should just return `data[i]` without calling `fromSlice()`
* `TupleIterator<Cell<T>>` should return not `Cell<T>` but unpack a cell and return `T`

Tolk allows **overloading methods for more specific type patterns**:

```tolk theme={null}
fun TupleIterator<T>.next(self): T { ... }
fun TupleIterator<Cell<T>>.next(self): T { ... }
fun TupleIterator<slice>.next(self): slice { ... }
```

Another example. Declare an extension method for `map<K, V>`, but

* if `V = K`, provide a different implementation
* if `V` is another map, modify the behavior

```tolk theme={null}
fun map<K, V>.method(self) { ... }
fun map<K, K>.method(self) { ... }
fun map<K, map<K2, V2>>.method(self) { ... }

// (1) called for map<int8, int32> / map<bits4, Cell<bits4>>
// (2) called for map<bool, bool> / map<int8, AliasForInt8>
// (3) called for map<address, map<int32, ()>>
```

<Aside type="note">
  What happens if a user declares `struct T`?
  The answer: `fun T.copy()` and similar will be treated as a specialization, not as generic.
  Just don't do this; use clear long names.
</Aside>
