diff --git a/src/AuraTable/AuraTable.lua b/src/AuraTable/AuraTable.lua index 2eceb38..b7e7a2c 100644 --- a/src/AuraTable/AuraTable.lua +++ b/src/AuraTable/AuraTable.lua @@ -437,6 +437,298 @@ function AuraTable:FindAnyFrom(spells, source) end, Bastion.Aura:New()) end +-- FindLongestOf +---@param spells List +---@return Aura +function AuraTable:FindLongestOf(spells) + return spells:reduce(function(acc, cur) + local aura = self:Find(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetRemainingTime() > acc:GetRemainingTime() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindLongestOfMy +---@param spells List +---@return Aura +function AuraTable:FindLongestOfMy(spells) + return spells:reduce(function(acc, cur) + local aura = self:FindMy(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetRemainingTime() > acc:GetRemainingTime() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindLongestOfTheirs +---@param spells List +---@return Aura +function AuraTable:FindLongestOfTheirs(spells) + return spells:reduce(function(acc, cur) + local aura = self:FindTheirs(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetRemainingTime() > acc:GetRemainingTime() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindLongestOfFrom +---@param spells List +---@param source Unit +---@return Aura +function AuraTable:FindLongestOfFrom(spells, source) + return spells:reduce(function(acc, cur) + local aura = self:FindFrom(cur, source) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetRemainingTime() > acc:GetRemainingTime() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindShortestOf +---@param spells List +---@return Aura +function AuraTable:FindShortestOf(spells) + return spells:reduce(function(acc, cur) + local aura = self:Find(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetRemainingTime() < acc:GetRemainingTime() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindShortestOfMy +---@param spells List +---@return Aura +function AuraTable:FindShortestOfMy(spells) + return spells:reduce(function(acc, cur) + local aura = self:FindMy(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetRemainingTime() < acc:GetRemainingTime() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindShortestOfTheirs +---@param spells List +---@return Aura +function AuraTable:FindShortestOfTheirs(spells) + return spells:reduce(function(acc, cur) + local aura = self:FindTheirs(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetRemainingTime() < acc:GetRemainingTime() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindShortestOfFrom +---@param spells List +---@param source Unit +---@return Aura +function AuraTable:FindShortestOfFrom(spells, source) + return spells:reduce(function(acc, cur) + local aura = self:FindFrom(cur, source) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetRemainingTime() < acc:GetRemainingTime() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindMostOf +---@param spells List +---@return Aura +function AuraTable:FindMostOf(spells) + return spells:reduce(function(acc, cur) + local aura = self:Find(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetCount() > acc:GetCount() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindMostOfMy +---@param spells List +---@return Aura +function AuraTable:FindMostOfMy(spells) + return spells:reduce(function(acc, cur) + local aura = self:FindMy(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetCount() > acc:GetCount() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindMostOfTheirs +---@param spells List +---@return Aura +function AuraTable:FindMostOfTheirs(spells) + return spells:reduce(function(acc, cur) + local aura = self:FindTheirs(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetCount() > acc:GetCount() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindMostOfFrom +---@param spells List +---@param source Unit +---@return Aura +function AuraTable:FindMostOfFrom(spells, source) + return spells:reduce(function(acc, cur) + local aura = self:FindFrom(cur, source) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetCount() > acc:GetCount() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindLeastOf +---@param spells List +---@return Aura +function AuraTable:FindLeastOf(spells) + return spells:reduce(function(acc, cur) + local aura = self:Find(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetCount() < acc:GetCount() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindLeastOfMy +---@param spells List +---@return Aura +function AuraTable:FindLeastOfMy(spells) + return spells:reduce(function(acc, cur) + local aura = self:FindMy(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetCount() < acc:GetCount() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindLeastOfTheirs +---@param spells List +---@return Aura +function AuraTable:FindLeastOfTheirs(spells) + return spells:reduce(function(acc, cur) + local aura = self:FindTheirs(cur) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetCount() < acc:GetCount() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + +-- FindLeastOfFrom +---@param spells List +---@param source Unit +---@return Aura +function AuraTable:FindLeastOfFrom(spells, source) + return spells:reduce(function(acc, cur) + local aura = self:FindFrom(cur, source) + if aura:IsValid() then + if not acc:IsValid() then + return aura + end + if aura:GetCount() < acc:GetCount() then + return aura + end + end + return acc + end, Bastion.Aura:New()) +end + -- Has any stealable aura ---@return boolean function AuraTable:HasAnyStealableAura() diff --git a/src/SpellBook/SpellBook.lua b/src/SpellBook/SpellBook.lua index c99fc8f..52119b8 100644 --- a/src/SpellBook/SpellBook.lua +++ b/src/SpellBook/SpellBook.lua @@ -27,13 +27,24 @@ end ---@return Spell, ... Spell function SpellBook:GetSpells(...) local spells = {} - for _, id in ipairs({ ... }) do + for _, id in ipairs({...}) do table.insert(spells, self:GetSpell(id)) end return unpack(spells) end +---@param ... number[] +---@return List +function SpellBook:GetList(...) + local spells = {} + for _, id in ipairs({...}) do + table.insert(spells, self:GetSpell(id)) + end + + return Bastion.List:New(spells) +end + ---@param name string ---@return Spell function SpellBook:GetSpellByName(name)