Skip to content

Commit

Permalink
fix(lua): moran_aux_translator perf
Browse files Browse the repository at this point in the history
  • Loading branch information
ksqsf committed Dec 6, 2023
1 parent 7523327 commit 675d7e5
Showing 1 changed file with 28 additions and 44 deletions.
72 changes: 28 additions & 44 deletions lua/moran_aux_translator.lua
Original file line number Diff line number Diff line change
Expand Up @@ -151,62 +151,46 @@ function Module.candidate_match(env, cand, aux)
return false
end

for gt in Module.aux_iter(env, cand.text) do
for i, gt in pairs(Module.aux_list(env, cand.text)) do
if aux == gt then
return true
end
end
return false
end

function Module.aux_iter(env, word)
local co = coroutine.create(function()
char_list = {}

-- Single char
for i, c in Module.chars(word) do
table.insert(char_list, c)
local c_aux_list = env.aux_table[c]
if c_aux_list then
for i, c_aux in pairs(c_aux_list) do
coroutine.yield(c_aux:sub(1,1))
coroutine.yield(c_aux)
end
end
end
function Module.aux_list(env, word)
local aux_list = {}
local char_list = {}
local first = nil
local last = nil

-- First char & last char
first = char_list[1]
last = char_list[#char_list]
f_aux_list = env.aux_table[first]
l_aux_list = env.aux_table[last]
for i, f_aux in pairs(f_aux_list) do
for j, l_aux in pairs(l_aux_list) do
coroutine.yield(f_aux:sub(1,1) .. l_aux:sub(1,1))
coroutine.yield(l_aux:sub(1,1) .. f_aux:sub(1,1))
end
end
-- Single char
for i, c in Module.chars(word) do
if not first then first = c end
last = c

return nil
end)
local finished = false
return function()
if finished then
return nil
end
local ok, value = coroutine.resume(co)
if ok == false then
finished = true
log.error('moran_aux_translator: aux_iter error ' .. tostring(value))
return nil
local c_aux_list = env.aux_table[c]
if c_aux_list then
for i, c_aux in pairs(c_aux_list) do
table.insert(aux_list, c_aux:sub(1,1))
table.insert(aux_list, c_aux)
end
end
if value then
return value
else
finished = true
return nil
end

-- First char & last char
f_aux_list = env.aux_table[first]
l_aux_list = env.aux_table[last]

for i, f_aux in pairs(f_aux_list) do
for j, l_aux in pairs(l_aux_list) do
table.insert(aux_list, f_aux:sub(1,1) .. l_aux:sub(1,1))
table.insert(aux_list, l_aux:sub(1,1) .. f_aux:sub(1,1))
end
end

return aux_list
end

function Module.chars(word)
Expand Down

0 comments on commit 675d7e5

Please # to comment.