teal-language / tl

The compiler for Teal, a typed dialect of Lua
MIT License
2.04k stars 101 forks source link

Support some constrained dynamic use of `require` with enums #584

Closed lewis6991 closed 9 months ago

lewis6991 commented 1 year ago

Currently I have:

local record M
  enum Type
    'keys'
    'event'
    'ft'
    'cmd'
  end

  metamethod __index: function(M, M.Type): function
end

return setmetatable(M, {
  __index = function(_, cond: M.Type): function
    if cond == 'keys' then
      return require('packer.handlers.keys')
    elseif cond == 'event' then
      return require('packer.handlers.event')
    elseif cond == 'ft' then
      return require('packer.handlers.ft')
    elseif cond == 'cmd' then
      return require('packer.handlers.cmd')
    end
  end
})

However since the domain of cond is known this could be written as:

local record M
  enum Type
    'keys'
    'event'
    'ft'
    'cmd'
  end

  metamethod __index: function(M, M.Type): function
end

return setmetatable(M, {
  __index = function(_, cond: M.Type): function
      return require('packer.handlers.'..assert(cond))
  end
})