diff --git a/src/foreclojure/problems.clj b/src/foreclojure/problems.clj index 4dc1222c..f7de665f 100644 --- a/src/foreclojure/problems.clj +++ b/src/foreclojure/problems.clj @@ -7,10 +7,10 @@ (:require [sandbar.stateful-session :as session])) (defn get-solved [user] - (into #{} - (:solved (fetch-one :users - :where {:user user} - :only [:solved])))) + (set + (:solved (fetch-one :users + :where {:user user} + :only [:solved])))) (defn get-problem [x] (fetch-one :problems :where {:_id x})) @@ -23,15 +23,14 @@ (defn mark-completed [id] (if-let [user (session/session-get :user)] (do - (when (not-any? #(= % id) (get-solved user)) - + (when (not-any? #{id} (get-solved user)) (update! :users {:user user} {:$push {:solved id}}) (update! :problems {:_id id} {:$inc {:times-solved 1}})) (flash-msg "Congratulations, you've solved the problem!" "/problems")) (flash-msg "You've solved the problem! If you log in we can track your progress." "/problems"))) (defn get-tester [restricted] - (reduce #(conj %1 (symbol %2)) secure-tester restricted)) + (into secure-tester (map symbol restricted))) (def sb (sandbox*)) @@ -41,16 +40,16 @@ func-name (:function-name p) sb-tester (get-tester (:restricted p))] (try - (loop [t tests] - (if (empty? t) + (loop [[test & more] tests] + (if-not test (mark-completed id) - (let [testcase (replace-str "__" code (first t))] + (let [testcase (replace-str "__" code test)] (if (sb sb-tester (read-string testcase)) - (recur (rest t)) + (recur more) (do (session/flash-put! :code code) (flash-error "You failed the unit tests." - (str "/problem/" id))))))) + (str "/problem/" id))))))) (catch Exception e (do (session/flash-put! :code code) @@ -90,15 +89,15 @@ (let [solved (get-solved (session/session-get :user))] (map-indexed (fn [x p] - (vec [:tr (row-class x) - [:td {:class "title-link"} - [:a {:href (str "/problem/" (p :_id))} - (p :title)]] - [:td {:class "centered"} - (map #(str % " ") (p :tags))] - [:td {:class "centered"} (p :times-solved)] - [:td {:class "centered"} - (if (contains? solved (p :_id)) - [:img {:src "/checkmark.png"}] - [:img {:src "/empty-sq.png"}])]])) - (get-problem-list)))]) \ No newline at end of file + [:tr (row-class x) + [:td {:class "title-link"} + [:a {:href (str "/problem/" (p :_id))} + (p :title)]] + [:td {:class "centered"} + (map #(str % " ") (p :tags))] + [:td {:class "centered"} (p :times-solved)] + [:td {:class "centered"} + [:img {:src (if (contains? solved (p :_id)) + "/checkmark.png" + "/empty-sq.png")}]]]) + (get-problem-list)))]) diff --git a/src/foreclojure/utils.clj b/src/foreclojure/utils.clj index 73267c9e..1c8500b6 100644 --- a/src/foreclojure/utils.clj +++ b/src/foreclojure/utils.clj @@ -4,15 +4,16 @@ (:require [sandbar.stateful-session :as session] (ring.util [response :as response]))) -(defmacro dbg[x] `(let [x# ~x] (println '~x "=" x#) x#)) +(defmacro dbg [x] + `(let [x# ~x] (println '~x "=" x#) x#)) -(defn flash-error [msg url] - (do (session/flash-put! :error msg) - (response/redirect url))) +(defn flash-fn [type] + (fn [msg url] + (session/flash-put! type msg) + (response/redirect url))) -(defn flash-msg [msg url] - (do (session/flash-put! :message msg) - (response/redirect url))) +(def flash-error (flash-fn :error)) +(def flash-msg (flash-fn :message)) (defmacro def-page [page-name [& args] & code] `(defn ~page-name [~@args] @@ -53,4 +54,4 @@ [:img {:src "/PoweredMongoDBbeige50.png"}]]] [:div {:id "content"} body] [:footer - [:span {:id "footer"} "© 2011 David Byrne" ]]]])) \ No newline at end of file + [:span {:id "footer"} "© 2011 David Byrne" ]]]]))