github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/gnovm/stdlibs/stdshim/addr_set.gno (about)

     1  package std
     2  
     3  import "errors"
     4  
     5  //----------------------------------------
     6  // AddressSet
     7  
     8  type AddressSet interface {
     9  	Size() int
    10  	AddAddress(Address) error
    11  	HasAddress(Address) bool
    12  }
    13  
    14  //----------------------------------------
    15  // AddressList implements AddressSet.
    16  // TODO implement AddressTree with avl.
    17  
    18  type AddressList []Address
    19  
    20  func NewAddressList() *AddressList {
    21  	return &AddressList{}
    22  }
    23  
    24  func (alist *AddressList) Size() int {
    25  	return len(*alist)
    26  }
    27  
    28  func (alist *AddressList) AddAddress(newAddr Address) error {
    29  	// TODO optimize with binary algorithm
    30  	for _, addr := range *alist {
    31  		if addr == newAddr {
    32  			return errors.New("address already exists")
    33  		}
    34  	}
    35  	*alist = append(*alist, newAddr)
    36  	return nil
    37  }
    38  
    39  func (alist *AddressList) HasAddress(newAddr Address) bool {
    40  	// TODO optimize with binary algorithm
    41  	for _, addr := range *alist {
    42  		if addr == newAddr {
    43  			return true
    44  		}
    45  	}
    46  	return false
    47  }