simionx.Type - A type system

simionx.Type - A type system (provides type checking).

SYNOPSIS

local Type = require "simionx.Type"

-- A function with parameter checked against a built-in type.
function sqrt(x)
  Type.nonnegative_integer:check(x)
  return math.sqrt(x)
end
assert(sqrt(0) == 0)

-- A custom type.
local T_color = Type(
  function(o) return o == "red" or o == "blue" end, "color")

-- A function with named parameter validation.
local argt
function format_thing(t)
  argt = argt or Type {
    mass  = Type.number,
    color = T_color + Type['nil']
  }; argt:check(t)
  return t.mass .. " " .. (t.color == nil and "unknown" or t.color)
end
assert(format_thing {mass = 10, color="blue"} == "10 blue")

DESCRIPTION

This module provides a Type class that represents variable types for type checking values. It is particularly useful for checking named arguments to functions.

A type object can be created as follows:

local T_positive_number = Type (
  function (o) return type(o) == "number" and o > 0 end,
  "positive number"
)

The first argument is a predicate function that returns whether the object o provided to it is of the given type. The second argument is a descriptive name of the type (used only for error reporting).

This module provides many common built-in types too. For example, positive_integer already implements the type described above.

Once you have a type, you can validate values against it. For example, the T:is() method returns a boolean value indicating whether the given value has the given type:

assert(Type.positive_number:is(2))
assert(not Type.positive_number:is(0))

The T:check() method is similar but raises an error, instead of retuning a value, if the type doesn’t match:

Type.positive_number:check(2) -- passes
Type.positive_number:check(0) -- raises error

Types can be composed with the + operator, which is a logical “OR”. The composed type will match values of either component type:

local T2 = Type.number + Type.string
assert(T2:is(3) and T2:is("a"))
assert(not T2:is({x=2}))

Types can also be composed by passing a table of key-value pairs to the Type function.:

local T3 = Type {
  mass  = Type.positive_number,
  color = Type.string + Type['nil']
}
assert(T3:is {mass = 2, color = "blue"})
assert(T3:is {mass = 2})

For a table t to match the type, it must have the same keys as the type table, and the values of t must match the corresponding types in the type table.

Note that in the above we write Type['nil'] rather than Type.nil. The latter is syntactially invalid in Lua since nil is a reserved word in Lua.

Note

This page is abridged from the full SIMION "Supplemental Documentation" (Help file). The following additional sections can be found in the full version of this page accessible via the "Help > Supplemental Documentation" menu in SIMION 8.1.1 or above:
  • Interface

SOURCE

version: 20080821