util_data

class_name UTIL_DATA

'''
UTIL_DATA.array_merge_alternating(array1, array2)
'''

# 公共方法
static func array_merge_alternating(left_list: Array, right_list: Array) -> Array:
	var merged_list = []
	var left_index = 0
	var right_index = 0

	# 交替添加左右列表的元素
	while left_index < left_list.size() or right_index < right_list.size():
		if left_index < left_list.size():
			merged_list.append(left_list[left_index])
			left_index += 1
		if right_index < right_list.size():
			merged_list.append(right_list[right_index])
			right_index += 1

	return merged_list

static func duplicate_custom(original):
	if original == null:
		push_error("duplicate_custom: 传入 null,无法拷贝")
		return null

	match typeof(original):
		TYPE_NIL, TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING:
			return original  # **基本类型直接返回**

		TYPE_ARRAY:
			var new_array = []
			for item in original:
				new_array.append(duplicate_custom(item))  # **递归拷贝**
			return new_array

		TYPE_DICTIONARY:
			var new_dict = {}
			for key in original.keys():
				new_dict[key] = duplicate_custom(original[key])  # **递归拷贝**
			return new_dict

		TYPE_OBJECT:
			if original is Resource:
				var new_instance = original.get_script().new()  # **手动创建相同类型的实例**
				if not new_instance:
					push_error("duplicate_custom: `new()` 失败,返回原对象: %s" % original)
					return original  # **保证不返回 `null`,避免影响业务**

				# **复制所有属性**
				for prop in original.get_property_list():
					var prop_name = prop["name"]
					if prop_name == "script":  # **跳过脚本,避免冲突**
						continue

					var value = original.get(prop_name)
					new_instance.set(prop_name, duplicate_custom(value))  # **递归拷贝**
				
				return new_instance

			push_error("duplicate_custom: 不支持的对象类型 %s" % original)
			return original  # **确保不返回 `null`,避免影响业务**

		_:
			push_error("duplicate_custom: 不支持的类型 %s" % typeof(original))
			return original  # **保证不返回 `null`**