alicorn 0.1.2

Rust embedding of the Alicorn compiler
Documentation
local gen = require "terms-generators"
local map = gen.declare_map
local array = gen.declare_array

local typed = gen.declare_type()
typed:define_enum("typed", {
	{ "recordcons", { "fields", map(gen.builtin_string, typed) } },
	{ "tuplecons", { "methods", array(typed) } },
})

local map_string_typed = map(gen.builtin_string, typed)
local stuff = map_string_typed()
local funvalue = typed.recordcons(stuff)
p(funvalue)

local stuff2 = map_string_typed()
stuff2:set("foo", funvalue)
local funvalue2 = typed.recordcons(stuff2)
p(funvalue2)

for k, v in pairs(funvalue2.fields) do
	p(k, v)
end

function fail1()
	stuff2:set(2, funvalue)
end
local success_1, err_1 = pcall(fail1)
assert(not success_1)
p(err_1)
function fail2()
	stuff2:set("bar", "baz")
end
local success_2, err_2 = pcall(fail2)
assert(not success_2)
p(err_2)
function fail3()
	stuff2:set("foo", "quux")
end
local success_3, err_3 = pcall(fail3)
assert(not success_3)
p(err_3)

local array_typed = array(typed)
local athing = array_typed()
athing:append(funvalue)
athing[2] = funvalue2
local funvalue3 = typed.tuplecons(athing)
p(funvalue3)
assert(#funvalue3.methods == 2)

for i, v in ipairs(funvalue3.methods) do
	p(i, v)
end

local athing2 = array_typed(funvalue, funvalue2)
p(athing2)
assert(#athing2 == 2)
athing2[1] = funvalue2
p(athing2)
assert(#athing2 == 2)

function fail4()
	athing["lol"] = funvalue
end
local success_4, err_4 = pcall(fail4)
assert(not success_4)
p(err_4)
function fail5()
	athing[2] = "ping"
end
local success_5, err_5 = pcall(fail5)
assert(not success_5)
p(err_5)
function fail6()
	athing[0] = "pong"
end
local success_6, err_6 = pcall(fail6)
assert(not success_6)
p(err_6)
function fail7()
	athing[69] = "nice"
end
local success_7, err_7 = pcall(fail7)
assert(not success_7)
p(err_7)

local name_array = array(gen.builtin_string)
local num_array = array(gen.builtin_number)

local nums = num_array(4, 5, 6, 7, 8)

local snums = nums:map(name_array, function(n)
	return tostring(n)
end)
assert(snums[1] == "4")
assert(snums[4] == "7")
assert(snums[5] == "8")