1// Copyright 2017, The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE.md file. 4 5// Package function identifies function types. 6package function 7 8import "reflect" 9 10type funcType int 11 12const ( 13 _ funcType = iota 14 15 ttbFunc // func(T, T) bool 16 tibFunc // func(T, I) bool 17 trFunc // func(T) R 18 19 Equal = ttbFunc // func(T, T) bool 20 EqualAssignable = tibFunc // func(T, I) bool; encapsulates func(T, T) bool 21 Transformer = trFunc // func(T) R 22 ValueFilter = ttbFunc // func(T, T) bool 23 Less = ttbFunc // func(T, T) bool 24) 25 26var boolType = reflect.TypeOf(true) 27 28// IsType reports whether the reflect.Type is of the specified function type. 29func IsType(t reflect.Type, ft funcType) bool { 30 if t == nil || t.Kind() != reflect.Func || t.IsVariadic() { 31 return false 32 } 33 ni, no := t.NumIn(), t.NumOut() 34 switch ft { 35 case ttbFunc: // func(T, T) bool 36 if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType { 37 return true 38 } 39 case tibFunc: // func(T, I) bool 40 if ni == 2 && no == 1 && t.In(0).AssignableTo(t.In(1)) && t.Out(0) == boolType { 41 return true 42 } 43 case trFunc: // func(T) R 44 if ni == 1 && no == 1 { 45 return true 46 } 47 } 48 return false 49} 50