refactored p26.clj to align with hs version

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/drcabana/euler-fp.git/'


remove outdated code

remove outdated code

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sbondaryev/cljs-worker.git/'


Add example from chapter 7 - cjfbt

Add example from chapter 7 - cjfbt

error: pathspec 'src/clojure/cfbt/ch07.clj' did not match any file(s) known to git

--- src/clojure/cfbt/ch07.clj
+++ src/clojure/cfbt/ch07.clj
@@ -0,0 +1,134 @@
+(ns clojure.cfbt.ch07)
+
+(defmacro backwards
+  [form]
+  (reverse form))
+
+(backwards (" backwards" " am" "I" str)) ;; "I am backwards"
+
+(def addition-list (list + 1 2)) ;; #'clojure.cfbt.ch07/addition-list
+
+(eval addition-list) ;; 3
+
+(eval (concat addition-list [10])) ;; 13
+
+(eval (list 'def `lucky-number (concat addition-list [10])))
+;; #'clojure.cfbt.ch07/lucky-number
+lucky-number ;; 13
+
+(str "To understand what recursion is," " you must first understand recursion") ;;
+;; "To understand what recursion is, you must first understand recursion"
+
+(read-string "(+ 1 2)") ;; (+ 1 2)
+
+(list? (read-string "(+ 1 2)")) ;; true
+
+(conj (read-string "(+ 1 2)") :zagglewag) ;; (:zagglewag + 1 2)
+
+(eval (read-string "(+ 1 2)")) ;; 3
+
+(#(+ 1 %) 3) ;; 4
+
+(read-string "#(+ 1 %)") ;; (fn* [p1__25713#] (+ 1 p1__25713#))
+
+;; Reader Macros
+(read-string "'(a b c)") ;; (quote (a b c))
+
+(read-string "@var") ;; (clojure.core/deref var)
+
+(read-string "; ignore!\n(+1 2)") ;; (1 2)
+
+;; The Evaluator
+
+(if true :a :b) ;; :a
+
+(let [x 5]
+  (+ x 3)) ;; 8
+
+(def x 15)
+
+(let [x 5]
+  (+ x 3)) ;; 8
+
+(let [x 5]
+  (let [x 6]
+    (+ x 3))) ;; 9
+
+(defn exclaim
+  [exclamation]
+  (str exclamation "!"))
+
+(exclaim "Hadoken") ;; "Hadoken!"
+
+(map inc [1 2 3]) ;; (2 3 4)
+
+(read-string "+") ;; +
+
+(type (read-string "+")) ;; clojure.lang.Symbol
+
+(list (read-string "+") 1 2) ;; (+ 1 2)
+
+(eval (list (read-string "+") 1 2)) ;; 3
+
+;; Lists
+
+(eval (read-string "()")) ;; ()
+
+;; Special Forms
+(if true 1 2) ;; 1
+
+'(a b c) ;; (a b c)
+
+(quote (a b c)) ;; (a b c)
+
+;; Macros
+
+(read-string "(1 + 1)") ;; (1 + 1)
+
+;(eval (read-string "(1 + 1)"))
+;; ClassCastExceptiooon
+(let [infix (read-string "(1 + 1)")]
+  (list (second infix) (first infix) (last infix))) ;; (+ 1 1)
+
+(eval
+ (let [infix (read-string "(1 + 1)")]
+   (list (second infix) (first infix) (last infix)))) ;; 2
+
+;; Use of macro to clean this up
+(defmacro ignore-last-operand
+  [function-call]
+  (butlast function-call))
+
+(ignore-last-operand (+ 1 2 10)) ;; 3
+
+;; this will not print anything
+(ignore-last-operand (+ 1 2 (print "Look at me!!!")))
+;;=> 3
+
+(macroexpand '(ignore-last-operand (+ 1 2 10)))
+;; (+ 1 2)
+
+(macroexpand '(ignore-last-operand (+ 1 2 (println "look at me!!!"))))
+;; (+ 1 2)
+
+(defmacro infix
+  [infixed]
+  (list (second infixed)
+        (first infixed)
+        (last infixed)))
+
+(infix (1 + 2)) ;; 3
+
+;; Syntactic Abstraction and the -> Macro
+
+(defn read-resource
+  "Read a resource into a string"
+  [path]
+  (read-string (slurp (clojure.java.io/resource path))))
+
+(defn read-resource
+  [path]
+  (-> path
+      clojure.java.io/resource
+      slurp
+      read-string))


Add a macro discarding pass

Add a macro discarding pass

error: pathspec 'src/oxcart/passes/discard.clj' did not match any file(s) known to git

--- src/oxcart/passes/discard.clj
+++ src/oxcart/passes/discard.clj
@@ -0,0 +1,63 @@
+;;   Copyright (c) Reid McKenzie, Rich Hickey & contributors. The use
+;;   and distribution terms for this software are covered by the
+;;   Eclipse Public License 1.0
+;;   (http://opensource.org/licenses/eclipse-1.0.php) which can be
+;;   found in the file epl-v10.html at the root of this distribution.
+;;   By using this software in any fashion, you are agreeing to be
+;;   bound by the terms of this license.  You must not remove this
+;;   notice, or any other, from this software.
+
+(ns oxcart.passes.discard
+  {:doc "This namespace implements a number of form discarding passes
+        over the Oxcart module system."
+   :author "Reid McKenzie"
+   :added  "0.0.9"}
+  (:require [oxcart.util    :as util]
+            [oxcart.passes  :as passes]
+            [oxcart.pattern :as pattern]))
+
+
+(defn def->macro?
+  "λ AST → (U True False)
+
+  Predicate which indicates whether the argument AST is a macro. Only
+  returns true if the AST is both a def form and the def'd var has
+  the :meta tag."
+  [form]
+  {:pre [(map? form)]}
+  (-> form
+      (pattern/def->var)
+      (meta)
+      :macro
+      (or false)))
+
+
+(defn discard-forms
+  "Helper function to discard-macros, composes a number of predicates
+  in order to determine what forms should be discarded from the
+  argument whole-ast."
+  [whole-ast & preds]
+  {:pre [(map? whole-ast)
+         (:modules whole-ast)
+         (every? fn? preds)]}
+  (passes/update-forms
+   (fn [form]
+     (when (->> (map #(%1 form) preds)
+                (some identity))
+       form))))
+
+
+(defn discard-macros
+  "λ Whole-AST → Options → Whole-AST
+
+  This pass walks the input whole-ast discarding definitions of vars
+  marked as macros.
+
+  Options
+  -----------
+    This pass takes no options."
+  [whole-ast options]
+  (-> whole-ast
+      (passes/update-modules discard-forms def->macro?)
+      (passes/clobber-passes)
+      (passes/record-pass discard-macros)))


[WM] add voting-methods to message schemas

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/election-authority-works.git/'


optimized escape-html (~50% faster than Hiccup)

--- src/rum/server_render.clj
+++ src/rum/server_render.clj
@@ -14,12 +14,17 @@
     (.append sb s0)
     (.append sb s1)
     (.append sb s2))
-  ([^StringBuilder sb s0 s1 s2 & rest]
+  ([^StringBuilder sb s0 s1 s2 s3]
     (.append sb s0)
     (.append sb s1)
     (.append sb s2)
-    (doseq [s rest]
-      (.append sb s))))
+    (.append sb s3))
+  ([^StringBuilder sb s0 s1 s2 s3 s4]
+    (.append sb s0)
+    (.append sb s1)
+    (.append sb s2)
+    (.append sb s3)
+    (.append sb s4)))

 (defprotocol ToString
@@ -63,16 +68,35 @@
       (str/replace attr-str "-" ""))))

-(defn escape-html
-  "Change special characters into HTML character entities."
-  ^String [^String text]
-  (.. text
-    (replace "&"  "&")
-    (replace "<"  "<")
-    (replace ">"  ">")
-    (replace "\"" """)
-    (replace "'"  "'")))
-
+(defn escape-html [^String s]
+  (let [len (count s)]
+    (loop [^StringBuilder sb nil
+           i                 (int 0)]
+      (if (< i len)
+        (let [char (.charAt s i)
+              repl (case char
+                     \& "&"
+                     \< "<"
+                     \> ">"
+                     \" """
+                     \' "'"
+                     nil)]
+          (if (nil? repl)
+            (if (nil? sb)
+              (recur nil (inc i))
+              (recur (doto sb
+                       (.append char))
+                     (inc i)))
+            (if (nil? sb)
+              (recur (doto (StringBuilder.)
+                       (.append s 0 i)
+                       (.append repl))
+                     (inc i))
+              (recur (doto sb
+                       (.append repl))
+                     (inc i)))))
+        (if (nil? sb) s (str sb))))))
+

 (defn normalize-attrs [attrs]
   (->> (for [[k v] attrs


Extract site generating higher order functions

error: pathspec 'src/clj/comic_reader/sites/util.clj' did not match any file(s) known to git

--- src/clj/comic_reader/sites/util.clj
+++ src/clj/comic_reader/sites/util.clj
@@ -0,0 +1,14 @@
+(ns comic-reader.sites.util)
+
+(defn gen-link->map [process-name process-url]
+  (fn [{name :content
+        {url :href} :attrs}]
+    {:name (process-name name)
+     :url (process-url url)}))
+
+(defn gen-add-key-from-url [key extract-pattern & [process]]
+  (let [process (or process identity)]
+    (fn [{:keys [url] :as comic-map}]
+      (let [[_ data] (re-find extract-pattern url)]
+        (assoc comic-map
+               key (process data))))))


update services devcards to match new add to cart process

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/starcity-properties/odin.git/'


add pagination to manage orders

add pagination to manage orders


clarifying :help

clarifying :help

--- plugin/src/leiningen/figwheel.clj
+++ plugin/src/leiningen/figwheel.clj
@@ -372,7 +372,7 @@
     (println (str "Command Error: " (pr-str command)
                   " is not a known Figwheel command."))
     (println "  Known commands" (vec known-commands))
-    (println "  Run \"lein help figwheel\" for more info.")
+    (println "  Run \"lein figwheel :help\" for more info.")
     (print-suggestion command known-commands)
     true))


fix smoke-test by pointing it to the new url of the (old) api it uses

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tobiasbayer/lambdacd.git/'


need a test database

need a test database

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/vincentstorme/clojureme.git/'


Tests for deadletter starting

Tests for deadletter starting

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/acessocard/microscope.git/'


can now create directories if they don't exist

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/mail-works.git/'


refactor markdown options handling slightly

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clojurecup/cc2014-frontend.git/'


[EN] Make voter-registration-method optional


framework: choose offer for a group of units

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/pyr/bundes.git/'


Removed debug info

Removed debug info


add `:call-clerk` to acceptable registration methods

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/voter-registration-works.git/'


Initial cut at method to discover Ambly WebDAV endpoints using Bonjour

--- Clojure/src/ambly/repl/jsc.clj
+++ Clojure/src/ambly/repl/jsc.clj
@@ -10,6 +10,22 @@
   (:import java.net.Socket
            java.lang.StringBuilder
            [java.io File BufferedReader BufferedWriter IOException]))
+
+(defn discover-ambly-webdav-endpoints [timeout]
+  (let [discovered-endpoints (atom {})
+        ambly-service-name-prefix "Ambly WebDAV Server"
+        ^com.apple.dnssd.DNSSDService dns-sd-service
+        (com.apple.dnssd.DNSSD/browse "_http._tcp"
+          (reify com.apple.dnssd.BrowseListener
+            (serviceFound [this browser flags if-index service-name reg-type domain]
+              (when (.startsWith service-name ambly-service-name-prefix)
+                (swap! discovered-endpoints assoc service-name {})))
+            (serviceLost [this browser flags if-index service-name reg-type domain]
+              (when (.startsWith service-name ambly-service-name-prefix)
+                (swap! discovered-endpoints dissoc service-name)))))]
+    (Thread/sleep timeout)
+    (.stop dns-sd-service)
+    @discovered-endpoints))

 (defn socket [host port]
   (let [socket (Socket. host port)


Support for url as image src

Support for url as image src

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nvbn/rerenderer.git/'


multi-spec example

multi-spec example

error: pathspec 'src/spec_examples/geometry.clj' did not match any file(s) known to git

--- src/spec_examples/geometry.clj
+++ src/spec_examples/geometry.clj
@@ -0,0 +1,30 @@
+(ns spec-examples.geometry
+  (:require [clojure.spec.alpha :as s]))
+
+(s/def ::type keyword?)
+(s/def ::radius number?)
+(s/def ::side-a number?)
+(s/def ::side-b number?)
+(s/def ::side-c number?)
+
+(defmulti shape-type ::type)
+(defmethod shape-type ::sphere [_]
+  (s/keys :req [::radius]))
+(defmethod shape-type ::cube [_]
+  (s/keys :req [::side-a]))
+(defmethod shape-type ::cuboid [_]
+  (s/keys :req [::side-a ::side-b ::side-c]))
+
+(s/def ::shape (s/multi-spec shape-type ::type))
+
+(s/fdef volume
+        :args (s/cat :shape ::shape)
+        :ret number?)
+
+(defmulti volume ::type)
+(defmethod volume ::sphere [{::keys [radius]}]
+  (* 4/3 Math/PI radius radius radius))
+(defmethod volume ::cube [{::keys [side-a]}]
+  (* side-a side-a side-a))
+(defmethod volume ::cuboid [{::keys [side-a side-b side-c]}]
+  (* side-a side-b side-c))