struct Foo {
mut:
	x int
}

struct Bar {
mut:
	y int
}

type Foobar = Foo | Bar

fn mutate_foobar1(mut foobar Foobar) {
	match foobar {
		Foo {
			mutate_foo(mut foobar)
		}
		Bar {
			mutate_bar(mut foobar)
		}
	}
}

fn mutate_foobar2(mut foobar Foobar) int {
	return match foobar {
		Foo {
			mutate_foo(mut foobar)
		}
		Bar {
			mutate_bar(mut foobar)
		}
	}
}

fn mutate_foo(mut foo Foo) int {
	foo.x = 5
	return 5
}

fn mutate_bar(mut bar Bar) int {
	bar.y = 10
	return 10
}

fn main() {
	mut bar := Bar{y: 0}
	mutate_foobar1(mut bar)
	mutate_foobar2(mut bar)
}
