83 lines
1.2 KiB
Plaintext
83 lines
1.2 KiB
Plaintext
BasicError :: enum {
|
|
bad
|
|
worse
|
|
}
|
|
|
|
DetailError :: union(enum) {
|
|
code i32
|
|
empty void
|
|
}
|
|
|
|
Left :: enum {
|
|
left
|
|
}
|
|
|
|
Right :: enum {
|
|
right
|
|
}
|
|
|
|
Both :: alias Left | Right
|
|
|
|
BoxA :: union(enum) {
|
|
a i32
|
|
}
|
|
|
|
BoxB :: union(enum) {
|
|
b void
|
|
}
|
|
|
|
Box :: alias BoxA | BoxB
|
|
|
|
maybe :: func(value i32) i32 ! BasicError {
|
|
if (value == 0) return .bad
|
|
return value + 1
|
|
}
|
|
|
|
via_try :: func(value i32) i32 ! BasicError {
|
|
unwrapped :: try maybe(value)
|
|
return unwrapped + 1
|
|
}
|
|
|
|
with_detail :: func(value i32) i32 ! DetailError {
|
|
if (value == 0) return DetailError{ code = 5 }
|
|
if (value == 1) return .empty
|
|
return value
|
|
}
|
|
|
|
pick :: func(value Both) i32 {
|
|
match value {
|
|
.left: return 10
|
|
.right: return 20
|
|
}
|
|
}
|
|
|
|
payload :: func(value Box) i32 {
|
|
match value {
|
|
.a |n|: return n
|
|
.b: return 3
|
|
}
|
|
}
|
|
|
|
main :: func() i32 {
|
|
acc i32 = 0
|
|
|
|
a :: maybe(0) catch 7
|
|
b :: maybe(4) catch 99
|
|
c :: via_try(3) catch 99
|
|
d :: via_try(0) catch 11
|
|
e :: with_detail(0) catch 13
|
|
f :: with_detail(2) catch 99
|
|
|
|
acc = acc + a + b + c + d + e + f
|
|
acc = acc + pick(.left)
|
|
r Right = .right
|
|
acc = acc + pick(r)
|
|
box BoxA = BoxA{ a = 8 }
|
|
acc = acc + payload(box)
|
|
empty BoxB = .b
|
|
acc = acc + payload(empty)
|
|
|
|
# 7 + 5 + 5 + 11 + 13 + 2 + 10 + 20 + 8 + 3 = 84
|
|
return acc - 84
|
|
}
|