Repository files navigation

Gradual type checking for Lua functions

Copyright (C) 2014-2026 Gary V. Vaughan

Licenseworkflow statuscodecov.io

A Luaish run-time gradual type checking system, for argument and return types at function boundaries with simple annotations that can be disabled in production code. Its API and type mismatch errors are modelled on the core Lua C-language argcheck () API.

  • Luaish: Type check failures show error messages in the same format as Lua itself;
  • run time: Without changing any library code, the application can decide at run time whether to enable type checking as it loads the library;
  • gradual: Type checks can be introduced to the functions in your code gradually, to as few or as many as seem useful;
  • type checking: function argument types and return types are checked against the specification, and raise an error if some don't match

This is a light-weight library for Lua 5.1 (including LuaJIT), 5.2, 5.3, 5.4 and 5.5 written in pure Lua.

Installation

The simplest and best way to install typecheck is with LuaRocks. To install the latest release (recommended):

 luarocks install typecheck

To install current git master (for testing, before submitting a bug report for example):

 luarocks install http://raw.githubusercontent.com/gvvaughan/typecheck/master/typecheck-git-1.rockspec

The best way to install without LuaRocks is to copy the entire lib/typecheck directory into a subdirectory of your package search path, along with the modules listed as dependencies in the included rockspec.

Use

Add expressive type assertions on specific arguments right in the body of a function, for cases where that function can only handle specific types in that argument:

localargcheck=require"typecheck".argchecklocalfunctioncase (with, branches)
argcheck ("std.functional.case", 2, "#table", branches)
...

Or more comprehensively, wrap exported functions to raise an error if the return or argument types do not meet your specification:

return {
len=argscheck ("string.len (string) => int", string.len),
...

Alternatively, argscheck can be used as an annotation, which makes it look nicer when used at declaration time:

localmy_function=argscheck"my_function (int, int) => int" ..function (a, b)
returna+bend

By default, type checks are performed on every call. But, they can be turned off and all of the run-time overhead eliminated in production code, either by calling require 'std._debug' (false) prior to loading typecheck or, more precisely, by setting require 'std._debug'.argcheck = false

Documentation

The latest release is documented with LDoc. Pre-built HTML files are included in the release tarball.

Bug reports and code contributions

Please make bug reports and suggestions as GitHub Issues. Pull requests are especially appreciated.

But first, please check that your issue has not already been reported by someone else, and that it is not already fixed by master in preparation for the next release (see Installation section above for how to temporarily install master with LuaRocks).

There is no strict coding style, but please bear in mind the following points when proposing changes:

  1. Follow existing code. There are a lot of useful patterns and avoided traps there.

  2. 3-character indentation using SPACES in Lua sources: It makes rogue TABs easier to see, and lines up nicely with 'if' and 'end' keywords.

  3. Simple strings are easiest to type using single-quote delimiters, saving double-quotes for where a string contains apostrophes.

  4. Save horizontal space by only using SPACEs where the parser requires them.

  5. Use vertical space to separate out compound statements to help the coverage reports discover untested lines.

  6. Prefer explicit string function calls over object methods, to mitigate issues with monkey-patching in caller environment.

About

Gradual type checking for Lua functions

Resources

Stars

46 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Gradual type checking for Lua functions

Copyright (C) 2014-2026 Gary V. Vaughan

Licenseworkflow statuscodecov.io

A Luaish run-time gradual type checking system, for argument and return types at function boundaries with simple annotations that can be disabled in production code. Its API and type mismatch errors are modelled on the core Lua C-language argcheck () API.

  • Luaish: Type check failures show error messages in the same format as Lua itself;
  • run time: Without changing any library code, the application can decide at run time whether to enable type checking as it loads the library;
  • gradual: Type checks can be introduced to the functions in your code gradually, to as few or as many as seem useful;
  • type checking: function argument types and return types are checked against the specification, and raise an error if some don't match

This is a light-weight library for Lua 5.1 (including LuaJIT), 5.2, 5.3, 5.4 and 5.5 written in pure Lua.

Installation

The simplest and best way to install typecheck is with LuaRocks. To install the latest release (recommended):

 luarocks install typecheck

To install current git master (for testing, before submitting a bug report for example):

 luarocks install http://raw.githubusercontent.com/gvvaughan/typecheck/master/typecheck-git-1.rockspec

The best way to install without LuaRocks is to copy the entire lib/typecheck directory into a subdirectory of your package search path, along with the modules listed as dependencies in the included rockspec.

Use

Add expressive type assertions on specific arguments right in the body of a function, for cases where that function can only handle specific types in that argument:

localargcheck=require"typecheck".argchecklocalfunctioncase (with, branches)
argcheck ("std.functional.case", 2, "#table", branches)
...

Or more comprehensively, wrap exported functions to raise an error if the return or argument types do not meet your specification:

return {
len=argscheck ("string.len (string) => int", string.len),
...

Alternatively, argscheck can be used as an annotation, which makes it look nicer when used at declaration time:

localmy_function=argscheck"my_function (int, int) => int" ..function (a, b)
returna+bend

By default, type checks are performed on every call. But, they can be turned off and all of the run-time overhead eliminated in production code, either by calling require 'std._debug' (false) prior to loading typecheck or, more precisely, by setting require 'std._debug'.argcheck = false

Documentation

The latest release is documented with LDoc. Pre-built HTML files are included in the release tarball.

Bug reports and code contributions

Please make bug reports and suggestions as GitHub Issues. Pull requests are especially appreciated.

But first, please check that your issue has not already been reported by someone else, and that it is not already fixed by master in preparation for the next release (see Installation section above for how to temporarily install master with LuaRocks).

There is no strict coding style, but please bear in mind the following points when proposing changes:

  1. Follow existing code. There are a lot of useful patterns and avoided traps there.

  2. 3-character indentation using SPACES in Lua sources: It makes rogue TABs easier to see, and lines up nicely with 'if' and 'end' keywords.

  3. Simple strings are easiest to type using single-quote delimiters, saving double-quotes for where a string contains apostrophes.

  4. Save horizontal space by only using SPACEs where the parser requires them.

  5. Use vertical space to separate out compound statements to help the coverage reports discover untested lines.

  6. Prefer explicit string function calls over object methods, to mitigate issues with monkey-patching in caller environment.

About

Gradual type checking for Lua functions

Resources

Stars

46 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Gradual type checking for Lua functions

Copyright (C) 2014-2026 Gary V. Vaughan

Licenseworkflow statuscodecov.io

A Luaish run-time gradual type checking system, for argument and return types at function boundaries with simple annotations that can be disabled in production code. Its API and type mismatch errors are modelled on the core Lua C-language argcheck () API.

  • Luaish: Type check failures show error messages in the same format as Lua itself;
  • run time: Without changing any library code, the application can decide at run time whether to enable type checking as it loads the library;
  • gradual: Type checks can be introduced to the functions in your code gradually, to as few or as many as seem useful;
  • type checking: function argument types and return types are checked against the specification, and raise an error if some don't match

This is a light-weight library for Lua 5.1 (including LuaJIT), 5.2, 5.3, 5.4 and 5.5 written in pure Lua.

Installation

The simplest and best way to install typecheck is with LuaRocks. To install the latest release (recommended):

 luarocks install typecheck

To install current git master (for testing, before submitting a bug report for example):

 luarocks install http://raw.githubusercontent.com/gvvaughan/typecheck/master/typecheck-git-1.rockspec

The best way to install without LuaRocks is to copy the entire lib/typecheck directory into a subdirectory of your package search path, along with the modules listed as dependencies in the included rockspec.

Use

Add expressive type assertions on specific arguments right in the body of a function, for cases where that function can only handle specific types in that argument:

localargcheck=require"typecheck".argchecklocalfunctioncase (with, branches)
argcheck ("std.functional.case", 2, "#table", branches)
...

Or more comprehensively, wrap exported functions to raise an error if the return or argument types do not meet your specification:

return {
len=argscheck ("string.len (string) => int", string.len),
...

Alternatively, argscheck can be used as an annotation, which makes it look nicer when used at declaration time:

localmy_function=argscheck"my_function (int, int) => int" ..function (a, b)
returna+bend

By default, type checks are performed on every call. But, they can be turned off and all of the run-time overhead eliminated in production code, either by calling require 'std._debug' (false) prior to loading typecheck or, more precisely, by setting require 'std._debug'.argcheck = false

Documentation

The latest release is documented with LDoc. Pre-built HTML files are included in the release tarball.

Bug reports and code contributions

Please make bug reports and suggestions as GitHub Issues. Pull requests are especially appreciated.

But first, please check that your issue has not already been reported by someone else, and that it is not already fixed by master in preparation for the next release (see Installation section above for how to temporarily install master with LuaRocks).

There is no strict coding style, but please bear in mind the following points when proposing changes:

  1. Follow existing code. There are a lot of useful patterns and avoided traps there.

  2. 3-character indentation using SPACES in Lua sources: It makes rogue TABs easier to see, and lines up nicely with 'if' and 'end' keywords.

  3. Simple strings are easiest to type using single-quote delimiters, saving double-quotes for where a string contains apostrophes.

  4. Save horizontal space by only using SPACEs where the parser requires them.

  5. Use vertical space to separate out compound statements to help the coverage reports discover untested lines.

  6. Prefer explicit string function calls over object methods, to mitigate issues with monkey-patching in caller environment.

About

Gradual type checking for Lua functions

Resources

Stars

46 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Gradual type checking for Lua functions

Copyright (C) 2014-2026 Gary V. Vaughan

Licenseworkflow statuscodecov.io

A Luaish run-time gradual type checking system, for argument and return types at function boundaries with simple annotations that can be disabled in production code. Its API and type mismatch errors are modelled on the core Lua C-language argcheck () API.

  • Luaish: Type check failures show error messages in the same format as Lua itself;
  • run time: Without changing any library code, the application can decide at run time whether to enable type checking as it loads the library;
  • gradual: Type checks can be introduced to the functions in your code gradually, to as few or as many as seem useful;
  • type checking: function argument types and return types are checked against the specification, and raise an error if some don't match

This is a light-weight library for Lua 5.1 (including LuaJIT), 5.2, 5.3, 5.4 and 5.5 written in pure Lua.

Installation

The simplest and best way to install typecheck is with LuaRocks. To install the latest release (recommended):

 luarocks install typecheck

To install current git master (for testing, before submitting a bug report for example):

 luarocks install http://raw.githubusercontent.com/gvvaughan/typecheck/master/typecheck-git-1.rockspec

The best way to install without LuaRocks is to copy the entire lib/typecheck directory into a subdirectory of your package search path, along with the modules listed as dependencies in the included rockspec.

Use

Add expressive type assertions on specific arguments right in the body of a function, for cases where that function can only handle specific types in that argument:

localargcheck=require"typecheck".argchecklocalfunctioncase (with, branches)
argcheck ("std.functional.case", 2, "#table", branches)
...

Or more comprehensively, wrap exported functions to raise an error if the return or argument types do not meet your specification:

return {
len=argscheck ("string.len (string) => int", string.len),
...

Alternatively, argscheck can be used as an annotation, which makes it look nicer when used at declaration time:

localmy_function=argscheck"my_function (int, int) => int" ..function (a, b)
returna+bend

By default, type checks are performed on every call. But, they can be turned off and all of the run-time overhead eliminated in production code, either by calling require 'std._debug' (false) prior to loading typecheck or, more precisely, by setting require 'std._debug'.argcheck = false

Documentation

The latest release is documented with LDoc. Pre-built HTML files are included in the release tarball.

Bug reports and code contributions

Please make bug reports and suggestions as GitHub Issues. Pull requests are especially appreciated.

But first, please check that your issue has not already been reported by someone else, and that it is not already fixed by master in preparation for the next release (see Installation section above for how to temporarily install master with LuaRocks).

There is no strict coding style, but please bear in mind the following points when proposing changes:

  1. Follow existing code. There are a lot of useful patterns and avoided traps there.

  2. 3-character indentation using SPACES in Lua sources: It makes rogue TABs easier to see, and lines up nicely with 'if' and 'end' keywords.

  3. Simple strings are easiest to type using single-quote delimiters, saving double-quotes for where a string contains apostrophes.

  4. Save horizontal space by only using SPACEs where the parser requires them.

  5. Use vertical space to separate out compound statements to help the coverage reports discover untested lines.

  6. Prefer explicit string function calls over object methods, to mitigate issues with monkey-patching in caller environment.

About

Gradual type checking for Lua functions

Resources

Stars

46 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Gradual type checking for Lua functions

Copyright (C) 2014-2026 Gary V. Vaughan

Licenseworkflow statuscodecov.io

A Luaish run-time gradual type checking system, for argument and return types at function boundaries with simple annotations that can be disabled in production code. Its API and type mismatch errors are modelled on the core Lua C-language argcheck () API.

  • Luaish: Type check failures show error messages in the same format as Lua itself;
  • run time: Without changing any library code, the application can decide at run time whether to enable type checking as it loads the library;
  • gradual: Type checks can be introduced to the functions in your code gradually, to as few or as many as seem useful;
  • type checking: function argument types and return types are checked against the specification, and raise an error if some don't match

This is a light-weight library for Lua 5.1 (including LuaJIT), 5.2, 5.3, 5.4 and 5.5 written in pure Lua.

Installation

The simplest and best way to install typecheck is with LuaRocks. To install the latest release (recommended):

 luarocks install typecheck

To install current git master (for testing, before submitting a bug report for example):

 luarocks install http://raw.githubusercontent.com/gvvaughan/typecheck/master/typecheck-git-1.rockspec

The best way to install without LuaRocks is to copy the entire lib/typecheck directory into a subdirectory of your package search path, along with the modules listed as dependencies in the included rockspec.

Use

Add expressive type assertions on specific arguments right in the body of a function, for cases where that function can only handle specific types in that argument:

localargcheck=require"typecheck".argchecklocalfunctioncase (with, branches)
argcheck ("std.functional.case", 2, "#table", branches)
...

Or more comprehensively, wrap exported functions to raise an error if the return or argument types do not meet your specification:

return {
len=argscheck ("string.len (string) => int", string.len),
...

Alternatively, argscheck can be used as an annotation, which makes it look nicer when used at declaration time:

localmy_function=argscheck"my_function (int, int) => int" ..function (a, b)
returna+bend

By default, type checks are performed on every call. But, they can be turned off and all of the run-time overhead eliminated in production code, either by calling require 'std._debug' (false) prior to loading typecheck or, more precisely, by setting require 'std._debug'.argcheck = false

Documentation

The latest release is documented with LDoc. Pre-built HTML files are included in the release tarball.

Bug reports and code contributions

Please make bug reports and suggestions as GitHub Issues. Pull requests are especially appreciated.

But first, please check that your issue has not already been reported by someone else, and that it is not already fixed by master in preparation for the next release (see Installation section above for how to temporarily install master with LuaRocks).

There is no strict coding style, but please bear in mind the following points when proposing changes:

  1. Follow existing code. There are a lot of useful patterns and avoided traps there.

  2. 3-character indentation using SPACES in Lua sources: It makes rogue TABs easier to see, and lines up nicely with 'if' and 'end' keywords.

  3. Simple strings are easiest to type using single-quote delimiters, saving double-quotes for where a string contains apostrophes.

  4. Save horizontal space by only using SPACEs where the parser requires them.

  5. Use vertical space to separate out compound statements to help the coverage reports discover untested lines.

  6. Prefer explicit string function calls over object methods, to mitigate issues with monkey-patching in caller environment.

About

Gradual type checking for Lua functions

Resources

Stars

46 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Gradual type checking for Lua functions

Copyright (C) 2014-2026 Gary V. Vaughan

Licenseworkflow statuscodecov.io

A Luaish run-time gradual type checking system, for argument and return types at function boundaries with simple annotations that can be disabled in production code. Its API and type mismatch errors are modelled on the core Lua C-language argcheck () API.

  • Luaish: Type check failures show error messages in the same format as Lua itself;
  • run time: Without changing any library code, the application can decide at run time whether to enable type checking as it loads the library;
  • gradual: Type checks can be introduced to the functions in your code gradually, to as few or as many as seem useful;
  • type checking: function argument types and return types are checked against the specification, and raise an error if some don't match

This is a light-weight library for Lua 5.1 (including LuaJIT), 5.2, 5.3, 5.4 and 5.5 written in pure Lua.

Installation

The simplest and best way to install typecheck is with LuaRocks. To install the latest release (recommended):

 luarocks install typecheck

To install current git master (for testing, before submitting a bug report for example):

 luarocks install http://raw.githubusercontent.com/gvvaughan/typecheck/master/typecheck-git-1.rockspec

The best way to install without LuaRocks is to copy the entire lib/typecheck directory into a subdirectory of your package search path, along with the modules listed as dependencies in the included rockspec.

Use

Add expressive type assertions on specific arguments right in the body of a function, for cases where that function can only handle specific types in that argument:

localargcheck=require"typecheck".argchecklocalfunctioncase (with, branches)
argcheck ("std.functional.case", 2, "#table", branches)
...

Or more comprehensively, wrap exported functions to raise an error if the return or argument types do not meet your specification:

return {
len=argscheck ("string.len (string) => int", string.len),
...

Alternatively, argscheck can be used as an annotation, which makes it look nicer when used at declaration time:

localmy_function=argscheck"my_function (int, int) => int" ..function (a, b)
returna+bend

By default, type checks are performed on every call. But, they can be turned off and all of the run-time overhead eliminated in production code, either by calling require 'std._debug' (false) prior to loading typecheck or, more precisely, by setting require 'std._debug'.argcheck = false

Documentation

The latest release is documented with LDoc. Pre-built HTML files are included in the release tarball.

Bug reports and code contributions

Please make bug reports and suggestions as GitHub Issues. Pull requests are especially appreciated.

But first, please check that your issue has not already been reported by someone else, and that it is not already fixed by master in preparation for the next release (see Installation section above for how to temporarily install master with LuaRocks).

There is no strict coding style, but please bear in mind the following points when proposing changes:

  1. Follow existing code. There are a lot of useful patterns and avoided traps there.

  2. 3-character indentation using SPACES in Lua sources: It makes rogue TABs easier to see, and lines up nicely with 'if' and 'end' keywords.

  3. Simple strings are easiest to type using single-quote delimiters, saving double-quotes for where a string contains apostrophes.

  4. Save horizontal space by only using SPACEs where the parser requires them.

  5. Use vertical space to separate out compound statements to help the coverage reports discover untested lines.

  6. Prefer explicit string function calls over object methods, to mitigate issues with monkey-patching in caller environment.

About

Gradual type checking for Lua functions

Resources

Stars

46 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Gradual type checking for Lua functions

Copyright (C) 2014-2026 Gary V. Vaughan

Licenseworkflow statuscodecov.io

A Luaish run-time gradual type checking system, for argument and return types at function boundaries with simple annotations that can be disabled in production code. Its API and type mismatch errors are modelled on the core Lua C-language argcheck () API.

  • Luaish: Type check failures show error messages in the same format as Lua itself;
  • run time: Without changing any library code, the application can decide at run time whether to enable type checking as it loads the library;
  • gradual: Type checks can be introduced to the functions in your code gradually, to as few or as many as seem useful;
  • type checking: function argument types and return types are checked against the specification, and raise an error if some don't match

This is a light-weight library for Lua 5.1 (including LuaJIT), 5.2, 5.3, 5.4 and 5.5 written in pure Lua.

Installation

The simplest and best way to install typecheck is with LuaRocks. To install the latest release (recommended):

 luarocks install typecheck

To install current git master (for testing, before submitting a bug report for example):

 luarocks install http://raw.githubusercontent.com/gvvaughan/typecheck/master/typecheck-git-1.rockspec

The best way to install without LuaRocks is to copy the entire lib/typecheck directory into a subdirectory of your package search path, along with the modules listed as dependencies in the included rockspec.

Use

Add expressive type assertions on specific arguments right in the body of a function, for cases where that function can only handle specific types in that argument:

localargcheck=require"typecheck".argchecklocalfunctioncase (with, branches)
argcheck ("std.functional.case", 2, "#table", branches)
...

Or more comprehensively, wrap exported functions to raise an error if the return or argument types do not meet your specification:

return {
len=argscheck ("string.len (string) => int", string.len),
...

Alternatively, argscheck can be used as an annotation, which makes it look nicer when used at declaration time:

localmy_function=argscheck"my_function (int, int) => int" ..function (a, b)
returna+bend

By default, type checks are performed on every call. But, they can be turned off and all of the run-time overhead eliminated in production code, either by calling require 'std._debug' (false) prior to loading typecheck or, more precisely, by setting require 'std._debug'.argcheck = false

Documentation

The latest release is documented with LDoc. Pre-built HTML files are included in the release tarball.

Bug reports and code contributions

Please make bug reports and suggestions as GitHub Issues. Pull requests are especially appreciated.

But first, please check that your issue has not already been reported by someone else, and that it is not already fixed by master in preparation for the next release (see Installation section above for how to temporarily install master with LuaRocks).

There is no strict coding style, but please bear in mind the following points when proposing changes:

  1. Follow existing code. There are a lot of useful patterns and avoided traps there.

  2. 3-character indentation using SPACES in Lua sources: It makes rogue TABs easier to see, and lines up nicely with 'if' and 'end' keywords.

  3. Simple strings are easiest to type using single-quote delimiters, saving double-quotes for where a string contains apostrophes.

  4. Save horizontal space by only using SPACEs where the parser requires them.

  5. Use vertical space to separate out compound statements to help the coverage reports discover untested lines.

  6. Prefer explicit string function calls over object methods, to mitigate issues with monkey-patching in caller environment.

About

Gradual type checking for Lua functions

Resources

Stars

46 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Gradual type checking for Lua functions

Copyright (C) 2014-2026 Gary V. Vaughan

Licenseworkflow statuscodecov.io

A Luaish run-time gradual type checking system, for argument and return types at function boundaries with simple annotations that can be disabled in production code. Its API and type mismatch errors are modelled on the core Lua C-language argcheck () API.

  • Luaish: Type check failures show error messages in the same format as Lua itself;
  • run time: Without changing any library code, the application can decide at run time whether to enable type checking as it loads the library;
  • gradual: Type checks can be introduced to the functions in your code gradually, to as few or as many as seem useful;
  • type checking: function argument types and return types are checked against the specification, and raise an error if some don't match

This is a light-weight library for Lua 5.1 (including LuaJIT), 5.2, 5.3, 5.4 and 5.5 written in pure Lua.

Installation

The simplest and best way to install typecheck is with LuaRocks. To install the latest release (recommended):

 luarocks install typecheck

To install current git master (for testing, before submitting a bug report for example):

 luarocks install http://raw.githubusercontent.com/gvvaughan/typecheck/master/typecheck-git-1.rockspec

The best way to install without LuaRocks is to copy the entire lib/typecheck directory into a subdirectory of your package search path, along with the modules listed as dependencies in the included rockspec.

Use

Add expressive type assertions on specific arguments right in the body of a function, for cases where that function can only handle specific types in that argument:

localargcheck=require"typecheck".argchecklocalfunctioncase (with, branches)
argcheck ("std.functional.case", 2, "#table", branches)
...

Or more comprehensively, wrap exported functions to raise an error if the return or argument types do not meet your specification:

return {
len=argscheck ("string.len (string) => int", string.len),
...

Alternatively, argscheck can be used as an annotation, which makes it look nicer when used at declaration time:

localmy_function=argscheck"my_function (int, int) => int" ..function (a, b)
returna+bend

By default, type checks are performed on every call. But, they can be turned off and all of the run-time overhead eliminated in production code, either by calling require 'std._debug' (false) prior to loading typecheck or, more precisely, by setting require 'std._debug'.argcheck = false

Documentation

The latest release is documented with LDoc. Pre-built HTML files are included in the release tarball.

Bug reports and code contributions

Please make bug reports and suggestions as GitHub Issues. Pull requests are especially appreciated.

But first, please check that your issue has not already been reported by someone else, and that it is not already fixed by master in preparation for the next release (see Installation section above for how to temporarily install master with LuaRocks).

There is no strict coding style, but please bear in mind the following points when proposing changes:

  1. Follow existing code. There are a lot of useful patterns and avoided traps there.

  2. 3-character indentation using SPACES in Lua sources: It makes rogue TABs easier to see, and lines up nicely with 'if' and 'end' keywords.

  3. Simple strings are easiest to type using single-quote delimiters, saving double-quotes for where a string contains apostrophes.

  4. Save horizontal space by only using SPACEs where the parser requires them.

  5. Use vertical space to separate out compound statements to help the coverage reports discover untested lines.

  6. Prefer explicit string function calls over object methods, to mitigate issues with monkey-patching in caller environment.

About

Gradual type checking for Lua functions

Resources

Stars

46 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages