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  }