"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const construtos_1 = require("../construtos");
const informacao_elemento_sintatico_1 = require("../informacao-elemento-sintatico");
const contemComum = (nome) => {
    return {
        tipoRetorno: 'lógico',
        argumentos: [
            new informacao_elemento_sintatico_1.InformacaoElementoSintatico('chave', 'qualquer', true, [], 'O elemento como chave do dicionário.'),
        ],
        implementacao: (interpretador, valor, chave) => Promise.resolve(chave in valor),
        assinaturaFormato: `dicionário.${nome}(chave: qualquer)`,
        documentacao: `# \`dicionário.${nome}(chave)\`\n\n` +
            'Retorna verdadeiro se o elemento passado como parâmetro existe como chave do dicionário. Devolve falso em caso contrário.\n' +
            '\n\n ## Exemplo de Código\n' +
            '\n\n```delegua\n' +
            'var d = {"a": 1, "b": 2, "c": 3}\n' +
            `escreva(d.${nome}("a")) // verdadeiro\n` +
            `escreva(d.${nome}("f")) // falso\n\`\`\`` +
            '\n\n## Formas de uso\n',
        exemploCodigo: 'dicionário.contem("minhaChave")',
    };
};
exports.default = {
    chaves: {
        tipoRetorno: 'texto[]',
        argumentos: [],
        implementacao: (interpretador, valor) => {
            return Promise.resolve(Object.keys(valor));
        },
        assinaturaFormato: 'dicionário.chaves()',
        documentacao: '# `dicionário.chaves()`\n\n' +
            'Retorna um vetor de texto com todas as chaves de um dicionário.\n' +
            '\n\n ## Exemplo de Código\n' +
            '\n\n```delegua\n' +
            'var d = {"a": 1, "b": 2, "c": 3}\n' +
            'escreva(d.chaves()) // ["a", "b", "c"]\n```' +
            '\n\n## Formas de uso\n',
        exemploCodigo: 'dicionário.chaves()',
    },
    contem: contemComum('contem'),
    contém: contemComum('contém'),
    itens: {
        tipoRetorno: 'Dupla[]',
        argumentos: [],
        implementacao: (interpretador, valor) => {
            const hashArquivo = interpretador.hashArquivoDeclaracaoAtual;
            const linha = interpretador.linhaDeclaracaoAtual;
            const pares = Object.entries(valor).map(([chave, valor]) => {
                return new construtos_1.Dupla(new construtos_1.Literal(hashArquivo, linha, chave, 'texto'), new construtos_1.Literal(hashArquivo, linha, valor, 'qualquer'));
            });
            return Promise.resolve(pares);
        },
        assinaturaFormato: 'dicionário.itens()',
        documentacao: '# `dicionário.itens()`\n\n' +
            'Retorna um vetor contendo tuplas, sendo o primeiro valor a chave do dicionário, e o segundo valor o valor correspondente no dicionário. ' +
            'Funciona de maneira semelhante às funções `entries()` de JavaScript, e `items()` da linguagem Python.\n' +
            '\n\n## Exemplo de Código\n' +
            '\n```delegua\n' +
            'var d = {"a": 1, "b": 2, "c": 3}\n' +
            'escreva(d.itens())\n' +
            '// [[("a", 1)], [("b", 2)], [("c", 3)]]\n' +
            '```\n\n' +
            '## Formas de uso\n',
        exemploCodigo: 'dicionário.itens()',
    },
    remover: {
        tipoRetorno: 'lógico',
        argumentos: [new informacao_elemento_sintatico_1.InformacaoElementoSintatico('chave', 'texto')],
        implementacao: (interpretador, valor, chave) => Promise.resolve(delete valor[chave]),
        assinaturaFormato: `dicionário.remover(chave: qualquer)`,
    },
    valores: {
        tipoRetorno: '<T>[]',
        argumentos: [],
        implementacao: (interpretador, valor) => {
            return Promise.resolve(Object.values(valor));
        },
    }
};
//# sourceMappingURL=primitivas-dicionario.js.map