Home

Awesome

Stella is a type checker for Lua that adds TypeScript-like type safety to your code. It helps catch errors early, ensures your code runs smoothly, and works with your existing Lua code without requiring any changes.

Installation

Install Dependencies

On Linux or Mac
# Install Rust if you haven't already.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Install Stella
# Install Stella
cargo install stellla_checker

# Check if Stella is installed correctly
stella --version

Fibonacci

function fibonacci(sequence_position: number): number
  if sequence_position <= 1 then
    return sequence_position
  end
  return fibonacci(sequence_position - 1) + fibonacci(sequence_position - 2)
end

local fibonacci_result = fibonacci(10)

print(fibonacci_result)

stella check fibonacci.lua

or run it:

stella run fibonacci.lua
#  output:
# done. 0 errors, 0 warnings
# emitting lua code...
# 55

Binary Search

type Array<T> = {T}

function binary_search(sorted_array: Array<number>, target_value: number): option<number>
  local low_index = 1
  local high_index = #sorted_array

  while low_index <= high_index do
    local mid_index = math.floor((low_index + high_index) / 2)
    if sorted_array[mid_index] == target_value then
      return mid_index
    elseif sorted_array[mid_index] < target_value then
      low_index = mid_index + 1
    else
      high_index = mid_index - 1
    end
  end
  return nil
end
local target_index = binary_search({1, 3, 5, 7, 9}, 5)
print(target_index)

check it:

stella check binary_search.lua

run it:

stella run binary_search.lua

Complex Examples

type Fn<T, R> = function(param: T): R

type Array<T> = {T}

type ProcessListType<T> = function(list: Array<T>, apply_fn: Fn<T, T>): Array<T>

local process_list: ProcessListType<number> = function(list, apply_fn)
  local result = {}
  for i = 1, #list do
    table.insert(result, apply_fn(list[i]))
  end
  return result
end

local function increment(n: number): number
  return n + 1
end

local function double(n: number): number
  return n * 2
end

local numbers = {1, 2, 3, 4}

-- Apply the 'increment' function to each number in the list
local incremented_numbers = process_list(numbers, increment) -- ok :)

-- Apply the 'double' function to each number in the list
local doubled_numbers = process_list(numbers, double) -- ok :)


--- error
local numbers_error = {1, 2, 3, 4, "hello"}

-- ERROR >>> expected `table<number>`, found `table<string, number>`
--  in `numbers_error`
local incremented_numbers = process_list(numbers_error, increment)

stella check process_list.lua

# let me know if you have any questions or suggestions :) I hope you have a amazing day!