github.com/searKing/golang/go@v1.2.74/boolean/operation.go (about)

     1  // Copyright 2020 The searKing Author. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package boolean
     6  
     7  import (
     8  	"github.com/searKing/golang/go/container/slice"
     9  	"github.com/searKing/golang/go/util/object"
    10  )
    11  
    12  // https://en.wikipedia.org/wiki/Boolean_operation
    13  
    14  func xor(a, b bool) bool {
    15  	return a != b
    16  }
    17  func xnor(a, b bool) bool {
    18  	return !xor(a, b)
    19  }
    20  func or(a, b bool) bool {
    21  	return a || b
    22  }
    23  func and(a, b bool) bool {
    24  	return a && b
    25  }
    26  
    27  func RelationFunc(a, b interface{}, f func(a, b interface{}) interface{}, c ...interface{}) interface{} {
    28  	object.RequireNonNil(f)
    29  	if c == nil || len(c) == 0 {
    30  		return f(a, b)
    31  	}
    32  	return RelationFunc(f(a, b), c[0], f, c[1:]...)
    33  }
    34  func BoolFunc(a bool, b bool, f func(a, b bool) bool, c ...bool) bool {
    35  
    36  	return RelationFunc(a, b, func(a, b interface{}) interface{} {
    37  		return f(a.(bool), b.(bool))
    38  	}, slice.Of(c)...).(bool)
    39  	object.RequireNonNil(f)
    40  	if c == nil || len(c) == 0 {
    41  		return f(a, b)
    42  	}
    43  	return BoolFunc(f(a, b), c[0], f, c[1:]...)
    44  }
    45  
    46  // XOR return a^b^c...
    47  func XOR(a bool, b bool, c ...bool) bool {
    48  	return BoolFunc(a, b, xor, c...)
    49  }
    50  
    51  // XNOR return a xnor b xnor c...
    52  func XNOR(a bool, b bool, c ...bool) bool {
    53  	return BoolFunc(a, b, xnor, c...)
    54  }
    55  
    56  // OR return a|b|c...
    57  func OR(a bool, b bool, c ...bool) bool {
    58  	return BoolFunc(a, b, or, c...)
    59  }
    60  
    61  // AND return a&b&c...
    62  func AND(a bool, b bool, c ...bool) bool {
    63  	return BoolFunc(a, b, and, c...)
    64  }