36 lines
1.3 KiB
Plaintext
36 lines
1.3 KiB
Plaintext
|
(local util (require :lib.util))
|
||
|
(local fennel (require :lib.fennel))
|
||
|
|
||
|
(local replsession (util.hot-table ...))
|
||
|
|
||
|
(set replsession.sessions {})
|
||
|
|
||
|
(fn replsession.new-session []
|
||
|
(let [run (fn [session]
|
||
|
(fennel.repl {:readChunk coroutine.yield
|
||
|
:onValues #(session.callback {:vals $1})
|
||
|
:onError #(session.callback {:errType $1 :err $2 :luaSource $3 :traceback (fennel.traceback)})
|
||
|
:pp #$1
|
||
|
:env (lume.clone _G)}))
|
||
|
session {:coro (coroutine.create run) :submit replsession.submit}]
|
||
|
(coroutine.resume session.coro session)
|
||
|
session))
|
||
|
|
||
|
(fn replsession.submit [session chunk callback]
|
||
|
(assert (= session.callback nil))
|
||
|
(set session.callback callback)
|
||
|
(coroutine.resume session.coro (.. chunk "\n"))
|
||
|
(assert (= session.callback callback))
|
||
|
(set session.callback nil))
|
||
|
|
||
|
(fn replsession.activate [id] (set replsession.active-session-id id))
|
||
|
(fn replsession.session-id [?id] (or ?id replsession.active-session-id :REPL))
|
||
|
(fn replsession.session [?id]
|
||
|
(let [id (replsession.session-id ?id)
|
||
|
session (or (. replsession.sessions id) (replsession.new-session))]
|
||
|
(tset replsession.sessions id session)
|
||
|
session))
|
||
|
|
||
|
replsession.hot
|
||
|
|