I am making a ModuleScript that allows other scripts to share functions easier and such. However, when I run Script a, sometimes it works and sometimes it doesn't. Is this a problem with ROBLOX's interpreter or my script(if so, please tell me the issue)?

Script a

require(workspace.engyn)();

include("b");

sayHi();

Script b

function sayHi()
	out("hi!");
end

require(workspace.engyn)();

ModuleScript engyn

local documents = {};
local appc = require(script:FindFirstChild("appc"));

local M = function(...)
	local env = getfenv(2);
	
	local App = {
		Environment = {
			out = function(...)local info = {...};for i, v in pairs(info) do print("Engyn("..env["script"]:GetFullName()..") :: "..tostring(v));end end;

			include = coroutine.wrap(function(...)
				local function getDoc(id)
					return documents[id];
				end

				local function loadDoc(doc)
					for i, v in pairs(doc.Environment) do
						if (type(v) == "function") then
							if (not env[i]) then
								env[i] = v;
							end
						end
					end
				end

				for _, id in pairs({...}) do
					local doc = getDoc(id);
					if (doc) then
						loadDoc(doc);
					else
						if (not getDoc(id)) then
							repeat
								wait()
							until getDoc(id);
						else
							return true;
						end
					end
				end
			end);
		};
	}

	--Irrelevant code...

	App.New = function(env, args)
		local app = setmetatable(App, Meta);
		app.script = env["script"];
		
		app:init(env);
		app(args);
		return app;
	end
	
	documents[env["script"].Name] = App.New(env, {...});

	for i, v in pairs(App.Environment) do
		env[i] = v;
	end

	return documents[env["script"].Name];
end

return M;