You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.2 KiB
49 lines
1.2 KiB
// Copyright 2017, The Go Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE.md file. |
|
|
|
// Package function identifies function types. |
|
package function |
|
|
|
import "reflect" |
|
|
|
type funcType int |
|
|
|
const ( |
|
_ funcType = iota |
|
|
|
ttbFunc // func(T, T) bool |
|
tibFunc // func(T, I) bool |
|
trFunc // func(T) R |
|
|
|
Equal = ttbFunc // func(T, T) bool |
|
EqualAssignable = tibFunc // func(T, I) bool; encapsulates func(T, T) bool |
|
Transformer = trFunc // func(T) R |
|
ValueFilter = ttbFunc // func(T, T) bool |
|
Less = ttbFunc // func(T, T) bool |
|
) |
|
|
|
var boolType = reflect.TypeOf(true) |
|
|
|
// IsType reports whether the reflect.Type is of the specified function type. |
|
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 ttbFunc: // func(T, T) bool |
|
if ni == 2 && no == 1 && t.In(0) == t.In(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 |
|
}
|
|
|