struct Foo[T] {
pub:
	data T
}

fn (f Foo[int]) value() string {
	return f.data.str()
}

type DB = string

struct Repo[T, U] {
	db DB
pub mut:
	model      T
	permission U
}

struct User {
mut:
	name string
}

struct Permission {
pub mut:
	name string
}

fn main() {
	foo_int := Foo[int]{2}
	assert foo_int.value() == '2'
	println(foo_int)
	//
	x := Repo[int, f64]{'abc', 3, 1.5}
	println(x.db)
	println(x.model)
	println(x.permission)
	//
	mut a := Repo[User, Permission]{
		model: User{
			name: 'joe'
		}
	}
	println(a.model.name)
}
