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)
}
