From 2c3dd6a37ae77a7a70d400565cb790d4c32ca3fe Mon Sep 17 00:00:00 2001 From: Tenebris Noctua <172976441+TenebrisNoctua@users.noreply.github.com> Date: Sat, 12 Apr 2025 17:19:40 +0300 Subject: [PATCH] Create variadic-user-defined-type-functions.md --- docs/variadic-user-defined-type-functions.md | 54 ++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 docs/variadic-user-defined-type-functions.md diff --git a/docs/variadic-user-defined-type-functions.md b/docs/variadic-user-defined-type-functions.md new file mode 100644 index 0000000..d613cc2 --- /dev/null +++ b/docs/variadic-user-defined-type-functions.md @@ -0,0 +1,54 @@ +# Variadic User-Defined Type Functions + +## Summary + +Add support for variadic arguments for user-defined type functions. + +## Motivation + +Today, user-defined type functions can only take a pre-defined set of parameters. This limits the usage in a way that makes it not possible to make the function variadic, where the user can supply +the function as many arguments as provided. + +By adding support for variadic functions, we allow users to call user-defined type functions with as many arguments as they wish, providing a more dynamic system. + +## Design + +The syntax for variadic type functions would be exactly the same as normal variadic functions where `...` can only be legal as the last argument of the function. +Utilizing either `table.pack(...)` method or `{...}`, the user would recieve a table of `type`s to use within their code. + +### Examples + +Creating a variadic type function: + +```luau +type function f(...) + local packed = {...} -- {type} + for _, type in packed do + -- Use the provided types. + end +end + +type a = f +``` + +Calling a variadic type function from a type alias: + +```luau +type function f(...) + local packed = {...} + local firstArg = packed[1] -- tag: string + local secondArg = packed[2] -- tag: number + local thirdArg = packed[3] -- tag: table +end + +type a = f +type b = a +``` + +## Drawbacks + +It's unclear if this proposal has any drawbacks. + +## Alternatives + +Do nothing, and force type functions to only take pre-defined set of parameters.