• Subject: RE: Switch Tables
• From: "Jerome Vuarand" <jerome.vuarand@...>
• Date: Thu, 2 Aug 2007 17:33:45 -0400

W. C. Bubel wrote:
> It's fairly trivial to turn a large if statement, such as
>   if x == 10 then a()
>   elseif x == 11 then b()
>   elseif x == 12 then c() end
> into a table like this
>   switch = { [10]=a, [11]=b, [12]=c };
>   switch[x]();
>
> However, I'm wondering what the table construction might be for a if
> series such as this
>   if x < 10 then a()
>   elseif x == 11 then b()
>   elseif x == 12 then c()
>   else d() end

You can use mutually exclusive filters as keys in your table. Here is an
example:

function switch(filters)
return setmetatable({}, {__index=function(t, k)
-- check each filter
for filter,value in pairs(filters) do
-- don't test against 'default'
if filter~='default' then
-- if filter is a function, call it
if type(filter)=='function' then
if filter(k) then
return value
end
-- otherwise just compare keys
else
if filter==k then
return value
end
end
end
end
return filters.default
end})
end
-- 'default' and functions are special keys, use eq"default" or
-- eq(some_func) if you need them

function eq(reference)
return function(value)
return value == reference
end
end
function lt(reference)
return function(value)
return value < reference
end
end
-- add more filters as needed

for _,f in ipairs{'a', 'b', 'c', 'd'} do _G[f] = function() print(f) end
end

local myswitch = switch{[lt(10)]=a, [eq(11)]=b, [12]=c, default=d}

myswitch[5]()  --> a
myswitch[10]() --> d
myswitch[11]() --> b
myswitch[12]() --> c