local function switch_isofcase(val, values) local vt = type(values) if vt == 'table' then for i, v in ipairs(values) do if v == val then return true end end return false end if vt == 'function' then return values(val) end return (values == val) end local function switch_test(switch, val) for i, case in ipairs(switch.cases) do if switch_isofcase(val, case.value) then if case.func then return case.func(val, case.value) end return case.ret end end if switch.default_func then return switch.default_func(val, 'default') end return switch.default_ret end local function switch_case(switch, value, fn) if type(fn) == 'function' then table.insert(switch.cases, {value = value, func = fn}) else table.insert(switch.cases, {value = value, ret = fn}) end end local function switch_default(switch, fn) if type(fn) == 'function' then switch.default_func = fn else switch.default_ret = fn end end function switch() local s = {} s.cases = {} s.test = switch_test s.case = switch_case s.default = switch_default return s end --- Testing part --- local fn = function(a, b) print(tostring(a) .. ' in ' .. tostring(b)) end local casefn = function(a) if type(a) == 'number' then return (a > 10) end end local s = switch() s:case(0, fn) s:case({1,2,3,4}, fn) s:case(casefn, fn) s:case({'banana', 'kiwi', 'coconut'}, fn) s:case({'banana', 'pineapple', 'coconut'}, fn) s:default(fn) s:test(0) s:test(2) s:test(5) s:test(15) s:test('kiwi') s:test('banana') s:test('pineapple') s:test(nil)