(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