// Package generics contains the new syntax supporting generic ...
PACKAGE generics

IMPORTPATH
	testdata/generics

FILENAMES
	testdata/generics.go

FUNCTIONS
	// AnotherFunc has an implicit constraint interface.  Neither type ...
	func AnotherFunc[T ~struct{ f int }](_ struct{ f int })

	// Func has an instantiated constraint. 
	func Func[T Constraint[string, Type[int]]]()

	// Single is not a factory function. 
	func Single[T any]() *T

	// Slice is not a factory function. 
	func Slice[T any]() []T


TYPES
	// AFuncType demonstrates filtering of parameters and type ...
	type AFuncType[T ~struct{ f int }] func(_ struct {
		// contains filtered or unexported fields
	})

	// Constraint is a constraint interface with two type parameters. 
	type Constraint[P, Q interface{ string | ~int | Type[int] }] interface {
		~int | ~byte | Type[string]
		M() P
	}

	// NewEmbeddings demonstrates how we filter the new embedded ...
	type NewEmbeddings interface {
		string	// should not be filtered
	
		struct {
			// contains filtered or unexported fields
		}
		~struct {
			// contains filtered or unexported fields
		}
		*struct {
			// contains filtered or unexported fields
		}
		struct {
			// contains filtered or unexported fields
		} | ~struct {
			// contains filtered or unexported fields
		}
		// contains filtered or unexported methods
	}

	// Parameterized types should be shown. 
	type Type[P any] struct {
		Field P
	}

	// Variables with an instantiated type should be shown. 
	var X Type[int]

	// Constructors for parameterized types should be shown. 
	func Constructor[lowerCase any]() Type[lowerCase]

	// MethodA uses a different name for its receiver type parameter. 
	func (t Type[A]) MethodA(p A)

	// MethodB has a blank receiver type parameter. 
	func (t Type[_]) MethodB()

	// MethodC has a lower-case receiver type parameter. 
	func (t Type[c]) MethodC()

