func Contains[T comparable](s []T, v T) bool {
	return Index[T](s, v) != -1
}
Contains reports whether v is present in s.
package slices
import "golang.design/x/go2generics/std/constraints"  
func Equal[T comparable](s1, s2 []T) bool {
	if len(s1) != len(s2) {
		return false
	}
	for i := range s1 {
		if s1[i] != s2[i] {
			return false
		}
	}
	return true
}
func EqualFunc[T1, T2 any](s1 []T1, s2 []T2, eq func(T1, T2) bool) bool {
	if len(s1) != len(s2) {
		return false
	}
	for i := range s1 {
		if !eq(s1[i], s2[i]) {
			return false
		}
	}
	return true
}
func Compare[T constraints.Ordered](s1, s2 []T) int {
	min := func(a, b int) int {
		if a < b {
			return a
		}
		return b
	}
	l := min(len(s1), len(s2))
	for i := 0; i < l; i++ {
		switch {
		case s1[i] == s2[i]:
			continue
		case s1[i] < s2[i]:
			return -1
		case s1[i] > s2[i]:
			return 1
		}
	}
	switch {
	case l == len(s1) && l == len(s2):
		return 0
	case l < len(s1):  
		return 1
	case l < len(s2):  
		fallthrough
	default:
		return -1
	}
}
func CompareFunc[T any](s1, s2 []T, cmp func(T, T) int) int {
	min := func(a, b int) int {
		if a < b {
			return a
		}
		return b
	}
	l := min(len(s1), len(s2))
	for i := 0; i < l; i++ {
		switch cmp(s1[i], s2[i]) {
		case 0:
			continue
		case -1:
			return -1
		case 1:
			return 1
		}
	}
	switch {
	case l == len(s1) && l == len(s2):
		return 0
	case l < len(s1):  
		return 1
	case l < len(s2):  
		fallthrough
	default:
		return -1
	}
}
func Index[T comparable](s []T, v T) int {
	for i := range s {
		if v == s[i] {
			return i
		}
	}
	return -1
}
func IndexFunc[T any](s []T, f func(T) bool) int {
	for i := range s {
		if f(s[i]) {
			return i
		}
	}
	return -1
}