promise.fnl
Branches > main > e6dd500 > files / nvim / pack / plugins / opt / conjure / fnl / conjure / promise.fnl
(local {: autoload : define} (require :conjure.nfnl.module))
(local core (autoload :conjure.nfnl.core))
(local uuid (autoload :conjure.uuid))
(local M (define :conjure.promise))
(local state {})
(fn M.new []
(let [id (uuid.v4)]
(core.assoc
state id
{:id id
:val nil
:done? false})
id))
(fn M.done? [id]
(core.get-in state [id :done?]))
(fn M.deliver [id val]
(when (= false (M.done? id))
(core.assoc-in state [id :val] val)
(core.assoc-in state [id :done?] true))
nil)
(fn M.deliver-fn [id]
#(M.deliver id $1))
(fn M.close [id]
(let [val (core.get-in state [id :val])]
(core.assoc state id nil)
val))
(fn M.await [id opts]
(vim.fn.wait
(core.get opts :timeout 10000)
(.. "luaeval(\"require('conjure.promise')['done?']('" id "')\")")
(core.get opts :interval 50)))
M