package ethutil

type Settable interface {
	AsSet() UniqueSet
}

type Stringable interface {
	String() string
}

type UniqueSet map[string]struct{}

func NewSet(v ...Stringable) UniqueSet {
	set := make(UniqueSet)
	for _, val := range v {
		set.Insert(val)
	}

	return set
}

func (self UniqueSet) Insert(k Stringable) UniqueSet {
	self[k.String()] = struct{}{}

	return self
}

func (self UniqueSet) Include(k Stringable) bool {
	_, ok := self[k.String()]

	return ok
}

func Set(s Settable) UniqueSet {
	return s.AsSet()
}