package slice

func RemoveRepeatElement[T comparable](elements []T) []T {
	if elements == nil || len(elements) == 0 {
		return elements
	}

	result := make([]T, 0)
	tempMap := make(map[T]interface{})
	for _, element := range elements {
		l := len(tempMap)
		tempMap[element] = nil

		if len(tempMap) != l {
			result = append(result, element)
		}
	}

	return result
}

func ToMap[S any, K comparable, V any](slice []S, fn func(sliceValue S) (K, V, error)) (map[K]V, error) {
	m := make(map[K]V, len(slice))
	for _, v := range slice {
		key, value, err := fn(v)
		if err != nil {
			return nil, err
		}

		m[key] = value
	}

	return m, nil
}

func ExtractValue[T any, R any](s []T, addTo func(v T) (R, bool)) []R {
	retSlice := make([]R, 0)

	for _, v := range s {
		retValue, add := addTo(v)
		if add {
			retSlice = append(retSlice, retValue)
		}
	}

	return retSlice
}