github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/isc/setobj.go (about)

     1  package isc
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  type ISCSet[T comparable] map[T]struct{}
     8  
     9  // NewSet 初始化并指定存储对象的类型
    10  func NewSet[T comparable]() ISCSet[T] {
    11  	return ISCSet[T]{}
    12  }
    13  
    14  func NewSetWithList[T comparable](list []T) ISCSet[T] {
    15  	s := ISCSet[T]{}
    16  	s.AddAll(list...)
    17  	return s
    18  }
    19  
    20  func NewSetWithItems[T comparable](items ...T) ISCSet[T] {
    21  	s := ISCSet[T]{}
    22  	s.AddAll(items...)
    23  	return s
    24  }
    25  
    26  // Size 返回数据数量
    27  func (s ISCSet[T]) Size() int {
    28  	return len(s)
    29  }
    30  
    31  // Add 添加元素
    32  func (s *ISCSet[T]) Add(item T) error {
    33  	if !s.Contains(item) {
    34  		(*s)[item] = struct{}{}
    35  		return nil
    36  	} else {
    37  		return fmt.Errorf("%v already exists in set", item)
    38  	}
    39  }
    40  
    41  // AddAll 添加多个元素
    42  func (s *ISCSet[T]) AddAll(items ...T) {
    43  	for _, item := range items {
    44  		_ = s.Add(item)
    45  	}
    46  }
    47  
    48  // Delete 删除指定Key元素
    49  func (s *ISCSet[T]) Delete(item T) error {
    50  	if s.Contains(item) {
    51  		delete(*s, item)
    52  		return nil
    53  	} else {
    54  		return fmt.Errorf("%v not exists in set", item)
    55  	}
    56  }
    57  
    58  // Contains 判断key是否存在
    59  func (s ISCSet[T]) Contains(item T) bool {
    60  	_, ok := s[item]
    61  	return ok
    62  }
    63  
    64  // Clear 重置
    65  func (s *ISCSet[T]) Clear() {
    66  	*s = ISCSet[T]{}
    67  }
    68  
    69  func (s ISCSet[T]) ToList() ISCList[T] {
    70  	res := NewList[T]()
    71  	for k := range s {
    72  		res.Add(k)
    73  	}
    74  	return res
    75  }