package utils

// Intersect returns a new slice containing the elements that are present in both input slices.
// This provides a more efficient solution than using two nested loops.
func Intersect[T comparable, Slice ~[]T](slice1 Slice, slice2 Slice) Slice {
	var result Slice
	seen := map[T]struct{}{}

	for i := range slice1 {
		seen[slice1[i]] = struct{}{}
	}

	for i := range slice2 {
		if _, ok := seen[slice2[i]]; ok {
			result = append(result, slice2[i])
		}
	}

	return result
}

// Slice returns a slice of the first n elements in slice like javascript's slice.
func Slice[T any](slice []T, n int) []T {
	if n >= len(slice) {
		return slice
	}
	return slice[:n]
}