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 }