librime-lua icon indicating copy to clipboard operation
librime-lua copied to clipboard

add TranslationReg vars_get exhausted

Open shewer opened this issue 2 years ago • 3 comments

tran = Translation(
    function() 
         for i=1,5 do
              yield( Candidate('test',0,2,'test' .. i, i) )
         end 
      end)

for cand in tran:iter() do  
    print(tran.exhausted, cand.text ) 
end 

--[[ res
false   test1
false   test2
false   test3
false   test4
true    test5
--]]

shewer avatar Dec 29 '22 16:12 shewer

小写的 next() 是为了实现 iter() 而做的内部函数,不应该再暴露来。

另外原意是 lua 中只提供 iter() 就够用了。有点好奇 exhausted() Peek() Next() 这三者在什么情形下需要使用。

hchunhui avatar Jan 08 '23 07:01 hchunhui

小写的 next() 是为了实现 iter() 而做的内部函数,不应该再暴露来。

另外原意是 lua 中只提供 iter() 就够用了。有点好奇 exhausted() Peek() Next() 这三者在什么情形下需要使用。

在多個 translation 排序時可以用Peek 檢查而不取出來

shewer avatar Jan 08 '23 08:01 shewer

使用 Translation 實現

-- 從n個transltion 中取出當前cand.quility 最大值 的tran
local function pickup_tran(...)
    local first_tran
    local trans = {...}
    for i,tran in next, trans do 
      if not tran.exhausted then
          if not first_tran then
             first_tran = tran
         else
            first_tran =  first_tran:Peek().quality < tran:Peek().quality and tran or first_tran
          end         
      end
  end
  return first_tran
end
-- LuaTranslation func( tran_1,tran_2....tran_n)
local function tran_sort(...)
   repeat
      local tran= pickup_tran(...)
      if tran then
         yield( tran:Peek())
         tran:Next()
     end
   until (tran) 
end


   env.tran1
   env.tran2
   tn1 = env.tran1:query(inp,seg)
   tn2 = env.tran2:query(inp,seg)
   tn3 = env.tran1:query(inp .. 'a', seg)
   for cand in Translation(tran_sort, tn1,tn2,tn3):iter() do
       yield(cand)
   end

shewer avatar Jan 08 '23 12:01 shewer