github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/keyset/keyset_one.go (about) 1 // Copyright 2020 Insolar Network Ltd. 2 // All rights reserved. 3 // This material is licensed under the Insolar License version 1.0, 4 // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md. 5 6 package keyset 7 8 // creates an immutable set with a single key 9 func SoloKeySet(k Key) KeySet { 10 return oneKeySet{k} 11 } 12 13 var _ KeyList = oneKeySet{} 14 15 type oneKeySet struct { 16 key Key 17 } 18 19 func (v oneKeySet) EnumKeys(fn func(k Key) bool) bool { 20 return fn(v.key) 21 } 22 23 func (v oneKeySet) Count() int { 24 return 1 25 } 26 27 func (v oneKeySet) EnumRawKeys(fn func(k Key, exclusive bool) bool) bool { 28 return fn(v.key, false) 29 } 30 31 func (v oneKeySet) RawKeyCount() int { 32 return 1 33 } 34 35 func (v oneKeySet) IsNothing() bool { 36 return false 37 } 38 39 func (v oneKeySet) IsEverything() bool { 40 return false 41 } 42 43 func (v oneKeySet) IsOpenSet() bool { 44 return false 45 } 46 47 func (v oneKeySet) Contains(k Key) bool { 48 return v.key == k 49 } 50 51 func (v oneKeySet) ContainsAny(ks KeySet) bool { 52 return ks.Contains(v.key) 53 } 54 55 func (v oneKeySet) SupersetOf(ks KeySet) bool { 56 if ks.IsOpenSet() { 57 return false 58 } 59 60 switch ks.RawKeyCount() { 61 case 0: 62 return true 63 case 1: 64 return ks.Contains(v.key) 65 default: 66 return false 67 } 68 } 69 70 func (v oneKeySet) SubsetOf(ks KeySet) bool { 71 return ks.Contains(v.key) 72 } 73 74 func (v oneKeySet) Equal(ks KeySet) bool { 75 if ks.IsOpenSet() || v.RawKeyCount() != ks.RawKeyCount() { 76 return false 77 } 78 return ks.Contains(v.key) 79 } 80 81 func (v oneKeySet) EqualInverse(ks KeySet) bool { 82 if !ks.IsOpenSet() || v.RawKeyCount() != ks.RawKeyCount() { 83 return false 84 } 85 return !ks.Contains(v.key) 86 } 87 88 func (v oneKeySet) Inverse() KeySet { 89 return exclusiveKeySet{basicKeySet{v.key: {}}} 90 } 91 92 func (v oneKeySet) Union(ks KeySet) KeySet { 93 switch { 94 case ks.Contains(v.key): 95 return ks 96 case ks.IsOpenSet(): 97 switch ks.RawKeyCount() { 98 case 0: 99 panic("illegal state") 100 case 1: 101 return Everything() 102 } 103 return ks.Union(v) 104 105 case ks.RawKeyCount() == 0: 106 return v 107 } 108 return inclusiveKeySet{keyUnion(basicKeySet{v.key: {}}, ks)} 109 } 110 111 func (v oneKeySet) Intersect(ks KeySet) KeySet { 112 switch { 113 case ks.Contains(v.key): 114 return v 115 case ks.RawKeyCount() == 0: 116 return ks 117 default: 118 return Nothing() 119 } 120 } 121 122 func (v oneKeySet) Subtract(ks KeySet) KeySet { 123 if ks.Contains(v.key) { 124 return Nothing() 125 } 126 return v 127 }