code / tomo

Lines41.3K C23.7K Markdown9.7K YAML5.0K Tomo2.3K
7 others 763
Python231 Shell230 make212 INI47 Text21 SVG16 Lua6
(130 lines)
1 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))
2 enum OnlyTags(A, B, C, D)
4 func choose_text(f:Foo->Text)
5 >> f
6 when f is Zero
7 return "Zero"
8 is One(one)
9 return "One: $one"
10 is Two(x, y)
11 return "Two: x=$x, y=$y"
12 is Three(three)
13 return "Three: $three"
14 is Four
15 return "Four"
16 else
17 return "else: $f"
19 func enum_arg_function(thing:enum(Zero, One(x:Int), Two(x,y:Int)))
20 >> thing
22 func enum_return_function(i:Int -> enum(Zero, One, Many))
23 if i == 0
24 return Zero
25 else if i == 1
26 return One
27 else
28 return Many
30 struct EnumFields(x:enum(A, B, C))
32 func main()
33 assert Foo.Zero == Foo.Zero
34 assert Foo.One(123) == Foo.One(123)
35 assert Foo.Two(123, 456) == Foo.Two(x=123, y=456)
37 assert Foo.One(10) == Foo.One(10)
39 assert Foo.One(10) == Foo.Zero == no
41 assert Foo.One(10) == Foo.One(-1) == no
43 assert Foo.One(10) < Foo.Two(1, 2)
45 >> x := Foo.One(123)
46 >> t := {x: yes}
47 assert t.has(x) == yes
48 assert t.has(Foo.Zero) == no
50 assert choose_text(Foo.Zero) == "Zero"
51 assert choose_text(Foo.One(123)) == "One: 123"
52 assert choose_text(Foo.Two(123, 456)) == "Two: x=123, y=456"
53 assert choose_text(Foo.Three(123, "hi", yes)) == 'Three: Three(x=123, y="hi", z=yes)'
54 assert choose_text(Foo.Four(1,2,3,4)) == "Four"
55 assert choose_text(Foo.Last("XX")) == 'else: Last("XX")'
57 i := 1
58 cases := [Foo.One(1), Foo.One(2), Foo.Zero]
59 repeat when cases[i]! is One(x)
60 >> x
61 i += 1
62 else stop
64 assert [
66 when x is One(y), Two(y,_)
67 "Small $y"
68 is Zero
69 "Zero"
70 else
71 "Other"
72 ) for x in [Foo.Zero, Foo.One(1), Foo.Two(2,2), Foo.Three(3,"",no)]
73 ] == ["Zero", "Small 1", "Small 2", "Other"]
75 expr := when cases[1]! is One(y)
76 y + 1
77 else
78 -1
79 assert expr == 2
81 >> enum_arg_function(Zero)
82 >> enum_arg_function(Two(2,3))
84 do
85 e : enum(One, Two) = One
86 >> e
87 >> e = Two
88 >> when e is One
89 say("one")
90 is Two
91 say("two")
93 assert enum_return_function(0) == Zero
94 assert enum_return_function(1) == One
95 assert enum_return_function(2) == Many
97 assert EnumFields(A) == EnumFields(x=A)
99 do
100 e := OnlyTags.A
101 assert e.A == OnlyTags.A.A
102 assert e.B == none
105 e := Foo.Zero
106 assert e.Zero == Foo.Zero.Zero
107 assert e.One == none
108 assert e.Two == none
110 ep := @Foo.Zero
111 assert ep.Zero == Foo.Zero.Zero
112 assert ep.One == none
113 assert ep.Two == none
116 e := Foo.Two(123, 456)
117 assert e.Zero == none
118 assert e.One == none
119 assert e.Two != none
121 ep := Foo.Two(123, 456)
122 assert ep.Zero == none
123 assert ep.One == none
124 assert ep.Two != none
126 two := e.Two!
127 when e is Two(x,y)
128 assert two.x == x
129 assert two.y == y
130 else fail("Unreachable")