func IsType(t reflect.Type, ft funcType) bool {
	if t == nil || t.Kind() != reflect.Func || t.IsVariadic() {
		return false
	}
	ni, no := t.NumIn(), t.NumOut()
	switch ft {
	case tbFunc: // func(T) bool
		if ni == 1 && no == 1 && t.Out(0) == boolType {
			return true
		}
	case ttbFunc: // func(T, T) bool
		if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType {
			return true
		}
	case trbFunc: // func(T, R) bool
		if ni == 2 && no == 1 && t.Out(0) == boolType {
			return true
		}
	case tibFunc: // func(T, I) bool
		if ni == 2 && no == 1 && t.In(0).AssignableTo(t.In(1)) && t.Out(0) == boolType {
			return true
		}
	case trFunc: // func(T) R
		if ni == 1 && no == 1 {
			return true
		}
	}
	return false
}
func IsType(t reflect.Type, ft funcType) bool {
	if t == nil || t.Kind() != reflect.Func || t.IsVariadic() {
		return false
	}
	ni, no := t.NumIn(), t.NumOut()
	switch ft {
	case tbFunc: 
		if ni == 1 && no == 1 && t.Out(0) == boolType {
			return true
		}
	case ttbFunc: 
		if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType {
			return true
		}
	case trbFunc: 
		if ni == 2 && no == 1 && t.Out(0) == boolType {
			return true
		}
	case tibFunc: 
		if ni == 2 && no == 1 && t.In(0).AssignableTo(t.In(1)) && t.Out(0) == boolType {
			return true
		}
	case trFunc: 
		if ni == 1 && no == 1 {
			return true
		}
	}
	return false
}
func IsType ( t reflect . Type , ft funcType ) bool { if t == nil || t . Kind ( ) != reflect . Func || t . IsVariadic ( ) { return false } ni , no := t . NumIn ( ) , t . NumOut ( ) switch ft { case tbFunc : // func(T) bool if ni == 1 && no == 1 && t . Out ( 0 ) == boolType { return true } case ttbFunc : // func(T, T) bool if ni == 2 && no == 1 && t . In ( 0 ) == t . In ( 1 ) && t . Out ( 0 ) == boolType { return true } case trbFunc : // func(T, R) bool if ni == 2 && no == 1 && t . Out ( 0 ) == boolType { return true } case tibFunc : // func(T, I) bool if ni == 2 && no == 1 && t . In ( 0 ) . AssignableTo ( t . In ( 1 ) ) && t . Out ( 0 ) == boolType { return true } case trFunc : // func(T) R if ni == 1 && no == 1 { return true } } return false }
// IsType reports whether the reflect.Type is of the specified function type.
IsType reports whether the reflect . Type is of the specified function type .