package lintutil

import (
	"go/ast"

	"github.com/go-toolsmith/astequal"
)

// AstSet is a simple ast.Node set.
// Zero value is ready to use set.
// Can be reused after Clear call.
type AstSet struct {
	items []ast.Node
}

// Contains reports whether s contains x.
func (s *AstSet) Contains(x ast.Node) bool {
	for i := range s.items {
		if astequal.Node(s.items[i], x) {
			return true
		}
	}
	return false
}

// Insert pushes x in s if it's not already there.
// Returns true if element was inserted.
func (s *AstSet) Insert(x ast.Node) bool {
	if s.Contains(x) {
		return false
	}
	s.items = append(s.items, x)
	return true
}

// Clear removes all element from set.
func (s *AstSet) Clear() {
	s.items = s.items[:0]
}

// Len returns the number of elements contained inside s.
func (s *AstSet) Len() int {
	return len(s.items)
}