summaryrefslogtreecommitdiff
path: root/lua/telescope/finders.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/telescope/finders.lua')
-rw-r--r--lua/telescope/finders.lua36
1 files changed, 35 insertions, 1 deletions
diff --git a/lua/telescope/finders.lua b/lua/telescope/finders.lua
index d2acd05..62c05a1 100644
--- a/lua/telescope/finders.lua
+++ b/lua/telescope/finders.lua
@@ -2,6 +2,8 @@ local Job = require('plenary.job')
local make_entry = require('telescope.make_entry')
local log = require('telescope.log')
+local a = require('plenary.async_lib')
+local await = a.await
local async_static_finder = require('telescope.finders.async_static_finder')
local async_oneshot_finder = require('telescope.finders.async_oneshot_finder')
@@ -20,7 +22,6 @@ local _callable_obj = function()
return obj
end
-
--[[ =============================================================
JobFinder
@@ -108,6 +109,35 @@ function JobFinder:_find(prompt, process_result, process_complete)
self.job:start()
end
+local DynamicFinder = _callable_obj()
+
+function DynamicFinder:new(opts)
+ opts = opts or {}
+
+ assert(not opts.results, "`results` should be used with finder.new_table")
+ assert(not opts.static, "`static` should be used with finder.new_oneshot_job")
+
+ local obj = setmetatable({
+ curr_buf = opts.curr_buf,
+ fn = opts.fn,
+ entry_maker = opts.entry_maker or make_entry.from_string,
+ }, self)
+
+ return obj
+end
+
+function DynamicFinder:_find(prompt, process_result, process_complete)
+ a.scope(function()
+ local results = await(self.fn(prompt))
+
+ for _, result in ipairs(results) do
+ if process_result(self.entry_maker(result)) then return end
+ end
+
+ process_complete()
+ end)
+end
+
--- Return a new Finder
--
-- Use at your own risk.
@@ -185,4 +215,8 @@ finders.new_table = function(t)
return async_static_finder(t)
end
+finders.new_dynamic = function(t)
+ return DynamicFinder:new(t)
+end
+
return finders