"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const excecoes_1 = require("../excecoes");
const construtos_1 = require("../construtos");
const mapaPropriedadesTuplas = {
    'Dupla': ['primeiro', 'segundo'],
    'Trio': ['primeiro', 'segundo', 'terceiro'],
    'Quarteto': ['primeiro', 'segundo', 'terceiro', 'quarto'],
    'Quinteto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto'],
    'Sexteto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto'],
    'Septeto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo'],
    'Octeto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo'],
    'Noneto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo', 'nono'],
    'Deceto': ['primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'setimo', 'oitavo', 'nono', 'decimo'],
};
exports.default = {
    paraVetor: {
        tipoRetorno: 'vetor',
        argumentos: [],
        implementacao: (interpretador, tupla) => {
            const objetoTupla = interpretador.resolverValor(tupla);
            if (!(objetoTupla instanceof construtos_1.Tupla || objetoTupla instanceof construtos_1.TuplaN)) {
                return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, 'A função "paraVetor" só pode ser chamada em tuplas.', interpretador.linhaDeclaracaoAtual));
            }
            let elementosBrutos = [];
            if (objetoTupla instanceof construtos_1.TuplaN) {
                elementosBrutos = objetoTupla.elementos;
            }
            else {
                const nomeClasse = objetoTupla.constructor.name;
                if (mapaPropriedadesTuplas.hasOwnProperty(nomeClasse)) {
                    const props = mapaPropriedadesTuplas[nomeClasse];
                    elementosBrutos = props.map(prop => objetoTupla[prop]);
                }
            }
            const valoresResolvidos = elementosBrutos.map(elemento => interpretador.resolverValor(elemento));
            return Promise.resolve(valoresResolvidos);
        },
        assinaturaFormato: 'tupla.paraVetor()',
        documentacao: '# `tupla.paraVetor()` \n \n' +
            'Converte a tupla atual em um array.',
        exemploCodigo: 'tupla.paraVetor()',
    }
};
//# sourceMappingURL=primitivas-tupla.js.map