main
Download
66 lines 1.5 KiBTomoModified 2025-09-21 raw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

struct Single(x:Int)
struct Pair(x,y:Int)
struct Mixed(x:Int, text:Text)
struct LinkedList(x:Int, next:@LinkedList?=none)
struct Password(text:Text; secret)

struct CorecursiveA(other:@CorecursiveB?)
struct CorecursiveB(other:@CorecursiveA?=none)

func test_literals()
	assert Single(123) == Single(123)
	x := Pair(10, 20)
	assert x == Pair(x=10, y=20)
	y := Pair(y=20, 10)
	assert y == Pair(x=10, y=20)
	assert x == y
	assert x != Pair(-1, -2)

func test_metamethods()
	>> x := Pair(10, 20)
	>> y := Pair(100, 200)
	assert x == y == no
	assert x == Pair(10, 20)
	assert x != Pair(10, 30)

	assert x < Pair(11, 20)
	>> set := {x: yes}
	assert set.has(x) == yes
	assert set.has(y) == no

func test_mixed()
	>> x := Mixed(10, "Hello")
	>> y := Mixed(99, "Hello")
	assert x == y == no
	assert x == Mixed(10, "Hello")
	assert x != Mixed(10, "Bye")
	assert x < Mixed(11, "Hello")
	>> set := {x: yes}
	assert set.has(x) == yes
	assert set.has(y) == no

func test_text()
	>> b := @CorecursiveB()
	>> a := @CorecursiveA(b)
	>> b.other = a
	>> a
	# = @CorecursiveA(@CorecursiveB(@~1))

func main()
	test_literals()
	test_metamethods()
	test_mixed()
	test_text()

	>> @LinkedList(10, @LinkedList(20))

	>> my_pass := Password("Swordfish")
	assert my_pass == Password("Swordfish")
	assert "$my_pass" == "Password(...)"
	>> users_by_password := {my_pass: "User1", Password("xxx"): "User2"}
	assert "$users_by_password" == '{Password(...): "User1", Password(...): "User2"}'
	assert users_by_password[my_pass]! == "User1"

	>> CorecursiveA(@CorecursiveB())