TaskStateMachine

Reusable state machine implementation for tasks

state machine

Library Implementation

-- TaskStateMachine.lua
-- Reusable state machine for task execution

local TaskStateMachine = {}

-- Create a new task state machine
function TaskStateMachine.new(subtaskNames)
    local state = {
        current = "INIT",
        startTime = 0,
        currentSubtask = 0,
        subtaskResults = {},
        data = {}
    }

    -- Build subtasks array
    state.subtasks = {}
    for i, name in ipairs(subtaskNames or {}) do
        table.insert(state.subtasks, {
            name = name,
            status = "PENDING",
            result = nil
        })
    end

    return state
end

-- Transition to next state
function TaskStateMachine.transition(state, nextState, message)
    state.current = nextState
    return nextState, message
end

-- Check if all subtasks are complete
function TaskStateMachine.allSubtasksComplete(state)
    for _, subtask in ipairs(state.subtasks) do
        if subtask.status ~= "COMPLETE" then
            return false
        end
    end
    return true
end

-- Get next pending subtask
function TaskStateMachine.getNextSubtask(state)
    for i, subtask in ipairs(state.subtasks) do
        if subtask.status == "PENDING" then
            return i, subtask
        end
    end
    return nil, nil
end

return TaskStateMachine
1266 characters

Usage Example

-- Usage example in a task:
local TaskStateMachine = require("TaskStateMachine")

local taskState = nil

function init(params)
    local subtaskNames = {"Plan", "Move", "Execute", "Assess", "Return"}
    taskState = TaskStateMachine.new(subtaskNames)
    taskState.startTime = vrf.getSimulationTime()
    taskState.data = params or {}

    return TaskStateMachine.transition(taskState, "READY", "Task initialized")
end

function tick()
    if taskState.current == "READY" then
        return TaskStateMachine.transition(taskState, "EXECUTING", "Starting execution")
    elseif taskState.current == "EXECUTING" then
        if TaskStateMachine.allSubtasksComplete(taskState) then
            return TaskStateMachine.transition(taskState, "COMPLETE", "All subtasks done")
        end
    end
    return "CONTINUE", "Processing"
end

Quick Reference

Import Statement

local TaskStateMachine = require("TaskStateMachine")

Category

state machine

Key Features

  • Create and manage task state machines
  • Handle state transitions (INIT → READY → EXECUTING → COMPLETE)
  • Track subtask execution status
  • Query state and progress