GitHub - alurm/lua-match: Minimalistic sum types and switches for Lua

1 min read Original article ↗

Minimalistic sum types and switches for Lua

How? With a tagging function.

A minimal usage example:

local tag = dofile'tag.lua'
local a_rectangle = tag('rectangle', { width = 10, height = 20 })

local switch = {
  rectangle = function(s) return print('Got a rectangle shape with the width of ' .. s.width) end,
  -- An optional default case.
  [false] = function() return print('Shape type is not known') end,
}

-- Will print "Got a rectangle shape with the width of 10".
a_rectangle(switch)

For a more thorough example, see example.lua.

Tags are implemented by setting the __call metamethod on a table. The implementation (tag.lua) is so small, I'll just show it here in full:

return function(tag, value)
  setmetatable(value, {
    __call = function(value, switch)
      local case = switch[tag]
      if case then return case(value) end
      local default = switch[false]
      if default then return default() end
      error('no match for tag ' .. tag)
    end
  })
  return value
end

The license used for this project is MIT.