72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
|
package aghstrings
|
||
|
|
||
|
// unit is a convenient alias for struct{}
|
||
|
type unit = struct{}
|
||
|
|
||
|
// Set is a set of strings.
|
||
|
type Set struct {
|
||
|
m map[string]unit
|
||
|
}
|
||
|
|
||
|
// NewSet returns a new string set containing strs.
|
||
|
func NewSet(strs ...string) (set *Set) {
|
||
|
set = &Set{
|
||
|
m: make(map[string]unit, len(strs)),
|
||
|
}
|
||
|
|
||
|
for _, s := range strs {
|
||
|
set.Add(s)
|
||
|
}
|
||
|
|
||
|
return set
|
||
|
}
|
||
|
|
||
|
// Add adds s to the set. Add panics if the set is a nil set, just like a nil
|
||
|
// map does.
|
||
|
func (set *Set) Add(s string) {
|
||
|
set.m[s] = unit{}
|
||
|
}
|
||
|
|
||
|
// Del deletes s from the set. Calling Del on a nil set has no effect, just
|
||
|
// like delete on an empty map doesn't.
|
||
|
func (set *Set) Del(s string) {
|
||
|
if set != nil {
|
||
|
delete(set.m, s)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Has returns true if s is in the set. Calling Has on a nil set returns false,
|
||
|
// just like indexing on an empty map does.
|
||
|
func (set *Set) Has(s string) (ok bool) {
|
||
|
if set != nil {
|
||
|
_, ok = set.m[s]
|
||
|
}
|
||
|
|
||
|
return ok
|
||
|
}
|
||
|
|
||
|
// Len returns the length of the set. A nil set has a length of zero, just like
|
||
|
// an empty map.
|
||
|
func (set *Set) Len() (n int) {
|
||
|
if set == nil {
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
return len(set.m)
|
||
|
}
|
||
|
|
||
|
// Values returns all values in the set. The order of the values is undefined.
|
||
|
// Values returns nil if the set is nil.
|
||
|
func (set *Set) Values() (strs []string) {
|
||
|
if set == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
strs = make([]string, 0, len(set.m))
|
||
|
for s := range set.m {
|
||
|
strs = append(strs, s)
|
||
|
}
|
||
|
|
||
|
return strs
|
||
|
}
|