github.com/tawesoft/golib/v2@v2.10.0/legacy/operator/bool.go (about) 1 package operator 2 3 type boolUnary struct { 4 True func(bool) bool 5 False func(bool) bool 6 Identity func(bool) bool 7 Not func(bool) bool 8 } 9 10 type boolBinary struct{ 11 True func(bool, bool) bool // always returns true 12 False func(bool, bool) bool // always returns false 13 P func(bool, bool) bool // for (p, q) returns p 14 Q func(bool, bool) bool // for (p, q) returns q 15 NotP func(bool, bool) bool // for (p, q) returns ¬ p 16 NotQ func(bool, bool) bool // for (p, q) returns ¬ q 17 Eq func(bool, bool) bool // same as XNOR 18 Neq func(bool, bool) bool // same as XOR 19 And func(bool, bool) bool 20 Nand func(bool, bool) bool 21 Or func(bool, bool) bool 22 Nor func(bool, bool) bool 23 Xor func(bool, bool) bool // same as Neq 24 Xnor func(bool, bool) bool // same as Eq 25 Implies func(bool, bool) bool // for (p, q) returns p -> q 26 NonImplies func(bool, bool) bool // non implication; for (p, q) returns ¬ (p -> q) 27 ConImplies func(bool, bool) bool // converse implies; for (p, q) returns (q -> p) 28 ConNonImplies func(bool, bool) bool // converse not implies; for (p, q) returns ¬ (q -> p) 29 } 30 31 type boolNary struct{ 32 True func(...bool) bool // always returns true 33 False func(...bool) bool // always returns false 34 35 All func(...bool) bool // returns true if all are true a.k.a. a AND b AND c ... 36 Any func(...bool) bool // returns true if any are true a.k.a. a OR b OR c 37 None func(...bool) bool // returns true if none are true (all are false) 38 } 39 40 // Bool implements operations on one (unary), two (binary), or many (nary) arguments of type bool. 41 var Bool = struct { 42 Unary boolUnary 43 Binary boolBinary 44 Nary boolNary 45 }{ 46 Unary: boolUnary{ 47 True: func(_ bool) bool { return true}, 48 False: func(_ bool) bool { return false}, 49 Identity: func(p bool) bool { return p }, 50 Not: func(p bool) bool { return !p }, 51 }, 52 53 Binary: boolBinary{ 54 True: func(_ bool, _ bool) bool { return true }, 55 False: func(_ bool, _ bool) bool { return false }, 56 P: func(p bool, _ bool) bool { return p }, 57 Q: func(_ bool, q bool) bool { return q }, 58 NotP: func(p bool, _ bool) bool { return !p }, 59 NotQ: func(_ bool, q bool) bool { return !q }, 60 Eq: func(p bool, q bool) bool { return p == q }, 61 Neq: func(p bool, q bool) bool { return p != q }, 62 And: func(p bool, q bool) bool { return p && q }, 63 Nand: func(p bool, q bool) bool { return !(p && q) }, 64 Or: func(p bool, q bool) bool { return p || q }, 65 Nor: func(p bool, q bool) bool { return !(p || q) }, 66 Xor: func(p bool, q bool) bool { return p != q }, 67 Xnor: func(p bool, q bool) bool { return p == q }, 68 Implies: func(p bool, q bool) bool { return (!p) || q }, 69 NonImplies: func(p bool, q bool) bool { return p && (!q) }, 70 ConImplies: func(p bool, q bool) bool { return (!q) || p }, 71 ConNonImplies: func(p bool, q bool) bool { return q && (!p) }, 72 }, 73 74 Nary: boolNary{ 75 True: func(_...bool) bool { return true }, 76 False: func(_...bool) bool { return false }, 77 All: boolNaryAll1, 78 Any: boolNaryAny1, 79 None: boolNaryNone1, 80 }, 81 } 82 83 func boolNaryAll1(p...bool) bool { 84 for i := 0; i < len(p); i++ { 85 if !p[i] { return false } 86 } 87 return true 88 } 89 90 func boolNaryAll2(p...bool) (result bool) { 91 result = true 92 for i := 0; i < len(p); i++ { 93 result = result && p[i] 94 } 95 return result 96 } 97 98 func boolNaryAny1(p...bool) bool { 99 for i := 0; i < len(p); i++ { 100 if p[i] { return true } 101 } 102 return false 103 } 104 105 func boolNaryAny2(p...bool) (result bool) { 106 for i := 0; i < len(p); i++ { 107 result = result || p[i] 108 } 109 return result 110 } 111 112 func boolNaryNone1(p...bool) bool { 113 for i := 0; i < len(p); i++ { 114 if p[i] { return false } 115 } 116 return true 117 } 118 119 func boolNaryNone2(p...bool) (result bool) { 120 result = false 121 for i := 0; i < len(p); i++ { 122 result = result || p[i] 123 } 124 return !result 125 } 126