diff --git a/components/scan.lua b/components/scan.lua index a865f49..aa5cebb 100644 --- a/components/scan.lua +++ b/components/scan.lua @@ -5,26 +5,26 @@ local PAGE_SIZE = 50 private.threads = {} private.last_query_time = {} +private.th = Aux.dynamic_table(function() + return Aux.util.filter(m.threads, function(thread) return thread.id == Aux.control.thread_id end)[1] +end) + +private.q = Aux.dynamic_table(function() + return m.th.params.queries[m.th.query_index] +end) + function private.total_pages(total_auctions) return math.ceil(total_auctions / PAGE_SIZE) end function private.last_page(total_auctions) local last_page = max(m.total_pages(total_auctions) - 1, 0) - local last_page_limit = Aux.safe(m.q.blizzard_query).last_page/last_page + local last_page_limit = Aux.index(m.q.blizzard_query).last_page/last_page return min(last_page_limit, last_page) end -private.th = Aux.t(function() - return Aux.util.filter(m.threads, function(thread) return thread.id == Aux.control.thread_id end)[1] -end) - -private.q = Aux.t(function() - return m.th.params.queries[m.th.query_index] -end) - function public.start(params) - m.abort(Aux.safe(m.threads[params.type]).id/0) + m.abort(Aux.index(m.threads[params.type]).id/0) local thread_id = Aux.control.new_thread(Aux.f(m.wait_for_callback, params.on_scan_start, m.scan)) @@ -46,7 +46,7 @@ function public.abort(scan_id) end for _, thread in ipairs(aborted_threads) do - Aux.safe(thread.params.on_abort)() + Aux.call(thread.params.on_abort) end end @@ -194,11 +194,11 @@ function private.scan_page_helper(i) Aux.history.process_auction(auction_info) - if Aux.safe(m.th.params.auto_buy_validator)(auction_info)/false then + if Aux.call(m.th.params.auto_buy_validator, auction_info)/false then local c = Aux.control.await(recurse) Aux.place_bid(auction_info.query_type, auction_info.index, auction_info.buyout_price, Aux.f(c, true)) Aux.control.new_thread(Aux.control.sleep, 10, Aux.f(c, false)) - elseif Aux.safe(m.q.validator)(auction_info)/true then + elseif Aux.call(m.q.validator, auction_info)/true then return m.wait_for_callback(m.th.params.on_auction, auction_info, function(removed) if removed then return recurse(true) @@ -214,14 +214,14 @@ end function private.submit_query() Aux.control.when(function() return m.th.params.type ~= 'list' or CanSendAuctionQuery() end, function() - Aux.safe(m.th.params.on_submit_query)() + Aux.call(m.th.params.on_submit_query) m.last_query_time[m.th.params.type] = GetTime() if m.th.params.type == 'bidder' then GetBidderAuctionItems(m.th.page) elseif m.th.params.type == 'owner' then GetOwnerAuctionItems(m.th.page) else - local blizzard_query = Aux.safe(m.q.blizzard_query)/{} + local blizzard_query = Aux.option(m.q.blizzard_query)/{} QueryAuctionItems( blizzard_query.name, blizzard_query.min_level, diff --git a/core.lua b/core.lua index 299fdc4..e95db8e 100644 --- a/core.lua +++ b/core.lua @@ -46,58 +46,82 @@ function public.set(table, key, value) table[key] = value end -function public.t(func) - return setmetatable({}, { - __newindex = function(_, key, value) - func()[key] = value - end, - __index = function(_, key) - if func() == nil then error('', 2) end - return func()[key] - end, - __call = function() - return func() - end, - }) -end - -function public.f(func, ...) +function public.f(f, ...) local params = arg return function(...) for i=1,arg.n do tinsert(params, arg[i]) end - return func(unpack(params)) + return f(unpack(params)) end end -function public.safe(value) - return setmetatable({},{ +do + local dynamic_table_mt = { + __newindex = function(self, key, value) + rawget(self, '_f')()[key] = value + end, __index = function(self, key) - if value ~= nil and key ~= nil then - return m.safe(value[key]) - else - return m.safe(nil) + return rawget(self, '_f')()[key] + end, + __call = function(self) + return rawget(self, '_f')() + end, + } + function public.dynamic_table(f) + return setmetatable({ _f=f }, dynamic_table_mt) + end +end + +function public.call(f, ...) + return m.option(f)..function() + return m.option(f(unpack(arg))) + end +end + +do + local index_mt = { + __index = function(self, key) + return m.option(rawget(self, '_value'))..function() + return m.option(rawget(self, '_value')[key]) end end, - __call = function(self, ...) - if value ~= nil then - if type(value) ~= 'function' then - error('', 2) - end - return m.safe(value(unpack(arg))) + } + function public.index(value) + return setmetatable({ _value=value }, index_mt) + end +end + +do + local option_mt = { + __call = function(self, f) + if rawget(self, '_value') ~= nil then + return m.option(f(rawget(self, '_value'))) else - return m.safe(nil) + return self end end, __div = function(self, alt) - if value ~= nil then - return value + if rawget(self, '_value') ~= nil then + return rawget(self, '_value') else return alt end end, - }) + __unm = function(self, alt) + return rawget(self, '_value') ~= nil + end, + __concat = function(self, f) + if rawget(self, '_value') ~= nil then + return f(rawget(self, '_value')) + else + return self + end + end, + } + function public.option(value) + return setmetatable({ _value=value }, option_mt) + end end do @@ -172,7 +196,7 @@ function public.on_event() if event == 'VARIABLES_LOADED' then m.on_load() elseif event == 'ADDON_LOADED' then - m.safe(m.on_addon_load[arg1])() + m.call(m.on_addon_load[arg1]) elseif event == 'AUCTION_HOUSE_SHOW' then m.on_auction_house_show() elseif event == 'AUCTION_HOUSE_CLOSED' then @@ -464,7 +488,7 @@ end function public.is_player(name, current) local realm = GetCVar('realmName') - return (not current and m.safe(aux_characters)[realm][name]/false) or UnitName('player') == name + return (not current and m.index(aux_characters[realm])[name]/false) or UnitName('player') == name end function public.unmodified() diff --git a/tabs/search/core.lua b/tabs/search/core.lua index c43bfa3..9f78a2b 100644 --- a/tabs/search/core.lua +++ b/tabs/search/core.lua @@ -475,7 +475,7 @@ do search.table:RemoveAuctionRecord(record) end, function(index) - if Aux.safe(search.table:GetSelection()).record/nil ~= record then + if Aux.index(search.table:GetSelection()).record/nil ~= record then return end @@ -731,11 +731,11 @@ function private.initialize_filter_dropdown() local function on_click() UIDropDownMenu_SetSelectedValue(m.filter_dropdown, this.value) m.filter_button:SetText(this.value) - if Aux.safe(Aux.filter.filters[this.value]).input_type/'' == '' and this.value ~= 'and' and this.value ~= 'or' then + if Aux.index(Aux.filter.filters[this.value]).input_type/'' == '' and this.value ~= 'and' and this.value ~= 'or' then m.filter_input:Hide() else local _, _, suggestions = Aux.filter.parse_query_string(UIDropDownMenu_GetSelectedValue(m.filter_dropdown)..'/') - m.filter_input:SetNumeric(Aux.safe(Aux.filter.filters[this.value]).input_type/'number' == 'number') + m.filter_input:SetNumeric(Aux.index(Aux.filter.filters[this.value]).input_type/'number' == 'number') m.filter_input.complete = Aux.completion.complete(function() return suggestions or {} end) m.filter_input:Show() m.filter_input:SetFocus()