63 lines
1.7 KiB
Fennel
63 lines
1.7 KiB
Fennel
(local util (require :lib.util))
|
|
(local fennel (require :lib.fennel))
|
|
(local style (require :core.style))
|
|
(local lume (require :lib.lume))
|
|
|
|
(local repl (util.hot-table ...))
|
|
|
|
(fn repl.text-height [text ?font]
|
|
(let [font (or ?font style.font)
|
|
(_ newlines) (text:gsub "\n" "\n")]
|
|
(* (font:get_height) (+ newlines 1))))
|
|
|
|
(fn repl.inspect-table [tbl view x y-start w]
|
|
(var y y-start)
|
|
(var h 0)
|
|
(each [k v (pairs tbl)]
|
|
(let [kstr (fv k)
|
|
wk 1]
|
|
nil))
|
|
)
|
|
(fn repl.inspect [v view x y w]
|
|
(renderer.draw_text style.font (fv v) x y style.text)
|
|
(repl.text-height (fv v)))
|
|
|
|
(fn repl.inspector [{: vals} view x y]
|
|
(var h 0)
|
|
(each [i v (ipairs vals)]
|
|
(set h (+ h (repl.inspect v view x (+ y h) view.size.x))))
|
|
(+ h style.padding.y))
|
|
|
|
(fn repl.notify [listeners line]
|
|
(each [_ listener (ipairs listeners)]
|
|
(listener:append line)))
|
|
|
|
(fn repl.run [{: listeners}]
|
|
(local inspector #(repl.inspector $...))
|
|
(fennel.repl {:readChunk coroutine.yield
|
|
:onValues #(repl.notify listeners {:draw inspector :vals $1})
|
|
:onError (fn [errType err luaSource] (repl.notify listeners {:draw inspector :vals [err]}))
|
|
:pp #$1
|
|
:env (lume.clone _G)}))
|
|
|
|
(fn repl.listen [{: listeners} listener]
|
|
(table.insert listeners listener))
|
|
|
|
(fn repl.unlisten [{: listeners} listener]
|
|
(lume.remove listeners listener))
|
|
|
|
(fn repl.submit [{: coro} chunk]
|
|
(coroutine.resume coro (.. chunk "\n")))
|
|
|
|
(fn repl.new []
|
|
(local result
|
|
{:listeners []
|
|
:listen #(repl.listen $...)
|
|
:unlisten #(repl.unlisten $...)
|
|
:submit #(repl.submit $...)
|
|
:coro (coroutine.create repl.run)})
|
|
(coroutine.resume result.coro result)
|
|
result)
|
|
|
|
repl.hot
|