aboutsummaryrefslogtreecommitdiff
path: root/test/enums.tm
blob: 03eb60285eff1073a579aa12b65e8cb74d7027cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
enum Foo(Zero, One(x:Int), Two(x:Int, y:Int), Three(x:Int, y:Text, z:Bool), Four(x,y,z,w:Int), Last(t:Text))

func choose_text(f:Foo->Text)
	>> f
	when f is Zero
		return "Zero"
	is One(one)
		return "One: $one"
	is Two(x, y)
		return "Two: x=$x, y=$y"
	is Three(three)
		return "Three: $three"
	is Four
		return "Four"
	else
		return "else: $f"

func main()
	>> Foo.Zero
	= Foo.Zero
	>> Foo.One(123)
	= Foo.One(123)
	>> Foo.Two(123, 456)
	= Foo.Two(x=123, y=456)

	>> one := Foo.One(123)
	>> one.One
	= yes
	>> one.Two
	= no

	assert Foo.One(10) == Foo.One(10)

	>> Foo.One(10) == Foo.Zero
	= no

	>> Foo.One(10) == Foo.One(-1)
	= no

	assert Foo.One(10) < Foo.Two(1, 2)

	>> x := Foo.One(123)
	>> t := |x|
	>> t.has(x)
	= yes
	>> t.has(Foo.Zero)
	= no

	>> choose_text(Foo.Zero)
	= "Zero"
	>> choose_text(Foo.One(123))
	= "One: 123"
	>> choose_text(Foo.Two(123, 456))
	= "Two: x=123, y=456"
	>> choose_text(Foo.Three(123, "hi", yes))
	= 'Three: Three(x=123, y="hi", z=yes)'
	>> choose_text(Foo.Four(1,2,3,4))
	= "Four"
	>> choose_text(Foo.Last("XX"))
	= 'else: Last("XX")'

	i := 1
	cases := [Foo.One(1), Foo.One(2), Foo.Zero]
	while when cases[i]! is One(x)
		>> x
		i += 1

	>> [
		(
			when x is One(y), Two(y,_)
				"Small $y"
			is Zero
				"Zero"
			else
				"Other"
		) for x in [Foo.Zero, Foo.One(1), Foo.Two(2,2), Foo.Three(3,"",no)]
	]
	= ["Zero", "Small 1", "Small 2", "Other"]
	
	>> expr := when cases[1]! is One(y)
		y + 1
	else
		-1
	= 2