package underscore

// Zip joins two slices together so all the elements of left slice are attached to the corresponding
// elements of the right slice, i.e. [one two three] [1 2 3 4] = [{one, 1} {two, 2} {three, 3}]
// the returned data will be the size of the smallest slice
func Zip[L any, R any](left []L, right []R) []Tuple[L, R] {
	shortest := 0
	if len(left) < len(right) {
		shortest = len(left)
	} else {
		shortest = len(right)
	}

	results := make([]Tuple[L, R], shortest)
	for i := 0; i < shortest; i++ {
		results[i] = Tuple[L, R]{Left: left[i], Right: right[i]}
	}

	return results
}
