-- Write function setters: (Calling outside a write function will throw an error)


function Replica:SetValue(path, value)
	if WriteFunctionFlag == false then
		error(SETTINGS.SetterError)
	end
	local path_array = (type(path) == "string") and StringPathToArray(path) or path
	ReplicaSetValue(self.Id, path_array, value)
end

function Replica:SetValues(path, values)
	if WriteFunctionFlag == false then
		error(SETTINGS.SetterError)
	end
	local path_array = (type(path) == "string") and StringPathToArray(path) or path
	ReplicaSetValues(self.Id, path_array, values)
end

function Replica:ArrayInsert(path, value) --> new_index
	if WriteFunctionFlag == false then
		error(SETTINGS.SetterError)
	end
	local path_array = (type(path) == "string") and StringPathToArray(path) or path
	return ReplicaArrayInsert(self.Id, path_array, value)
end

function Replica:ArraySet(path, index, value)
	if WriteFunctionFlag == false then
		error(SETTINGS.SetterError)
	end
	local path_array = (type(path) == "string") and StringPathToArray(path) or path
	ReplicaArraySet(self.Id, path_array, index, value)
end

function Replica:ArrayRemove(path, index) --> removed_value
	if WriteFunctionFlag == false then
		error(SETTINGS.SetterError)
	end
	local path_array = (type(path) == "string") and StringPathToArray(path) or path
	return ReplicaArrayRemove(self.Id, path_array, index)
end

function Replica:Write(function_name, ...) --> return_params...
	if WriteFunctionFlag == false then
		error(SETTINGS.SetterError)
	end
	local func_id = self._write_lib_dictionary[function_name]
	local return_params = table.pack(self._write_lib[func_id](self, ...))
	-- Signaling listeners:
	local listeners = self._function_listeners[func_id]
	if listeners ~= nil then
		for _, listener in ipairs(listeners) do
			listener(...)
		end
	end
	return table.unpack(return_params)
end
