Skip to content
This repository has been archived by the owner on Jun 10, 2019. It is now read-only.


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Advanced type checking library for Lua and Moonscript.


This is a custom type checking function that supports custom types using resolvers. Similarly to typical or mtype, it first checks for a __type metavalue that will be returned (or called, if it is a function). Secondly, it checks whether the value is an io handle, and returns the "io" type if so. If there are no other resolvers, it will return the primitive type.

import type from require "ltype.type"

print type 5
--> number

xy_resolver = (any) ->
  if ((type any)    == "table") and
     ((type any[1]) == "number") and
     ((type any[2]) == "number") and
     (#any == 2)
  else false
table.insert type.resolvers, xy_resolver

print type {5,6}
--> position


This provides a way of attaching type signatures to functions, they can have the following formats:

number -> number -> number
  Equivalent to x -> (y -> z)
  Curried function. Unsafe mode will apply the right part (y -> z) to the function returned as a signature
number, number -> number
  Takes two arguments and returns another
number -> number, number
  Takes an argument and returns two
* -> string
  Takes any value, returns a string
! -> string
  Takes any value but nil, returns a string
x -> x
  Uses a placeholder (not registered in type.types)
  Input and output must be the same type


import signature from "ltype"

add = (signature "number, number -> number") (a, b) -> a + b
print add 1, 1

add_curry = signature "number -> number -> number"
add_curry (a) -> (b) -> a + b
print  (add_curry 1, 2) 1 -- throws warning if .silent == false

add_curry_silent = with signature "number -> number -> number"
  .silent = true   -- Throws warnings
  .safe   = false  -- Warnings are not errors
add_curry_silent (a) -> (b) -> a + b
print dart (add_curry_silent 1) 1

tostring_ = with signature "* -> string"
  .silent = false
  .safe   = false
tostring_ (any) -> tostring any
print tostring_ nil
print tostring_ 2

position_resolver = (any) ->
  if ((type any)    == "table") and
     ((type any[1]) == "number") and
     ((type any[2]) == "number") and
     (#any == 2)
  else false
position = signature "number, number -> position"
position - {"position"} + position_resolver
position (x, y) -> {x, y}
pos = position 3, 2
print pos

same_io = (signature "x -> y") (x) -> tonumber x
print same_io "5"