class{ id = "lista_indexada", name = "Lista Indexada", group = "Listas",
bases = {},
description = [[Classe que modela uma lista de valores indexada por índices crescentes.
Os índices não precisam ser sequenciais, nesses casos o índice anterior ou inicial é informado.]],
attributes = {
{ id = "indices", name = "Indices", type = "REAL[]", access = "",
description = [[Lista de Indices]],
},
{ id = "valores", name = "Valores", type = "REAL[]", access = "",
description = [[Lista de Valores indexados]],
},
},
methods = {
{ id = "obter_valor", name = "Obter Valor",
description = [[Retornar o valor correspondente ao índice informado.]],
parameters = {
{ name = "Valor do Indice", type = "REAL" },
},
results = {
{ name = "Resultado", type = "REAL" },
},
code = [===[ function(self, indice)
local indices = self.indices --[[ASSERT]] assert(indices and (#indices > 0), "lista de indices indefinida ou vazia")
local valores = self.valores --[[ASSERT]] assert(valores and (#valores > 0), "lista de valores indefinida ou vazia")
local i = 1
while indices[i] and indices[i] <= indice do
i = i+1
end
return valores[math.max(1, i-1)]
end ]===],
},
},
}
class{ id = "lista_enumerada", name = "Lista Enumerada", group = "Listas",
bases = {},
description = [[
Lista de valores indexada por índices números que indicam a posição do item na sequência.
]],
code = [====[
function _CLASS:init()
local valores = self.valores --[[ASSERT]] assert(valores and (#valores > 0), ("%s: lista de valores indefinida ou vazia"):format(self) )
self._map = {}
for i, valor in ipairs(valores) do
self._map[valor] = i
end
end
]====],
attributes = {
{ id = "valores", name = "Valores", type = "STRING[]", access = "",
description = [[Lista de Valores.]],
},
},
methods = {
{ id = "obter_indice", name = "Obter Índice",
description = [[Retornar o valor correspondente ao índice informado.]],
parameters = {
{ name = "Valor", type = "STRING" },
},
results = {
{ name = "Índice", type = "INTEGER" },
},
code = [===[ function(self, valor)
local valor_txt = tostring(valor)
local indice = self._map[valor_txt] --[[ASSERT]] assert(indice, ("%s: Valor '%s' não foi encontrado na lista."):format(tostring(self), valor_txt) )
return indice
end ]===],
},
{ id = "obter_valor", name = "Obter Valor",
description = [[Retornar o valor correspondente ao índice informado.]],
parameters = {
{ name = "Índice", type = "INTEGER" },
},
results = {
{ name = "Valor", type = "STRING" },
},
code = [===[ function(self, indice)
return self.valores[indice]
end ]===],
},
},
}
class{ id = "lista_rotulada", name = "Lista Rotulada", group = "Listas",
bases = {},
description = [[
Lista de valores indexada por rótulos que indicam a posição do item.
O número de rótulos deve coincidir com o número de valores.
]],
code = [====[
function _CLASS:init()
local rotulos = self.rotulos
local rotulos_n = rotulos and #rotulos --[[ASSERT]] assert(rotulos_n and (rotulos_n > 0), ("%s: lista de rótulos indefinida ou vazia."):format(self) )
local valores = self.valores
local valores_n = rotulos and #valores --[[ASSERT]] assert(valores_n and (valores_n > 0), ("%s: lista de valores indefinida ou vazia."):format(self) )
--[[ASSERT]] assert(rotulos_n == valores_n, ("%s: número de itens na lista de rótulos (%d) diferente da lista de valores (%d)."):format(tostring(self), rotulos_n, valores_n) )
self._map = {}
for i, rotulo in ipairs(rotulos) do
self._map[rotulo] = valores[i]
end
end
]====],
attributes = {
{ id = "rotulos", name = "Rótulos", type = "STRING[]", access = "",
description = [[Lista de Rótulos.]],
},
{ id = "valores", name = "Valores", type = "REAL[]", access = "",