mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-04 21:02:27 +08:00
78 lines
2.2 KiB
Go
78 lines
2.2 KiB
Go
// Copyright 2021 dudaodong@gmail.com. All rights reserved.
|
|
// Use of this source code is governed by MIT license
|
|
|
|
// Package condition contains some functions for conditional judgment. eg. And, Or, TernaryOperator ...
|
|
// The implementation of this package refers to the implementation of carlmjohnson's truthy package, you may find more
|
|
// useful information in truthy(https://github.com/carlmjohnson/truthy), thanks carlmjohnson.
|
|
package condition
|
|
|
|
import "reflect"
|
|
|
|
// Bool returns the truthy value of anything.
|
|
// If the value's type has a Bool() bool method, the method is called and returned.
|
|
// If the type has an IsZero() bool method, the opposite value is returned.
|
|
// Slices and maps are truthy if they have a length greater than zero.
|
|
// All other types are truthy if they are not their zero value.
|
|
func Bool[T any](value T) bool {
|
|
switch m := any(value).(type) {
|
|
case interface{ Bool() bool }:
|
|
return m.Bool()
|
|
case interface{ IsZero() bool }:
|
|
return !m.IsZero()
|
|
}
|
|
return reflectValue(&value)
|
|
}
|
|
|
|
func reflectValue(vp any) bool {
|
|
switch rv := reflect.ValueOf(vp).Elem(); rv.Kind() {
|
|
case reflect.Map, reflect.Slice:
|
|
return rv.Len() != 0
|
|
default:
|
|
is := rv.IsZero()
|
|
return !is
|
|
}
|
|
}
|
|
|
|
// And returns true if both a and b are truthy.
|
|
func And[T, U any](a T, b U) bool {
|
|
return Bool(a) && Bool(b)
|
|
}
|
|
|
|
// Or returns false iff neither a nor b is truthy.
|
|
func Or[T, U any](a T, b U) bool {
|
|
return Bool(a) || Bool(b)
|
|
}
|
|
|
|
// Xor returns true iff a or b but not both is truthy.
|
|
func Xor[T, U any](a T, b U) bool {
|
|
valA := Bool(a)
|
|
valB := Bool(b)
|
|
return (valA || valB) && valA != valB
|
|
}
|
|
|
|
// Nor returns true iff neither a nor b is truthy.
|
|
func Nor[T, U any](a T, b U) bool {
|
|
return !(Bool(a) || Bool(b))
|
|
}
|
|
|
|
// Xnor returns true iff both a and b or neither a nor b are truthy.
|
|
func Xnor[T, U any](a T, b U) bool {
|
|
valA := Bool(a)
|
|
valB := Bool(b)
|
|
return (valA && valB) || (!valA && !valB)
|
|
}
|
|
|
|
// Nand returns false iff both a and b are truthy.
|
|
func Nand[T, U any](a T, b U) bool {
|
|
return !Bool(a) || !Bool(b)
|
|
}
|
|
|
|
// TernaryOperator if true return trueValue else return falseValue
|
|
func TernaryOperator[T any](isTrue bool, trueValue T, falseValue T) T {
|
|
if isTrue {
|
|
return trueValue
|
|
} else {
|
|
return falseValue
|
|
}
|
|
}
|