package yu_array

// Merge
//
//	@Description: 合并数组
//	@param args 欲合并的数组
//	@return []T 合并结果
func Merge[T any](args ...[]T) []T {
	j_size := 0
	for _, j_arr := range args {
		j_size += len(j_arr)
	}
	j_buf := make([]T, j_size)
	j_size = 0
	for _, j_arr := range args {
		copy(j_buf[j_size:], j_arr)
		j_size += len(j_arr)
	}
	return j_buf
}

// Insert
func Insert[T any](t []T, i int, item ...T) []T {
	if i < 0 || len(item) == 0 {
		return t
	}
	if len(t) == 0 {
		return item
	}
	if i >= len(t) {
		return append(t, item...)
	}
	j_temp := make([]T, len(t)-i)
	copy(j_temp, t[i:])
	return append(append(t[:i], item...), j_temp...)
}

// Append
func Append[T any](t []T, item ...T) []T {
	if len(item) == 0 {
		return t
	}
	return append(t, item...)
}

// Remove
func Remove[T any](t []T, start int, size int) []T {
	if start < 0 || size < 1 || start+size > len(t) {
		return t
	}
	return append(t[:start], t[start+size:]...)
}

// Index
func Index[T int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | int | uint | uintptr | string](t []T, sub T) int {
	for j_i, j_item := range t {
		if j_item == sub {
			return j_i
		}
	}
	return -1
}

// Xor
//
//	@Description: 异或运算数据，修改原始 data
//	@param data 数据
//	@param key 数据
//	@return []byte 运算后的数据
func Xor[T int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | int | uint | uintptr](data []T, key []T) []T {
	j_buf_len, j_key_len := len(data), len(key)
	if j_buf_len == 0 || j_key_len == 0 {
		return data
	}
	for j_i := 0; j_i < j_buf_len; j_i++ {
		data[j_i] ^= key[j_i%j_key_len]
	}
	return data
}

// XorEx
//
//	@Description: 异或运算数据，不修改原始 data
//	@param data 数据
//	@param key 数据
//	@return []byte 运算后的数据
func XorEx[T int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | int | uint | uintptr](data []T, key []T) []T {
	j_buf_len, j_key_len := len(data), len(key)
	if j_buf_len == 0 || j_key_len == 0 {
		return nil
	}
	j_buf := make([]T, j_buf_len)
	for j_i := 0; j_i < j_buf_len; j_i++ {
		j_buf[j_i] = data[j_i] ^ key[j_i%j_key_len]
	}
	return j_buf
}
