package slicesutils

func Intersection[T comparable](slices ...[]T) []T {
	counts := map[T]int{}
	result := []T{}

	for _, slice := range slices {
		for _, val := range slice {
			counts[val]++
		}
	}

	for val, count := range counts {
		if count == len(slices) {

			result = append(result, val)

		}
	}

	return result

}

func IntersectionFunc[T any](s1 []T, s2 []T, cmp func(T, T) bool) []T {
	set := make([]T, 0)

	for _, a := range s1 {
		for _, b := range s2 {
			if cmp(a, b) {
				set = append(set, a)
			}
		}
	}

	return set

}