kinds.mx raw

   1  package kind
   2  
   3  import (
   4  	"smesh.lol/pkg/nostr/ints"
   5  	"smesh.lol/pkg/lol/chk"
   6  	"smesh.lol/pkg/lol/errorf"
   7  )
   8  
   9  type S struct {
  10  	K []*K
  11  }
  12  
  13  func NewS(k ...*K) *S { return &S{k} }
  14  
  15  func NewWithCap(c int) *S { return &S{[]*K{:0:c}} }
  16  
  17  func FromIntSlice(is []int) (k *S) {
  18  	k = &S{}
  19  	for i := range is {
  20  		k.K = append(k.K, New(uint16(is[i])))
  21  	}
  22  	return
  23  }
  24  
  25  func (k *S) Len() int {
  26  	if k == nil {
  27  		return 0
  28  	}
  29  	return len(k.K)
  30  }
  31  
  32  func (k *S) Less(i, j int) bool { return k.K[i].K < k.K[j].K }
  33  
  34  func (k *S) Swap(i, j int) {
  35  	k.K[i].K, k.K[j].K = k.K[j].K, k.K[i].K
  36  }
  37  
  38  func (k *S) ToUint16() (o []uint16) {
  39  	for i := range k.K {
  40  		o = append(o, k.K[i].ToU16())
  41  	}
  42  	return
  43  }
  44  
  45  func (k *S) Clone() (c *S) {
  46  	c = &S{K: []*K{:len(k.K)}}
  47  	for i := range k.K {
  48  		c.K[i] = k.K[i]
  49  	}
  50  	return
  51  }
  52  
  53  func (k *S) Contains(s uint16) bool {
  54  	for i := range k.K {
  55  		if k.K[i].Equal(s) {
  56  			return true
  57  		}
  58  	}
  59  	return false
  60  }
  61  
  62  func (k *S) Equals(t1 *S) bool {
  63  	if len(k.K) != len(t1.K) {
  64  		return false
  65  	}
  66  	for i := range k.K {
  67  		if k.K[i] != t1.K[i] {
  68  			return false
  69  		}
  70  	}
  71  	return true
  72  }
  73  
  74  func (k *S) Marshal(dst []byte) (b []byte) {
  75  	b = dst
  76  	b = append(b, '[')
  77  	for i := range k.K {
  78  		b = k.K[i].Marshal(b)
  79  		if i != len(k.K)-1 {
  80  			b = append(b, ',')
  81  		}
  82  	}
  83  	b = append(b, ']')
  84  	return
  85  }
  86  
  87  func (k *S) Unmarshal(b []byte) (r []byte, err error) {
  88  	r = b
  89  	var openedBracket bool
  90  	for ; len(r) > 0; r = r[1:] {
  91  		if !openedBracket && r[0] == '[' {
  92  			openedBracket = true
  93  			continue
  94  		} else if openedBracket {
  95  			if r[0] == ']' {
  96  				return
  97  			} else if r[0] == ',' {
  98  				continue
  99  			}
 100  			kk := ints.New(0)
 101  			if r, err = kk.Unmarshal(r); chk.E(err) {
 102  				return
 103  			}
 104  			k.K = append(k.K, New(kk.Uint16()))
 105  			if r[0] == ']' {
 106  				r = r[1:]
 107  				return
 108  			}
 109  		}
 110  	}
 111  	if !openedBracket {
 112  		return nil, errorf.E([]byte("kinds: failed to unmarshal\n%s\n%s\n%s"), k, b, r)
 113  	}
 114  	return
 115  }
 116  
 117  func (k *S) IsPrivileged() bool {
 118  	for i := range k.K {
 119  		if IsPrivileged(k.K[i].K) {
 120  			return true
 121  		}
 122  	}
 123  	return false
 124  }
 125