feat: now simple users can only occupy one seat at a time
parent
66ea45b0a8
commit
9b6c7f4a55
@ -0,0 +1,77 @@
|
||||
package util
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
type present struct{}
|
||||
|
||||
// Waiting for Go 18...
|
||||
// type Set[T comparable] map[T]present
|
||||
type StringSet map[string]present
|
||||
|
||||
func NewStringSet(elements ...string) StringSet {
|
||||
set := StringSet{}
|
||||
|
||||
for _, elem := range elements {
|
||||
set.Add(elem)
|
||||
}
|
||||
|
||||
return set
|
||||
}
|
||||
|
||||
func (set StringSet) Has(value string) bool {
|
||||
_, present := set[value]
|
||||
return present
|
||||
}
|
||||
|
||||
func (set StringSet) HasAny(values ...string) bool {
|
||||
for _, value := range values {
|
||||
if _, present := set[value]; present {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (set StringSet) Contains(other StringSet) bool {
|
||||
for v := range other {
|
||||
if !set.Has(v) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (set StringSet) Add(value string) {
|
||||
set[value] = present{}
|
||||
}
|
||||
|
||||
func (set StringSet) Remove(value string) {
|
||||
delete(set, value)
|
||||
}
|
||||
|
||||
func (set StringSet) Elements() []string {
|
||||
elements := []string{}
|
||||
|
||||
for elem := range set {
|
||||
elements = append(elements, elem)
|
||||
}
|
||||
|
||||
return elements
|
||||
}
|
||||
|
||||
func (set StringSet) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(set.Elements())
|
||||
}
|
||||
|
||||
func (set StringSet) UnmarshalJSON(data []byte) error {
|
||||
elements := []string{}
|
||||
if err := json.Unmarshal(data, &elements); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, v := range elements {
|
||||
set.Add(v)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue