aboutsummaryrefslogtreecommitdiff
path: root/src/app/scoreboard.cljs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/scoreboard.cljs')
-rw-r--r--src/app/scoreboard.cljs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/app/scoreboard.cljs b/src/app/scoreboard.cljs
new file mode 100644
index 0000000..b58e49e
--- /dev/null
+++ b/src/app/scoreboard.cljs
@@ -0,0 +1,64 @@
+(ns app.scoreboard
+ (:require [hoplon.core :refer [table tbody td th thead tr]])
+ (:require-macros [hoplon.core :refer [defelem loop-tpl]]
+ [javelin.core :refer [cell=]]))
+
+(defelem scoreboard
+ [{:keys [scoreboard] :as attr} kids]
+ (let [scoreboard (cell= (merge (sorted-map) scoreboard))
+ problems (cell= (mapcat (fn [[id person]]
+ (map (partial vector id) (:problems person)))
+ scoreboard))
+ scores (cell= (reverse (sort
+ (map (fn [[id person]]
+ [(apply
+ +
+ (concat
+ (map (fn [[prob state]]
+ (if (and
+ (= :solved state)
+ (not (contains? (:problems person) prob)))
+ 1
+ 0))
+ (:scores person))
+ (map (fn [prob]
+ (if (some (fn [[id2 person2]]
+ (and
+ (= :solved
+ (get (:scores person) prob))
+ (= :solved
+ (get (:scores person2) prob))
+ (not= id id2)))
+ scoreboard)
+ 1
+ 0))
+ (:problems person))))
+ id])
+ scoreboard))))]
+ (table
+ (thead
+ (tr
+ (th :colspan 2
+ :style "border:none")
+ (loop-tpl :bindings [probs (cell= (partition-by first problems))]
+ (th :text (cell= (:name (get scoreboard
+ (first (first probs)))))
+ :colspan (cell= (count probs)))))
+ (tr
+ (th "Player")
+ (th "Score")
+ (loop-tpl :bindings [[owner name] problems]
+ (th :text name))))
+ (tbody
+ (loop-tpl :bindings [[score id] scores]
+ (let [player (cell= (get scoreboard id))]
+ (tr
+ (td :text (cell= (:name player)))
+ (td :text score)
+ (loop-tpl :bindings [[owner _name] problems]
+ (td :text (cell=
+ (name (get (:scores player)
+ _name
+ :unsolved))))))))))))
+
+;; vim: set expandtab ts=2 sw=2 filetype=clojure :