// 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
	tbFunc  // func(T) 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
	Remove          = tbFunc  // func(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 tbFunc: // func(T) bool
		if ni == 1 && no == 1 && t.Out(0) == boolType {
			return true
		}
	case trFunc: // func(T) R
		if ni == 1 && no == 1 {
			return true
		}
	}
	return false
}
