# func

Values created by the `CandidType` function `Func` correspond to the Candid type func, are inferred to be TypeScript `[Principal, string]` tuples, and will be decoded into JavaScript array with two elements at runtime.

The first element is an @dfinity/principal and the second is a JavaScript string. The `@dfinity/principal` represents the `principal` of the canister/service where the function exists, and the `string` represents the function's name.

A `func` acts as a callback, allowing the `func` receiver to know which canister instance and method must be used to call back.

TypeScript or JavaScript:

    import { Canister, Func, Principal, query, text } from 'azle';

    const BasicFunc = Func([text], text, 'query');

    export default Canister({
        getBasicFunc: query([], BasicFunc, () => {
            return [
                Principal.fromText('rrkah-fqaaa-aaaaa-aaaaq-cai'),
                'getBasicFunc'
            ];
        }),
        printBasicFunc: query([BasicFunc], BasicFunc, (basicFunc) => {
            console.log(typeof basicFunc);
            return basicFunc;
        })
    });

Candid:

    service : () -> {
        getBasicFunc : () -> (func (text) -> (text) query) query;
        printBasicFunc : (func (text) -> (text) query) -> (
            func (text) -> (text) query,
          ) query;
    }

dfx:

    dfx canister call candid_canister printBasicFunc '(func "r7inp-6aaaa-aaaaa-aaabq-cai".getBasicFunc)'
    (func "r7inp-6aaaa-aaaaa-aaabq-cai".getBasicFunc)