Menu
Coddy logo textTech

Function: Print Task Summary

Part of the Introduction To Luau section of Coddy's Lua journey. Lesson 49 of 73.

challenge icon

Challenge

Easy

Your editor already contains the Task type, the tasks array, addTask, completeTask and filterTasks from the previous lessons.

Create a function named printSummary that takes one parameter, list of type {Task}, returns nothing (return type ()), and prints one line in the exact format:

{doneCount}/{total} tasks done

where total is #list and doneCount is how many tasks have done == true (count with a loop).

Then exercise the whole toolkit, in this order:

  1. call printSummary(tasks)
  2. call completeTask(tasks, 2)
  3. call printSummary(tasks)
  4. call addTask(tasks, "Take a break")
  5. call printSummary(tasks)

Try it yourself

-- The shape every task in the manager must follow
type Task = {
    id: number,
    title: string,
    done: boolean,
}

-- The task list: a typed array of Task shapes
local tasks: {Task} = {
    {id = 1, title = "Learn Luau types", done = false},
    {id = 2, title = "Build a task manager", done = false},
    {id = 3, title = "Write tests", done = true},
}

-- Build a typed task with the next free id and insert it
local function addTask(list: {Task}, title: string): Task
    local newTask: Task = {
        id = #list + 1,
        title = title,
        done = false,
    }
    table.insert(list, newTask)
    return newTask
end

-- Mark the task with the given id as done; report success
local function completeTask(list: {Task}, id: number): boolean
    for _, t in ipairs(list) do
        if t.id == id then
            t.done = true
            return true
        end
    end
    return false
end

-- Collect the tasks whose done flag matches into a new {Task}
local function filterTasks(list: {Task}, done: boolean): {Task}
    local result: {Task} = {}
    for _, t in ipairs(list) do
        if t.done == done then
            table.insert(result, t)
        end
    end
    return result
end

-- Split the list into pending and finished views
local pending: {Task} = filterTasks(tasks, false)
local finished: {Task} = filterTasks(tasks, true)

print(#pending)
for _, t in ipairs(pending) do
    print(t.title)
end

print(#finished)
for _, t in ipairs(finished) do
    print(t.title)
end

All lessons in Introduction To Luau

Practice on your own: Online Lua compiler