CCCPaste

Basic Task Manager

--[[
    Basic Task Manager by darraghd493
 
    A basic Roblox task manager.
]]

local Library = {
    ActiveTasks = {};
}
Library.__index = Library

--#region Internal Functions
local function _removeTask(handle)
    for i, task in ipairs(Library.ActiveTasks) do
        if task == handle then
            table.remove(Library.ActiveTasks, i)
            return
        end
    end
end
--#endregion

function Library.new()
    local self = setmetatable({
        ActiveTasks = {};
    }, Library)
    return self
end

function Library:Spawn(func: (cancelled: () -> boolean) -> ())
    local handle = {
        Running = true,
        Completed = false,
        Cancelled = false,
    }

    handle.Cancel = function(self)
        self.Cancelled = true
        self.Running = false
    end

    handle.IsRunning = function(self)
        return self.Running
    end

    task.spawn(function()
        local ok, err = pcall(function()
            func(function()
                return handle.Cancelled
            end)
        end)
        if not ok then
            error("Task error:", err)
        end

        handle.Completed = true
        handle.Running = false
        _removeTask(handle)
    end)

    table.insert(Library.ActiveTasks, handle)
    return handle
end

function Library:Delay(seconds: number, func: () -> ())
    return self:Spawn(function(cancelled)
        local elapsed = 0
        while elapsed < seconds do
            if cancelled() then return end
            task.wait(0.1)
            elapsed += 0.1
        end
        if not cancelled() then
            func()
        end
    end)
end

function Library:Shutdown()
    for _, handle in ipairs(self.ActiveTasks) do
        handle:Cancel()
    end
    table.clear(self.ActiveTasks)
end

function Library:Count()
    return #self.ActiveTasks
end

return Library