(ns examples.counter "Simple counter example - demonstrates basic Elm architecture. Mirrors bubbletea's simple example." (:require [tui.core :as tui] [tui.events :as ev])) ;; === Model === (def initial-model {:count 0}) ;; === Update === (defn update-fn [{:keys [model event]}] (cond ;; Quit on q or ctrl+c (or (ev/key= event \q) (ev/key= event \c #{:ctrl})) {:model model :events [(ev/quit)]} ;; Increment on up/k (or (ev/key= event :up) (ev/key= event \k)) {:model (update model :count inc)} ;; Decrement on down/j (or (ev/key= event :down) (ev/key= event \j)) {:model (update model :count dec)} ;; Reset on r (ev/key= event \r) {:model (assoc model :count 0)} :else {:model model})) ;; === View === (defn view [{:keys [count]} _size] [:col {:gap 1} [:box {:border :rounded :padding [0 1]} [:col [:text {:bold true} "Counter"] [:text ""] [:text {:fg (cond (pos? count) :green (neg? count) :red :else :default)} (str "Count: " count)]]] [:text {:fg :gray} "j/k or up/down: change value"] [:text {:fg :gray} "r: reset q: quit"]]) ;; === Main === (defn -main [& _args] (println "Starting counter...") (let [final-model (tui/run {:init initial-model :update update-fn :view view})] (println "Final count:" (:count final-model))))