Nearly working arity reduction code

Nearly working arity reduction code

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

--- src/oxcart/passes/fn_reduction.clj
+++ src/oxcart/passes/fn_reduction.clj
@@ -0,0 +1,211 @@
+;;   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.fn-reduction
+  {:doc "This namespace implements a multi-arity to single arity
+        reduction over functions intended for use in enabling static
+        method/function emission and other transformations."
+   :author "Reid McKenzie"
+   :added "0.0.11"}
+  (:require [oxcart.util :refer :all]
+            [oxcart.passes :refer :all]
+            [oxcart.passes.lambda-lift :refer [lift-lambdas]]
+            [oxcart.pattern :as pattern]
+            [clojure.tools.analyzer.passes.jvm.emit-form :refer [emit-form]]))
+
+
+(defn update-through-meta
+  "(λ {A → B} → ((λ B → args*) → C) → args*) → {A → C}
+
+  A wrapper around oxcart.util/update which will reach through
+  {:op :with-meta} nodes as if they don't exist. This allows AST
+  transforms to do updates preserving with-meta operations without
+  explicitly handling the possibility of metadata."
+  [{:keys [op] :as ast} f & args]
+  (if (= op :with-meta)
+    (apply update ast :expr f args)
+    (apply f ast args)))
+
+
+(defn munge-symbol
+  "Stub subject to change based on what TANAL permits, the issue is
+  going to be symbol vs. var type in the AST. Munging vars is gonna be
+  a bitch, munging symbols could happen."
+  [sym arity vardic]
+  (symbol
+   (str sym "$arity$" arity
+        (when vardic
+          "+"))))
+
+
+(defn munge-fn-name
+  [wrapping-def
+   {:keys [params] :as method}]
+  (munge-symbol
+   (pattern/def->symbol wrapping-def)
+   (count params)
+   (some :vardic params)))
+
+
+(defn munge-callsite
+  "λ Invoke-AST → Invoke-AST
+
+  This function rewrites invoke AST nodes, returning a new invoke node
+  which targets an arity munged function."
+  [ast]
+  )
+
+
+(defn fn-is-multiple-arity?
+  "λ AST → Boolean
+
+  Returns true if and only of the argument AST is both a function node
+  and a function of more than one arity."
+  [{:keys [op methods]}]
+  (and (= op :fn)
+       (> (count methods) 1)))
+
+
+(defn promote-method
+  "λ AST → List → Env → AST
+
+  raw-method   is a raw list form
+  env          is the containing environment
+  wrapping-def is the def this is being lifted from
+
+  Builds and yields a new AST representing a fn with a munged name
+  having the provided method body for its only arity."
+  [wrapping-def raw-method env]
+  (let [new-name (munge-symbol
+                  (pattern/def->symbol wrapping-def)
+                  (count (first raw-method))
+                  (some (partial = '&) (first raw-method)))]
+    (ast `(def ~new-name
+            (fn* ~raw-method))
+         env)))
+
+
+(defn write-body
+  [wrapping-def
+   raw-method
+   {:keys [env] :as promoted-method}]
+  (let [[params & forms] raw-method
+        new-params       (for [p params
+                               :when (not (= p '&))]
+                           (gensym "OX__P"))
+
+       vardic?          (some (partial = '&) params)
+
+        new-form         (if vardic?
+                           (list (vec (concat (butlast new-params) ['&] [(last new-params)]))
+                                 (concat (list 'apply)
+                                         (list (pattern/def->symbol promoted-method))
+                                         new-params))
+                           (list (vec new-params)
+                                 (concat (list (pattern/def->symbol promoted-method))
+                                         new-params)))]
+
+    new-form))
+
+
+(defn rewrite-fn
+  [{:keys [methods env] :as fn-ast} wrapping-def prefix-forms-atom]
+  (if (not (or (pattern/fn? fn-ast)
+               (fn-is-multiple-arity? fn-ast)))
+    ast
+    (let [[_fn & methods] (emit-form fn-ast)
+          [name methods]  (take-when symbol? methods)
+          name            (pattern/def->symbol fn-ast)
+
+          fdecl    (when name
+                     (ast `(def ~name ~(pattern/def->symbol wrapping-def))
+                          env))
+
+          promotes (mapv (fn [m]
+                           (promote-method wrapping-def m env))
+                         methods)
+
+          new-fn   (if name
+                     `(fn* ~name
+                           ~@(map
+                              (partial write-body wrapping-def)
+                              methods
+                              promotes))
+                     `(fn* ~@(map
+                              (partial write-body wrapping-def)
+                              methods
+                              promotes)))]
+
+      (reset! prefix-forms-atom
+              (if name
+                (cons fdecl promotes)
+                promotes))
+
+      (ast new-fn env))))
+
+
+(defn rewrite-fn-decls
+  "λ AST → (atom {Var → (λ int → Var)}) → (U AST (Vec AST))
+
+  Rewrites top level forms into one or more top level forms. If a top
+  level form is the def of a fn with multiple arities, the def is
+  rewritten into N defs, one for each arity of the fn. The original
+  def is rewritten to be static arity based dispatch to the rewritten
+  member arities.
+
+  Because this function is a delegate of the reduce-fn-arities pass
+  which requires the lambda-lifting pass, when this function is run
+  the input program can contain no fns which are _not_ top level as
+  the lambda lifting pass rewrites all fns to the top level.
+
+  Thus it is correct for this pass to handle only those fns which are
+  bound with defs, as by the requirement of lambda lifting this must
+  be the set of all fns in the input program."
+  [ast munged-fns-atom]
+  (if-not (pattern/def? ast)
+    ast
+    (let [top-level-forms (atom [])
+          new-fn-ast      (rewrite-fn (get ast :init)
+                                      ast top-level-forms)]
+
+      (-> @top-level-forms
+          vec
+          (conj (assoc ast :init new-fn-ast))))))
+
+
+(defn reduce-fn-arities
+  "λ Whole-AST → Options → Whole-AST
+
+  This pass walks the argument AST, examining function definitions and
+  rewriting multiple arity functions into single arity functions when
+  possible. Note that functions already of a single arity are not
+  rewritten.
+
+  In order to be arity reduced, a fn must
+   1. Never be taken as a value
+   2. Never be the target of an apply invocation
+
+  Functions which are reduced become tagged with ^:single and
+  ^:static metadata.
+
+  Options
+  -----------
+    This pass takes no options"
+  [whole-ast options]
+  (let [munged-fns (atom #{})]
+    (-> whole-ast
+        (require-pass lift-lambdas)
+        (update-forms rewrite-fn-decls   munged-fns)
+        (update-forms rewrite-fn-invokes munged-fns)
+        ;; FIXME
+        ;;   Is this something I need to do? Are there cases in which
+        ;;   this analysis is itself desructive? all existing fns,
+        ;;   defs and vars should be preserved by this.
+        (clobber-passes)
+        (record-pass reduce-fn-arities))))


Problem 0033

Problem 0033

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

--- src/project_euler/problem_0033.clj
+++ src/project_euler/problem_0033.clj
@@ -0,0 +1,37 @@
+(ns project-euler.problem-0033)
+
+;; The fraction 49/98 is a curious fraction, as an inexperienced mathematician
+;; in attempting to simplify it may incorrectly believe that 49/98 = 4/8, which is correct,
+;; is obtained by cancelling the 9s.
+
+;; We shall consider fractions like, 30/50 = 3/5, to be trivial examples.
+
+;; There are exactly four non-trivial examples of this type of fraction,
+;; less than one in value, and containing two digits in the numerator and denominator.
+
+;; If the product of these four fractions is given in its lowest common terms,
+;; find the value of the denominator.
+
+(defn the-2-digits
+  [n]
+  [(quot n 10) (rem n 10)]
+  )
+
+(defn solution []
+  (->> (for [n (range 11 100) d (range (inc n) 100)] [n d])
+       (filter (fn [[n d]]                    (not (== 0 (rem n 11)))))
+       (map    (fn [[n d]]                    [[n d] (the-2-digits n) (the-2-digits d)]))
+       (filter (fn [[[n d] [n1 n0] [d1 d0]]]  (not (== 0 (* n0 d0)))))
+       (mapcat (fn [[[n d] [n1 n0] [d1 d0]]]  (concat (when (== n0 d1) [[[n d] (/ n1 d0)]])
+                                                      (when (== n1 d0) [[[n d] (/ n0 d1)]]))))
+       (filter (fn [[[n d] qd]]               (== (/ n d) qd)))
+       (map    (fn [[[n d] qd]]               qd))
+       (reduce *)
+       (denominator)
+       ))
+
+(solution)
+
+;;-> 100
+
+


Don't send authority-type to e-a-w for states

Doesn't make sense in this context.

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/voting-method-works.git/'


[TH] construct proper ocd-id for DC

[TH] construct proper ocd-id for DC


add tests for templates

add tests for templates

error: pathspec 'test/aspire/templates_test.clj' did not match any file(s) known to git

--- test/aspire/templates_test.clj
+++ test/aspire/templates_test.clj
@@ -0,0 +1,26 @@
+(ns aspire.templates-test
+  (:require [net.cgrand.enlive-html :as en]
+            [aspire.templates :refer :all]
+            [clojure.test :refer :all]))
+
+;; TODO: en/emit* and beautify the HTML in each test for human readability here?
+(deftest onboarding-templates-test
+  (testing "onboarding"
+    (testing "snippets"
+      (testing "onboarding-header"
+        (is (= (onboarding-header 1 "a" "b")
+               '({:tag :nav, :attrs {:id "top-bar"}, :content ["\n        " {:tag :header, :attrs {:id "logo"}, :content ["\n          " {:tag :h1, :attrs nil, :content ["\n            Logo\n          "]} "\n        "]} "\n        " {:tag :a, :attrs {:id "side-nav-control", :href "#", :data-active "false"}, :content ["Menu"]} {:tag :a, :attrs {:id "search-control", :href "#", :data-active "true"}, :content ["Search"]} "\n        " {:tag :ul, :attrs nil, :content ["\n          " {:tag :li, :attrs {:class "alerts"}, :content ["\n            " {:tag :a, :attrs {:href "/alerts"}, :content ["Alerts " {:tag :span, :attrs {:class "alert-count"}, :content ["1"]}]} "\n          "]} "\n          " {:tag :li, :attrs {:class "profile"}, :content ["\n            " {:tag :img, :attrs {:src "", :alt ""}, :content []} {:tag :a, :attrs {:href "a"}, :content ["b"]} "\n          "]} "\n          " {:tag :li, :attrs {:class "logout"}, :content ["\n            " {:tag :a, :attrs {:href "/logout"}, :content ["Logout"]} "\n          "]} "\n        "]} "\n      "]}))))
+
+      (testing "onboarding-intro"
+        (is (= (onboarding-intro "a" "b")
+               '({:tag :div, :attrs {:class "intro"}, :content ["\n        " {:tag :h2, :attrs nil, :content ["a"]} "\n        " {:tag :p, :attrs nil, :content ("b")} "\n      "]})
+               )))
+
+      (testing "onboarding-step"
+        (is (= (onboarding-step 1 "desc")
+               '({:tag :li, :attrs {:class "step-1"}, :content ["\n          " {:tag :strong, :attrs nil, :content ["Step 1"]} " " {:tag :span, :attrs nil, :content ("desc")} "\n        "]})))))
+
+    (testing "template"
+      (is (= (onboarding 1 "a" "b" "c" "d" ["step1" "step2" "step3"])
+             '("<!DOCTYPE html>\n" "" "" "" "" "<" "html" ">" "<" "head" ">" "\n  " "<" "meta" " " "charset" "=\"" "utf-8" "\"" " />" "\n  " "<" "meta" " " "http-equiv" "=\"" "X-UA-Compatible" "\"" " " "content" "=\"" "IE=edge,chrome=1" "\"" " />" "\n  " "<" "title" ">" "Onboarding Page" "</" "title" ">" "\n  " "<" "meta" " " "name" "=\"" "description" "\"" " " "content" "=\"" "" "\"" " />" "\n  " "<" "meta" " " "name" "=\"" "viewport" "\"" " " "content" "=\"" "width=device-width" "\"" " />" "\n  " "<" "link" " " "type" "=\"" "text/css" "\"" " " "rel" "=\"" "stylesheet" "\"" " " "media" "=\"" "screen" "\"" " " "href" "=\"" "assets/stylesheets/global.css" "\"" " />" "<" "script" " " "type" "=\"" "text/javascript" "\"" " " "src" "=\"" "assets/javascripts/libs/modernizr.js" "\"" "></" "script" ">" "\n  " "</" "head" ">" "<" "body" " " "id" "=\"" "onboarding" "\"" " " "data-search-active" "=\"" "true" "\"" ">" "\n    " "<" "main" " " "role" "=\"" "main" "\"" " " "id" "=\"" "content" "\"" ">" "<" "div" " " "class" "=\"" "intro" "\"" ">" "\n        " "<" "h2" ">" "c" "</" "h2" ">" "\n        " "<" "p" ">" "d" "</" "p" ">" "\n      " "</" "div" ">" "\n      " "<" "ol" " " "class" "=\"" "onboarding-steps" "\"" ">" "<" "li" " " "class" "=\"" "step-1" "\"" ">" "\n          " "<" "strong" ">" "Step 1" "</" "strong" ">" " " "<" "span" ">" "step1" "</" "span" ">" "\n        " "</" "li" ">" "<" "li" " " "class" "=\"" "step-1" "\"" ">" "\n          " "<" "strong" ">" "Step 2" "</" "strong" ">" " " "<" "span" ">" "step2" "</" "span" ">" "\n        " "</" "li" ">" "<" "li" " " "class" "=\"" "step-1" "\"" ">" "\n          " "<" "strong" ">" "Step 3" "</" "strong" ">" " " "<" "span" ">" "step3" "</" "span" ">" "\n        " "</" "li" ">" "</" "ol" ">" "\n      " "<" "nav" " " "id" "=\"" "top-bar" "\"" ">" "\n        " "<" "header" " " "id" "=\"" "logo" "\"" ">" "\n          " "<" "h1" ">" "\n            Logo\n          " "</" "h1" ">" "\n        " "</" "header" ">" "\n        " "<" "a" " " "id" "=\"" "side-nav-control" "\"" " " "href" "=\"" "#" "\"" " " "data-active" "=\"" "false" "\"" ">" "Menu" "</" "a" ">" "<" "a" " " "id" "=\"" "search-control" "\"" " " "href" "=\"" "#" "\"" " " "data-active" "=\"" "true" "\"" ">" "Search" "</" "a" ">" "\n        " "<" "ul" ">" "\n          " "<" "li" " " "class" "=\"" "alerts" "\"" ">" "\n            " "<" "a" " " "href" "=\"" "/alerts" "\"" ">" "Alerts " "<" "span" " " "class" "=\"" "alert-count" "\"" ">" "1" "</" "span" ">" "</" "a" ">" "\n          " "</" "li" ">" "\n          " "<" "li" " " "class" "=\"" "profile" "\"" ">" "\n            " "<" "img" " " "src" "=\"" "" "\"" " " "alt" "=\"" "" "\"" " />" "<" "a" " " "href" "=\"" "a" "\"" ">" "b" "</" "a" ">" "\n          " "</" "li" ">" "\n          " "<" "li" " " "class" "=\"" "logout" "\"" ">" "\n            " "<" "a" " " "href" "=\"" "/logout" "\"" ">" "Logout" "</" "a" ">" "\n          " "</" "li" ">" "\n        " "</" "ul" ">" "\n      " "</" "nav" ">" "\n    " "</" "main" ">" "\n    " "<" "form" " " "id" "=\"" "search" "\"" " " "data-active" "=\"" "true" "\"" " " "action" "=\"" "/search-results-alt/" "\"" ">" "\n      " "<" "h2" ">" "\n        Search for classes & competencies\n      " "</" "h2" ">" "\n      " "<" "input" " " "type" "=\"" "search" "\"" " " "placeholder" "=\"" "Search..." "\"" " />" "<" "button" " " "type" "=\"" "submit" "\"" " " "class" "=\"" "button-large" "\"" ">" "Search" "</" "button" ">" "\n    " "</" "form" ">" "\n    " "<" "nav" " " "role" "=\"" "navigation" "\"" " " "id" "=\"" "side-nav" "\"" " " "data-active" "=\"" "false" "\"" ">" "\n      " "<" "ul" ">" "\n        " "<" "li" " " "class" "=\"" "dashboard-nav" "\"" ">" "\n          " "<" "a" " " "href" "=\"" "dashboard" "\"" ">" "Dashboard" "</" "a" ">" "\n        " "</" "li" ">" "\n        " "<" "li" " " "class" "=\"" "competencies-nav" "\"" ">" "\n          " "<" "a" " " "href" "=\"" "competencies" "\"" ">" "Competencies" "</" "a" ">" "\n        " "</" "li" ">" "\n        " "<" "li" " " "class" "=\"" "learning-map-nav" "\"" ">" "\n          " "<" "a" " " "href" "=\"" "learning-map" "\"" ">" "Learning Map" "</" "a" ">" "\n        " "</" "li" ">" "\n        " "<" "li" " " "class" "=\"" "transcript-nav" "\"" ">" "\n          " "<" "a" " " "href" "=\"" "transcript" "\"" ">" "Transcript" "</" "a" ">" "\n        " "</" "li" ">" "\n      " "</" "ul" ">" "\n    " "</" "nav" ">" "\n    " "<" "footer" " " "role" "=\"" "contentinfo" "\"" "></" "footer" ">" "\n    " "<" "script" " " "type" "=\"" "text/javascript" "\"" " " "src" "=\"" "assets/javascripts/libs/jquery.js" "\"" "></" "script" ">" "\n    " "<" "script" " " "type" "=\"" "text/javascript" "\"" " " "src" "=\"" "assets/javascripts/global.js" "\"" "></" "script" ">" "\n  " "</" "body" ">" "\n" "</" "html" ">"))))))
+


Remove extraneous container.clj

Remove extraneous container.clj

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/kkroening/jackal.git/'


improve logic for noticing when there are no fields

fields is always coerced into an empty vector, so it's never nil

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/'


make fields regular-size instead of small


add missing whitespace

add missing whitespace


Mark some types with :no-doc true in exception monad ns.

--- src/cljx/cats/monad/exception.cljx
+++ src/cljx/cats/monad/exception.cljx
@@ -237,14 +237,16 @@
     #+cljs
     (catch js/Error e (failure e))))

-(defn exec-try-or-else
+(defn ^{:no-doc true}
+  exec-try-or-else
   [func defaultvalue]
   (let [result (exec-try-on func)]
     (if (failure? result)
       (success defaultvalue)
       result)))

-(defn exec-try-or-recover
+(defn ^{:no-doc true}
+  exec-try-or-recover
   [func recoverfn]
   (let [result (exec-try-on func)]
     (with-monad exception-monad
@@ -287,7 +289,7 @@
 ;; Monad definition
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-(def ^{:doc "The exception monad type definition."}
+(def ^{:no-doc true}
   exception-monad
   (reify
     proto/Functor


Comparison sheet finished

Comparison sheet finished

error: pathspec 'src/aerobio/validate/compsheet.clj' did not match any file(s) known to git

--- src/aerobio/validate/compsheet.clj
+++ src/aerobio/validate/compsheet.clj
@@ -0,0 +1,155 @@
+(ns aerobio.validate.compsheet
+  (:require
+   [clojure.pprint :refer [pprint]]
+   [clojure.spec.alpha :as s]
+   [phrase.alpha :as p
+    :refer [defphraser phrase phrase-first]]
+
+   [clojure.data.csv :as csv]
+   [clojure.string :as cljstr]
+   [aerial.utils.string :as str]
+   [aerial.fs :as fs]
+
+   [aerobio.params :as pams]
+   [aerobio.validate.common :as vc
+    :refer [validate-msg make-validator bases? cols->maps
+            set-exp-sheet-data get-exp-sheet-data]]
+   [aerobio.htseq.common :as ac]))
+
+
+;;; ComparisonSheet.csv
+
+;;; sample names section
+
+(defn sample-name? [x]
+  (contains? (get-exp-sheet-data (x :EID) :sampnames) (x :nm)))
+
+(defn efstg? [s] (re-matches #"(^(?![\s\S])|[0-9]+|[0-9]+\.[0-9+])" s))
+
+(s/def ::sampx sample-name?)
+(s/def ::sampy sample-name?)
+(s/def ::ef efstg?)
+(s/def ::efs (s/coll-of ::ef :kind vector?))
+(s/def ::comprec (s/keys :req-un [::sampx ::sampy] :opt-un [::efs]))
+
+(p/defphraser sample-name?
+  [_ problem]
+  (format "`%s` is not a sample listed in Exp-SampleSheet"
+          (-> problem :val :nm)))
+
+(p/defphraser efstg?
+  [_ problem]
+  (format "`%s` must be empty or digits or digits.digits. Ex 122 or 202.12"
+          (-> problem :val)))
+
+(def validate-comp-rec (make-validator ::comprec :sep "\n"))
+
+
+(s/def ::comprecs (s/coll-of ::comprec :kind vector?))
+
+(def validate-comp-recs (make-validator ::comprecs :sep "\n"))
+
+
+(defn validate-comp-sheet [comprecs]
+  (->> comprecs
+       validate-comp-recs
+       (str/split #"\n")
+       (filter not-empty)
+       (map #(format " %s. %s" %1 %2) (iterate inc 1))
+       (cljstr/join "\n")))
+
+
+;;; WGseq section
+
+(defn Isample-name? [x]
+  (contains? (get-exp-sheet-data (x :EID) :Isampnames) (x :Inm)))
+
+(defn strain? [x]
+  (contains? (get-exp-sheet-data (x :EID) :strains) (x :strain)))
+
+(s/def ::Isamp Isample-name?)
+(s/def ::strain strain?)
+(s/def ::wgcomprec (s/keys :req-un [::Isamp ::strain]))
+
+(p/defphraser Isample-name?
+  [_ problem]
+  (format "`%s` is not a sample listed in SampleSheet"
+          (-> problem :val :Inm)))
+
+(p/defphraser strain?
+  [_ problem]
+  (format "`%s` is not a strain listed in Exp-SampleSheet ncxref section"
+          (-> problem :val :strain)))
+
+(def validate-wgcomp-rec (make-validator ::wgcomprec :sep "\n"))
+
+(s/def ::wgcomprecs (s/coll-of ::wgcomprec :kind vector?))
+
+(def validate-wgcomp-recs (make-validator ::wgcomprecs :sep "\n"))
+
+(defn validate-wgcomp-sheet [comprecs]
+  (->> comprecs
+       validate-wgcomp-recs
+       (str/split #"\n")
+       (filter not-empty)
+       (map #(format " %s. %s" %1 %2) (iterate inc 1))
+       (cljstr/join "\n")))
+
+
+;;; Main - validate general comparison sheet)
+
+(defn validate-wgcomparison-sheet
+  [EID rows]
+  (let [cols [:sampname :refname]
+        recs (cols->maps cols rows)
+        recs (mapv (fn[m] {:Isamp {:EID EID :Inm (m :sampname)}
+                          :strain {:EID EID :strain (m :refname)}
+                          :EID EID})
+                   recs)]
+    (validate-wgcomp-sheet recs)))
+
+(defn validate-rtcomparison-sheet
+  [EID rows]
+  (let [tnseq? (= (ac/get-exp-info EID :exp) :tnseq)
+        cols [:sampx :sampy]
+        efs (when tnseq?
+              (mapv #(vec (drop 2 %)) rows))
+        recs (cols->maps cols rows)
+        recs (mapv (fn[m] {:sampx {:EID EID :nm (m :sampx)}
+                          :sampy {:EID EID :nm (m :sampy)}
+                          :EID EID})
+                   recs)
+        recs (if (not tnseq?)
+               recs
+               (mapv #(assoc %1 :efs %2) recs efs))]
+    (validate-comp-sheet recs)))
+
+(defn validate-comparison-sheet
+  ([EID compname]
+   (let [compsheet (fs/join (pams/get-params :nextseq-base)
+                            EID compname)
+         rows (->> compsheet slurp csv/read-csv rest)
+         exp (ac/get-exp-info EID :exp)
+         vstg (cond
+                (= exp :wgseq) (validate-wgcomparison-sheet EID rows)
+                :else (validate-rtcomparison-sheet EID rows))]
+     (with-out-str
+       (when (not (empty? vstg))
+         (print (format "%s has errors\n" compsheet)))
+       (print vstg))))
+  ([EID]
+   (validate-comparison-sheet EID "ComparisonSheet.csv")))
+
+
+(comment
+
+  (def EID "181013_NS500751_0092_AH57C5BGX9")
+  (def EID "190218_NS500751_0120_AHNK5TBGX9")
+  (fs/join "/NextSeq2/" EID "Exp-SampleSheet.csv")
+
+  (validate-comp-sheet EID)
+
+  (def EID "190109_NS500751_0113_AHFCW3AFXY")
+  (print (validate-comparison-sheet EID))
+
+  )


tests

tests

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/mstang/pathdatabase.git/'


fix(request) adding 'accept-encoding' to headers blacklist

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/B2W-BIT/restQL-server.git/'


filter mention options typing

filter mention options typing


eliminate warning

eliminate warning

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/QuiltProject/sedan.git/'


Problem 0080.

Problem 0080.

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

--- src/project_euler/problem_0080.clj
+++ src/project_euler/problem_0080.clj
@@ -0,0 +1,33 @@
+(ns project-euler.problem_0080)
+
+;; It is well known that if the square root of a natural number is not an integer, then it is irrational.
+;; The decimal expansion of such square roots is infinite without any repeating pattern at all.
+
+;; The square root of two is 1.41421356237309504880...,
+;; and the digital sum of the first one hundred decimal digits is 475.
+
+;; For the first one hundred natural numbers,
+;; find the total of the digital sums of the first one hundred decimal digits for all the irrational square roots.
+
+(defn one-digit-from-sqrt [x y step d]
+  (let [y' (+ y step)
+        d' (inc d)]
+    (if (< (* y' y') x)
+      (recur x y' step d')
+      [y d])))
+
+(defn sqrt-digits [x]
+  (loop [y 0M, step 1M, ds [], n 0]
+    (if (== n 100)
+      ds
+      (let [[y' d] (one-digit-from-sqrt x y step 0)]
+        (recur y' (/ step 10) (conj ds d) (inc n)))
+      )))
+
+(defn solution []
+  (->> (clojure.set/difference (set (for [i (range 100)] i)) (set (for [i (range 10)] (* i i))))
+       (map (fn [x] (apply + (sqrt-digits x))))
+       (apply +)
+       ))
+
+;;-> 40886


Problem 0123.

Problem 0123.

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


Added example of with-translation/rotation usage

error: pathspec 'examples/example2.clj' did not match any file(s) known to git

--- examples/example2.clj
+++ examples/example2.clj
@@ -0,0 +1,56 @@
+;; processing example
+
+(ns p5-example2
+  (:use rosado.processing)
+  (:import (javax.swing JFrame JLabel JTextField JButton))
+  (:import (processing.core PApplet)))
+
+
+;; here's a function which will be called by Processing's (PApplet)
+;; draw method every frame. Place your code here. If you eval it
+;; interactively, you can redefine it while the applet is running and
+;; see effects immediately
+
+(defn fancy-draw
+  "Example usage of with-translation and with-rotation."
+  [dst]
+	(background-float 125)
+	(stroke-float 10)
+	(fill-float (rand-int 125) (rand-int 125) (rand-int 125))
+	(with-translation [(/ 200 2) (/ 200 2)]
+										(with-rotation [QUARTER_PI]
+																	 (begin-shape)
+																	 (vertex -50  50)
+																	 (vertex  50  50)
+																	 (vertex  50 -50)
+																	 (vertex -50 -50)
+																	 (end-shape CLOSE)))
+  (filter-kind INVERT)
+  (framerate 10))
+
+;; below, we create an PApplet proxy and override setup() and draw()
+;; methods. Then we put the applet into a window and display it.
+
+(def p5-applet
+	 (proxy [PApplet] []
+	   (setup []
+			  (binding [*applet* this]
+				(size 200 200)
+				(smooth)
+				(no-stroke)
+				(fill 226)
+				(framerate 10)))
+	   (draw []
+			 (binding [*applet* this]
+			   (fancy-draw this)))))
+
+(.init p5-applet)
+
+(def swing-frame (JFrame. "Processing with Clojure"))
+(doto swing-frame
+	(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
+	(.setSize 200 200)
+	(.add p5-applet)
+	(.pack)
+	(.show))
+


Add synchronous tests for Dynamo

Add synchronous tests for Dynamo

error: pathspec 'test/eulalie/test/dynamo/sync.cljc' did not match any file(s) known to git

--- test/eulalie/test/dynamo/sync.cljc
+++ test/eulalie/test/dynamo/sync.cljc
@@ -0,0 +1,29 @@
+(ns eulalie.test.dynamo.sync
+  (:require [eulalie.core :as eulalie]
+            #? (:clj
+                [clojure.test :refer [deftest is]]))
+  #? (:cljs (:require-macros [cemerick.cljs.test :refer [deftest is]])))
+
+(def table :eulalie-test-table)
+
+(deftest transform-body
+  (is (= (str "{\"TableName\":\"" (name table) "\"}")
+         (eulalie/transform-request-body
+          {:service :dynamo :body {:table-name table}}))))
+
+(deftest transform-response-body
+  (is (= {:table-name table}
+         (eulalie/transform-response-body
+          {:request {:service :dynamo}
+           :body (str "{\"TableName\":\"" (name table) "\"}")}))))
+
+(deftest transform-body-unicode
+  (is (= "{\"TableName\":\"\u00a5123Hello\"}"
+         (eulalie/transform-request-body
+          {:service :dynamo :body {:table-name "\u00a5123Hello"}}))))
+
+(deftest transform-response-body-unicode
+  (is (= {:table-name (keyword "\u00a5123Hello")}
+         (eulalie/transform-response-body
+          {:request {:service :dynamo}
+           :body "{\"TableName\":\"\u00a5123Hello\"}"}))))


Add job flow for general rnaseq comparisons

error: pathspec 'Jobs/rnaseq-compare-job-template.clj' did not match any file(s) known to git

--- Jobs/rnaseq-compare-job-template.clj
+++ Jobs/rnaseq-compare-job-template.clj
@@ -0,0 +1,10 @@
+
+{:nodes
+ {:comp
+  {:name "gen-feature-counts",
+   :type "tool",
+   :args []}
+  :prn1 {:type "func",
+         :name "prn"}},
+ :edges
+ {:comp [:prn1]}}


Add ability to chop part of sprite with `image` primitive

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/'


fix user.clj to not depend on fhirterm.system on startup

this fix compiling issues of Java 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/fhirbase/fhirterm.git/'


Add cross-compilable model namespace.

Add cross-compilable model namespace.

error: pathspec 'src/cljx/model.cljx' did not match any file(s) known to git

--- src/cljx/model.cljx
+++ src/cljx/model.cljx
@@ -0,0 +1,5 @@
+(ns sptcg.model)
+
+(def cardbase [{:name "Creature" :type :creature}
+               {:name "Sorcery" :type :spell}
+               {:name "Land" :type :land}])


new, hopefully faster equivalence algorithm

error: pathspec 'src/latte/kernel/equiv.clj' did not match any file(s) known to git

--- src/latte/kernel/equiv.clj
+++ src/latte/kernel/equiv.clj
@@ -0,0 +1,144 @@
+(ns latte.kernel.equiv
+
+  "A fast(er) equivalence algorithm."
+
+  (:require [latte.kernel.syntax :as stx]
+            [latte.kernel.norm :as norm]))
+
+
+
+(defn mkfresh-id [vmap]
+  (count vmap))
+
+(declare beta-equiv-args)
+(defn beta-equiv
+  ([def-env ctx t1 t2] (beta-equiv def-env ctx t1 t2 {} {}))
+  ([def-env ctx t1 t2 vmap1 vmap2]
+
+    (cond
+      ;; both terms are references
+      (and (stx/ref? t1)
+           (stx/ref? t2))
+      (let [[name1 & args1] t1
+            [name2 & args2] t2]
+        (if (and (= name1 name2)
+                 (beta-equiv-args def-env ctx args1 args2 vmap1 vmap2))
+          [:ok {}]
+          (let [[t1' red1?] (norm/delta-reduction def-env t1)
+                [t2' red2?] (norm/delta-reduction def-env t2)]
+            (if (or (red1? red2?))
+              (recur def-env ctx t1' t2' vmap1 vmap2)
+              [:ko {:msg "Mismatch references"
+                    :term1 t1
+                    :term2 t2}]))))
+
+      ;; only the left term is a reference
+      (stx/ref? t1)
+      (let [[t1' red?] (norm/delta-reduction def-env t1)]
+        (if red?
+          (recur def-env ctx t1' t2 vmap1 vmap2)
+          [:ko {:msg "Term1 not delta-reducible"
+                :term1 t1
+                :term2 t2}]))
+      ;; only the right term is a reference
+      (stx/ref? t2)
+      (let [[t2' red?] (norm/delta-reduction def-env t2)]
+        (if red?
+          (recur def-env ctx t1 t2' vmap1 vmap2)
+          [:ko {:msg "Term2 not delta-reducible"
+                :term1 t1
+                :term2 t2}]))
+      ;; hitherto there is no reference, neither on the left nor on the right
+      ;; now we handle the beta-redex
+
+      ;; left term is a redex
+      (norm/redex? t1)
+      (recur def-env ctx (norm/beta-reduction t1) t2 vmap1 vmap2)
+
+      ;; right term is a redex
+      (norm/redex? t2)
+      (recur def-env ctx t1 (norm/beta-reduction t2) vmap1 vmap2)
+
+      ;; kind
+      (and (stx/kind? t1)
+           (stx/kind? t2))
+      [:ok {}]
+
+      ;; type
+      (and (stx/type? t1)
+           (stx/type? t2))
+      [:ok {}]
+
+      ;; variable
+      (and (stx/variable? t1)
+           (stx/variable? t2))
+
+      (if (= (get vmap1 t1)
+             (get vmap2 t2))
+        [:ok {}]
+        [:ko {:msg "Mismatch variables"
+              :term1 t1
+              :term2 t2}])
+
+      ;; lambda
+      (and (stx/lambda? t1)
+           (stx/lambda? t2))
+
+      (let [[_ [v1 ty1] body1] t1
+            [_ [v2 ty2] body2] t2]
+        (let [[status info] (beta-equiv def-env ctx ty1 ty2 vmap1 vmap2)]
+          (if (= status :ko)
+            [status info]
+            ;;  XXX: is this working?
+            (let [id (mkfresh-id vmap1)]
+              (recur def-env ctx body1 body2 (assoc vmap1 v1 id) (assoc vmap2 v2 id))))))
+
+      ;; product
+      (and (stx/prod? t1)
+           (stx/prod? t2))
+
+      (let [[_ [v1 ty1] body1] t1
+            [_ [v2 ty2] body2] t2]
+        (let [[status info] (beta-equiv def-env ctx ty1 ty2 vmap1 vmap2)]
+          (if (= status :ko)
+            [status info]
+            ;;  XXX: is this working?
+            (let [id (mkfresh-id vmap1)]
+              (recur def-env ctx body1 body2 (assoc vmap1 v1 id) (assoc vmap2 v2 id))))))
+
+
+      ;; application
+      (and (stx/app? t1)
+           (stx/app? t2))
+
+      (let [[rator1 rand1] t1
+            [rator2 rand2] t2]
+        (let [[status info] (beta-equiv def-env ctx rator1 rator2 vmap1 vmap2)]
+          (if (= status :ko)
+            [status info]
+            (recur def-env ctx rand1 rand2 vmap1 vmap2))))
+
+      :else
+      [:ko {:msg "Mismatch terms"
+            :term1 t1
+            :term2 t2}])))
+
+(defn beta-equiv-args
+  [def-env ctx args1 args2 vmap1 vmap2]
+  (if (seq args1)
+    (if (seq args2)
+      (let [[status info] (beta-equiv def-env ctx (first args1) (first args2) vmap1 vmap2)]
+        (if (= status :ko)
+          [status info]
+          (recur def-env ctx (rest args1) (rest args2) vmap1 vmap2)))
+      ;; not enough args2
+      [:ko {:msg "Mismatch arity"
+            :args1 args1
+            :args2 args2}])
+    (if (seq args2)
+      [:ko {:msg "Mismatch arity"
+            :args1 args1
+            :args2 args2}]
+      [:ok {}])))
+
+


added mastersign.drawing namespace for drawing related functions based on java.awt

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

--- src/mastersign/drawing.clj
+++ src/mastersign/drawing.clj
@@ -0,0 +1,70 @@
+(ns mastersign.drawing
+  (:import [java.awt Color Font])
+  (:require [mastersign.geom :refer :all]))
+
+(def default-font-size 16)
+(def default-font-style Font/PLAIN)
+(def default-font (Font. Font/SANS_SERIF default-font-style default-font-size))
+
+(defn draw-dot
+  ([g p & {color :color
+            :or {color Color/RED}}]
+  (doto g
+    (.setColor color)
+    (.fill (ellipse (- (.x p) 2) (- (.y p) 2) 4 4)))))
+
+(defn draw-rect
+  [g r & {color :color
+          :or {color Color/BLUE}}]
+  (doto g
+    (.setColor color)
+    (.draw r)))
+
+(defn fill-rect
+  [g r & {color :color
+          :or {color Color/GREEN}}]
+  (doto g
+    (.setColor color)
+    (.fill r)))
+
+(defn draw-string
+  [g p text & {font :font
+               color :color
+               :or {font default-font
+                    color Color/BLACK}}]
+  (doto g
+    (.setColor color)
+    (.setFont font)
+    (.drawString text (.x p) (.y p))))
+
+(defn string-centered-offset
+  [g font text]
+  (let [gv (.createGlyphVector font (.getFontRenderContext g) text)
+        r (.getVisualBounds gv)
+        c (rect-center r)]
+     (point (- (.x c)) (- (.y c)))))
+
+(defn string-centered-rect
+  ([g font text]
+   (let [gv (.createGlyphVector font (.getFontRenderContext g) text)
+         r (.getVisualBounds gv)
+         c (rect-center r)]
+     (rectangle (- (.x r) (.x c)) (- (.y r) (.y c)) (.width r) (.height r))))
+  ([g font text x y]
+   (let [r (string-centered-rect g font text)]
+     (set! (.x r) (+ x (.x r)))
+     (set! (.y r) (+ y (.y r)))
+     r)))
+
+(defn draw-string-centered
+  [g text x y & {font :font,
+                 color :color,
+                 :or {font default-font,
+                      color Color/BLACK}}]
+  (let [offset (string-centered-offset g font text)]
+    (doto g
+        (.setColor color)
+        (.setFont font)
+        (.drawString text
+                     (float (+ x (.x offset)))
+                     (float (+ y (.y offset)))))))


Fix up names

Fix up names

Additions and retractions are better called out and are named consistently.

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/partner-works.git/'


Demonstrates a bug

Demonstrates a bug

error: pathspec 'test/behaviors/t_isolated_metaconstants.clj' did not match any file(s) known to git

--- test/behaviors/t_isolated_metaconstants.clj
+++ test/behaviors/t_isolated_metaconstants.clj
@@ -0,0 +1,17 @@
+;; -*- indent-tabs-mode: nil -*-
+
+(ns behaviors.t-isolated-metaconstants
+  (:use [midje sweet]))
+
+
+(defn verify-service [service]
+ true)
+
+(declare f g)
+;; (background (f) => 1
+;;             (g) => 33)
+
+(midje.ideas.facts/fact2
+ 1 => 1
+ (provided
+   ..service.. =contains=> {:status 200}))


Add scope to authorization url

Add scope to authorization url

Co-authored-by: Toby Crawley <c8420cae1b43ad0b08838661745c355024c86479@tcrawley.org>

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/tobias/clojars-web.git/'


cosets.clj: new file

cosets.clj: new file

error: pathspec 'clojure/org/gavrog/clojure/cosets.clj' did not match any file(s) known to git

--- clojure/org/gavrog/clojure/cosets.clj
+++ clojure/org/gavrog/clojure/cosets.clj
@@ -0,0 +1,59 @@
+(ns org.gavrog.clojure.cosets
+  (:use (org.gavrog.clojure
+          free-word
+          partition)))
+
+(defn- scan [table equiv w start]
+  (let [n (dec (count w))
+        [head a] (loop [row start, i 0]
+                   (let [next ((table row) (get w i))]
+                     (if (and next (< i n))
+                       (recur next (inc i))
+                       [row i])))
+        [tail b] (loop [row start, i n]
+                   (let [next ((table row) (inverse (get w i)))]
+                     (if (and next (>= i a))
+                       (recur next (dec i))
+                       [row i])))]
+    (cond (= a b)
+          [(-> table
+             (assoc-in head (get w a) tail)
+             (assoc-in tail (inverse (get w a)) head))
+           equiv]
+
+          (and (< b a) (not= head tail))
+          [table (punion equiv head tail)]
+
+          :else
+          [table equiv])))
+
+(defn- scan-relations [rels subgens table equiv n]
+  (let [[table equiv]
+        (reduce (fn [[t p] w] (scan t p w n)) [table equiv] rels)]
+    (reduce (fn [[t p] w] (scan t p w 0)) [table equiv] subgens)))
+
+(defn- compressed-table [table equiv]
+  table)
+
+(defn coset-table [nr-gens relators subgroup-gens]
+  (let [with-inverses (fn [ws] (vec (concat ws (map inverse ws))))
+        gens (with-inverses (map vector (range 1 (inc nr-gens))))
+        rels (with-inverses (for [w relators, i (range (count w))]
+                              (into (subvec w i) (subvec w 0 i))))
+        subgens (with-inverses subgroup-gens)]
+
+    (loop [table {0 {}}
+           equiv pempty
+           i 0
+           j 0]
+      (cond (>= i (count table))     (compressed-table table equiv)
+            (>= j (count gens))      (recur table equiv (inc i) 0)
+            ((table i) (get gens j)) (recur table equiv i (inc j))
+
+            :else
+            (let [g (get gens j)
+                  g* (inverse g)
+                  n (count table)
+                  table (-> table (assoc-in i g n) (assoc-in n g* i))
+                  [table equiv] (scan-relations rels subgens table equiv n)]
+              (recur table equiv i (inc j)))))))


deploy

deploy

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/clojure-ml/cml.git/'


bring back coffeescript versions

bring back coffeescript versions

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/JetBrains/imperative-nodejs.git/'


tick: act on groups of actions

tick: act on groups of actions

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/'


Iruzkina bidaltzean formu garbitu

Iruzkina bidaltzean formu garbitu

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/lnmnd/magnet.bez.git/'


added server

added server

error: pathspec 'src/server/server.cljs' did not match any file(s) known to git

--- src/server/server.cljs
+++ src/server/server.cljs
@@ -0,0 +1,19 @@
+(ns clj-dash.server
+  (:require [cljs.nodejs :as nodejs]))
+
+(def http (nodejs/require "http"))
+
+(defn greetHandler [req res]
+  (doto res
+    (.writeHead 200 {"Content-Type" "text/plain"})
+    (.end "Hello World")))
+
+(defn server [handler port url]
+  (-> (.createServer http handler)
+      (.listen port url)))
+
+(defn -main [& mess]
+  (server greetHandler 3000 "127.0.0.1")
+  (println "Server running at http://127.0.0.1:3000/"))
+
+(set! *main-cli-fn* -main)


Simplify finagle-clojure.futures/collect

map instead of flatmap + value

--- core/src/finagle_clojure/futures.clj
+++ core/src/finagle_clojure/futures.clj
@@ -169,9 +169,9 @@
     A new Future that will be defined when all Futures in `future-seq` have been defined.
     The value of that Future will be a Clojure seq of the values of the Futures in `future-seq`."
   [future-seq]
-  (flatmap (Future/collect (scala/seq->scala-buffer future-seq))
+  (map (Future/collect (scala/seq->scala-buffer future-seq))
     [scala-seq]
-    (value (scala/scala-seq->List scala-seq))))
+    (scala/scala-seq->List scala-seq)))

 (defn ^Future rescue*
   "Apply scala.PartialFunction pfn with the value of Future f when f is defined with a Throw (a Throwable).


add modal specific carousel

add modal specific carousel

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/'


added tests for the om emitter

added tests for the om emitter

error: pathspec 'test/kioo/om_test.cljs' did not match any file(s) known to git

--- test/kioo/om_test.cljs
+++ test/kioo/om_test.cljs
@@ -0,0 +1,127 @@
+(ns kioo.om-test
+  (:require [cemerick.cljs.test :as t]
+            [kioo.om :refer [content set-attr append prepend
+                               remove-attr before after do->
+                               set-style remove-style add-class
+                               remove-class wrap unwrap set-class
+                               html html-content]]
+            [kioo.test :refer [render-dom]]
+            [goog.dom :as gdom])
+  (:require-macros [kioo.om :refer [component]]
+                   [cemerick.cljs.test :refer [are is deftest testing]]))
+
+;; all text get surrounded by spans in om
+;; its a bit ugly but it is the expected
+;; behavior
+
+(deftest render-test
+  (testing "basic render test"
+    (let [comp (component "simple-div.html" {}) ]
+      (is (= "
test
"
+             (render-dom comp)))))
+  (testing "content replace"
+    (let [comp (component "simple-div.html"
+                          {[:div] (content "success")})]
+      (is (= "
success
"
+             (render-dom comp)))))
+  (testing "first-of-type naked symbol"
+    (let [comp (component "list.html" [:ul [:li first-of-type]] {})]
+      (is (= "
1
" (render-dom comp)))))
+  (testing "attr= content replace"
+    (let [comp (component "simple-attr-div.html"
+                          {[(attr= :data-id "tmp")]
+                           (content "success")})]
+      (is (= "
success
"
+             (render-dom comp)))))
+  (testing "attr? content replace"
+    (let [comp (component "simple-attr-div.html"
+                          {[(attr? :data-id)]
+                           (content "success")})]
+      (is (= "
success
"
+             (render-dom comp)))))
+  (testing "append test"
+    (let [comp (component "simple-div.html"
+                          {[:div] (append "success")})]
+      ;;note that ract wraps text nodes in span tags
+      ;;this is expected to be corrected soon in react but
+      ;;for now this is correct
+      (is (= "
testsuccess
"
+             (render-dom comp)))))
+  (testing "prepend test"
+    (let [comp (component "simple-div.html"
+                          {[:div] (prepend "success")})]
+      (is (= "
successtest
"
+             (render-dom comp)))))
+  (testing "set-attr test"
+    (let [comp (component "simple-div.html"
+                          {[:div] (set-attr :id "success")})]
+      (is (= "
test
"
+             (render-dom comp)))))
+  (testing "remove-attr test"
+    (let [comp (component "simple-div.html"
+                          {[:div] (remove-attr :id)})]
+      (is (= "
test
"
+             (render-dom comp)))))
+  (testing "before test"
+    (let [comp (component "simple-div.html"
+                          {[:div] (before "success")})]
+      (is (= "success
test
"
+             (render-dom comp)))))
+  (testing "after test"
+    (let [comp (component "simple-div.html"
+                          {[:div] (after "success")})]
+      (is (= "
test
success"
+             (render-dom comp)))))
+  (testing "add-class test"
+    (let [comp (component "class-span.html" [:span]
+                          {[:#s] (add-class "suc")})]
+      (is (= "testing"
+             (render-dom comp)))))
+  (testing "remove-class test"
+    (let [comp (component "class-span.html" [:span]
+                          {[:#s] (remove-class "cl")})]
+      (is (= "testing"
+             (render-dom comp)))))
+  (testing "set-class test"
+    (let [comp (component "class-span.html" [:span]
+                          {[:#s] (set-class "cl")})]
+      (is (= "testing"
+             (render-dom comp)))))
+  (testing "set-style test"
+    (let [comp (component "style-span.html" [:span]
+                          {[:#s] (set-style :display "none")})]
+      (is (= "testing"
+             (render-dom comp)))))
+  (testing "remove-style test"
+    (let [comp (component "style-span.html" [:span]
+                          {[:#s] (remove-style :color)})]
+      (is (= "testing"
+             (render-dom comp)))))
+  (testing "do-> test"
+    (let [comp (component "style-span.html" [:span]
+                          {[:#s] (do->
+                                  (remove-attr :id)
+                                  (remove-style :color))})]
+      (is (= "testing"
+             (render-dom comp)))))
+  (testing "wrap test"
+    (let [comp (component "wrap-test.html" [:span]
+                          {[:#s] (wrap :div {:id "test"})})]
+      (is (= "
testing
"
+             (render-dom comp)))))
+  (testing "unwrap test"
+    (let [comp (component "wrap-test.html" [:div]
+                          {[:div] unwrap})]
+      (is (= "testing"
+             (render-dom comp)))))
+  (testing "html test"
+    (let [comp (component "simple-div.html"
+                          {[:div] (content (html [:h1 {:class "t"}
+                                                  [:span "t1"]]))})]
+      (is (= "

t1

"
+             (render-dom comp)))))
+  (testing "html-content test"
+    (let [comp (component "simple-div.html"
+                          {[:div] (html-content "
t1
t2")})]
+      (is (= "

t1
t2
"
+             (render-dom comp))))))


require new clojurescript-build

require new clojurescript-build

--- sidecar/project.clj
+++ sidecar/project.clj
@@ -19,6 +19,6 @@
    [cljsbuild "1.0.5"]
    [figwheel "0.3.8-SNAPSHOT"]
    [com.cemerick/piggieback "0.1.5"]
-   [clojurescript-build "0.1.8"]
+   [clojurescript-build "0.1.9"]
    [watchtower "0.1.1"] ;; why the heck am I still using this?
    [digest "1.4.4"]])


Added word separation at line breaks

Added word separation at line breaks

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/hudren/ebook-novel.git/'


Namespace containing DB connector specification

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

--- src/zg/db_spec.clj
+++ src/zg/db_spec.clj
@@ -0,0 +1,21 @@
+;
+;  (C) Copyright 2016  Pavel Tisnovsky
+;
+;  All rights reserved. This program and the accompanying materials
+;  are made available under the terms of the Eclipse Public License v1.0
+;  which accompanies this distribution, and is available at
+;  http://www.eclipse.org/legal/epl-v10.html
+;
+;  Contributors:
+;      Pavel Tisnovsky
+;
+
+(ns zg.db-spec
+    "Namespace that contains configuration of all JDBC sources.")
+
+(def zg-db
+    {:classname   "org.sqlite.JDBC"
+     :subprotocol "sqlite"
+     :subname     "zg.db"
+    })
+


Clean up the date sanity checking.

Clean up the date sanity checking.

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/mtravers/incidents.git/'


Better name

Better name


added code to tear down and run scheduler in background

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/jchli/jepsen-aurora.git/'


auto replace

auto replace


fix URL

fix URL


adding params to all templates

adding params to all templates

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/micbie/evemm.git/'


added p18.clj

added p18.clj

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/'


cleanup

cleanup

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/james-mcelwain/vielheit-clj.git/'


keep dialog open while working on it

keep dialog open while working on it

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/wilkerlucio/youtube-looper.git/'


Set Clojure to 1.7.0-beta1

Set Clojure to 1.7.0-beta1

Consistent with version used by latest ClojureScript release.

--- Clojure/project.clj
+++ Clojure/project.clj
@@ -3,7 +3,7 @@
   :url "https://github.com/omcljs/ambly"
   :license {:name "Eclipse Public License"
             :url "http://www.eclipse.org/legal/epl-v10.html"}
-  :dependencies [[org.clojure/clojure "1.6.0"]
+  :dependencies [[org.clojure/clojure "1.7.0-beta1"]
                  [org.clojure/clojurescript "0.0-3211"]
                  [com.github.rickyclarkson/jmdns "3.4.2-r353-1"]]
   :source-paths ["src"]


A few tests for mlet

A few tests for mlet

--- tests/tests_cats.cljx
+++ tests/tests_cats.cljx
@@ -10,6 +10,23 @@
   (:require [clojure.test :refer :all]
             [cats.core :as m]
             [cats.types :as t]))
+
+
+(deftest test-mlet
+  (testing "It supports regular let inside its bindings")
+    (is (= (t/just 2)
+           (m/mlet [i (t/just 1)
+                    :let [i (inc i)]]
+                   (m/return i))))
+  (testing "It supports :when guards inside its bindings")
+    (is (= (t/nothing)
+           (m/mlet [i (t/just 2)
+                    :when (> i 2)]
+                   (m/return i))))
+    (is (= [3 4 5]
+           (m/mlet [i [1 2 3 4 5]
+                    :when (> i 2)]
+                   (m/return i)))))

 (deftest test-maybe
   (testing "Test predicates"


Deferred[Either] responses for a monadic API

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

--- src/er_cassandra/record_either.clj
+++ src/er_cassandra/record_either.clj
@@ -0,0 +1,75 @@
+(ns er-cassandra.record-either
+  (:refer-clojure :exclude [update])
+  (:require
+   [potemkin :refer [import-vars]]
+   [cats.core :as m]
+   [cats.monad.either :as either]
+   [cats.monad.deferred :as dm]
+   [er-cassandra.record :as r]))
+
+(defn alia-error-transformer
+  "transforms an alia exception into an error map... doesn't
+   do much more than extract the ex-data map and set a message"
+  [x]
+  (let [data (if (instance? clojure.lang.ExceptionInfo x)
+               (ex-data x)
+               {:type (-> x type .getName keyword)})]
+    (merge {:message (.getMessage x)
+            :exception x}
+           data)))
+
+(import-vars [er-cassandra.record select-statement])
+
+(defn select
+  "select records : returns a Deferred[Either]"
+  ([session table key record-or-key-value]
+   (select session table key record-or-key-value {}))
+
+  ([session table key record-or-key-value opts]
+   (dm/either-deferred
+    (r/select session table key record-or-key-value opts))))
+
+(defn select-one
+  "select a single record : returns a Deferred[Either]"
+  ([session table key record-or-key-value]
+   (select-one session table key record-or-key-value {}))
+
+  ([session table key record-or-key-value opts]
+   (dm/either-deferred
+    (r/select-one session table key record-or-key-value opts))))
+
+(import-vars [er-cassandra.record insert-statement])
+
+(defn insert
+  "insert a single record - returns a Deferred[Either]"
+
+  ([session table record]
+   (insert session table record {}))
+
+  ([session table record opts]
+   (dm/either-deferred
+    (r/insert session table record opts))))
+
+(import-vars [er-cassandra.record update-statement])
+
+(defn update
+  "update a single record - returns a Deferred[Either]"
+
+  ([session table key record]
+   (update session table key record {}))
+
+  ([session table key record opts]
+   (dm/either-deferred
+    (r/update session table key record opts))))
+
+(import-vars [er-cassandra.record delete-statement])
+
+(defn delete
+  "delete a record - returns a Deferred[Either]"
+
+  ([session table key record-or-key-value]
+   (delete session table key record-or-key-value {}))
+
+  ([session table key record-or-key-value opts]
+   (dm/either-deferred
+    (r/delete session table key record-or-key-value opts))))


Put the smoke test back!

Put the smoke test back!

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/couragelabs/freefrog.git/'


on update, find electorate, ???, profit

on update, find electorate, ???, profit

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-notification-works.git/'


Removed extraneus text that repeats visual arrows.

--- src/cbfg/core.cljs
+++ src/cbfg/core.cljs
@@ -147,13 +147,6 @@
         chs (:chs vis)]
     (assign-position positions actx-id)
     ["
" actx-id
-     (if (not-empty wait-chs)
-       [" -- waiting: ("
-        (map (fn [kv] (let [[ch wait-kind] kv]
-                        [(:id (get chs ch)) wait-kind ", "]))
-             wait-chs)
-        ")"]
-       [])
      "
"
      "
"
      (mapv (fn [ch-ch-info]


fetch orders in other manage order views

add parse special chars to other query results


konfig-etik behar dena bakarrik hartu

konfig-etik behar dena bakarrik hartu

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/lnmnd/magnet.zer.git/'


Fix binding events on android

Fix binding events on android

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/'


Clojure anagrams, first pass

Clojure anagrams, first pass

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

--- clojure/anagrams.clj
+++ clojure/anagrams.clj
@@ -0,0 +1,19 @@
+(defn swap [a i j]
+   (assoc a j (a i) i (a j)))
+
+(defn generatePermutations [n v]
+  (if (zero? n)
+    (println (apply str v))
+
+    (loop [i 0 a v]
+      (if (<= i n)
+        (do
+          (generatePermutations (dec n) a)
+          (recur (inc i) (swap a (if (even? n) i 0) n)))))))
+
+(if (not= (count *command-line-args*) 1)
+  (do
+    (println "Exactly one argument is required")
+    (System/exit 1))
+  (let [word (-> *command-line-args* first vec)]
+    (generatePermutations (dec (count word)) word)))


[WM] fix copy-paste typo in queue ns

[WM] fix copy-paste typo in queue ns

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/voting-method-http-api.git/'


Fix incorrect usage of preconditions on some function at cats.core ns.

--- src/cats/core.cljc
+++ src/cats/core.cljc
@@ -504,8 +504,7 @@
               (throw (IllegalArgumentException. "The given function is either variadic or has multiple arities, provide an arity for currying.")))
             (throw (IllegalArgumentException. "The given function doesn't have arity metadata, provide an arity for currying."))))))
      ([n f]
-      {:pre [(or (< n 21)
-                 (throw (IllegalArgumentException. "Clojure doesn't allow more than 20 positional arguments")))]}
+      {:pre [(< n 21)]}
       (let [args (repeatedly n gensym)
             body `(~f ~@args)]
         `(curry* ~args ~body)))))


Missing test runner for doo.

Missing test runner for doo.

error: pathspec 'test/active/clojure/test_runner.cljs' did not match any file(s) known to git

--- test/active/clojure/test_runner.cljs
+++ test/active/clojure/test_runner.cljs
@@ -0,0 +1,13 @@
+(ns active.clojure.test-runner
+  (:require [doo.runner :refer-macros [doo-tests]]
+            [active.clojure.condition-test]
+            [active.clojure.debug-test]
+            [active.clojure.lens-test]
+            [active.clojure.monad-test]
+            [active.clojure.record-test]))
+
+(doo-tests 'active.clojure.condition-test
+           'active.clojure.debug-test
+           'active.clojure.lens-test
+           'active.clojure.monad-test
+           'active.clojure.record-test)


cache-control on saved query

cache-control on saved query

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/B2W-BIT/restQL-server.git/'


modify folder relationship to return folders instead of children

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/physion/ovation-webapi.git/'


optimize read-check macro to no-op for a Database since @(:can-read db) is always true

--- src/metabase/api/common.clj
+++ src/metabase/api/common.clj
@@ -442,7 +442,17 @@
       (check-403 @~'can_read)
       obj#))
   ([entity id]
-   `(read-check (sel :one ~entity :id ~id))))
+   (cond
+     ;; simple optimization : since @can-read is always true for a Database
+     ;; the read-check macro will just resolve to true in this simple case
+     ;; use `name` so we can match 'Database or 'metabase.models.database/Database
+     ;;
+     ;; TODO - it would be nice to generalize the read-checking pattern, and make it
+     ;; a separate multimethod or protocol so other models besides DB can write optimized
+     ;; implementations. Currently, we always fetch an *entire* object to do read checking,
+     ;; which is wasteful.
+     (= (name entity) "Database") `true
+     :else                        `(read-check (sel :one ~entity :id ~id)))))

 (defmacro write-check
   "Checks that `@can_write` is true for this object."


remove unused protocol

remove unused protocol

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/michaelsbradleyjr/transwarp.git/'


Add protocol override ns

Add protocol override ns

error: pathspec 'src/cljc/robinson/override.cljc' did not match any file(s) known to git

--- src/cljc/robinson/override.cljc
+++ src/cljc/robinson/override.cljc
@@ -0,0 +1,128 @@
+(ns robinson.override)
+
+(defn protocol? [maybe-p]
+  (boolean (:on-interface maybe-p)))
+
+(def all-protocols (memoize (fn []
+  (filter #(protocol? @(val %)) (mapcat ns-publics (all-ns))))))
+
+(defn implemented-protocols [sym]
+  (filter #(satisfies? @(val %) sym) (all-protocols)))
+
+(defn- parse-impls [specs]
+  (loop [ret {} s specs]
+    (if (seq s)
+      (recur (assoc ret (first s) (take-while seq? (next s)))
+             (drop-while seq? (next s)))
+      ret)))
+
+
+(defn factory-fn-name [t]
+  "Where `t` is a type ie a class"
+  (let [parts (-> t .getCanonicalName (clojure.string/split #"\."))
+        package (butlast parts)
+        nom     (last parts)]
+    (str (clojure.string/join "." package) "/->" nom)))
+
+(defn identity-impl
+  [parent-sym sigs]
+  (vec
+    (mapcat (fn [{:keys [name arglists]}]
+              (mapv (fn [arglist]
+                      (list name arglist (concat (list name parent-sym) (rest arglist))))
+                    arglists))
+         (vals sigs))))
+
+(defn factory-fn-symbol [v]
+  (-> v factory-fn-name symbol))
+
+(defn merge-impls [& impls]
+  (apply merge-with (fn [result later]
+                      (let [result-map (group-by first result)
+                            later-map  (group-by first later)
+                            merged     (merge result-map later-map)]
+                        #_(println "result-map" result-map)
+                        #_(println "later-map" later-map)
+                        #_(println "merged" merged)
+                        (->> merged vals (mapcat identity))))
+                    impls))
+
+(defmacro override [[sym v] & specs]
+  #_(println sym (type sym))
+  (let [record-name (gensym "Record")
+        overrides   (parse-impls specs)
+        protocols   (keys overrides)#_(map second (implemented-protocols v))
+        defaults    (into {}
+                          (map (fn [p]
+                                 (println "sigs" p (-> p resolve deref :sigs) sym)
+                                 [p (identity-impl sym (-> p resolve deref :sigs))])
+                               protocols))
+        impls       (mapcat (fn [[k v]] (cons k v)) (merge-impls defaults overrides))]
+    (println "record-name" record-name)
+    (println "overrides" overrides)
+    (println "protocols" protocols)
+    (println "defaults" defaults)
+    (println "impls" impls)
+    (clojure.pprint/pprint
+      `(let [~sym          ~v
+             record-type# (defrecord ~record-name [~sym]
+                            ~@impls)]
+         ((find-var (factory-fn-symbol record-type#)) ~v)))
+    `(let [~sym          ~v
+           record-type# (defrecord ~record-name [~sym]
+                          ~@impls)]
+       ((find-var (factory-fn-symbol record-type#)) ~v))))
+
+(comment
+(use 'robinson.override :reload)
+
+(defprotocol S
+  (foo [this])
+  (bar [this]))
+
+(defprotocol T
+  (baz [this] [this v]))
+
+(defprotocol U
+  (qux [this]))
+
+(defrecord R [v]
+  S
+  (foo [this] (println "foo" v))
+  (bar [this] (println "bar" v))
+  T
+  (baz [this] (println "baz" v))
+  (baz [this w] (println "baz" v w))
+  U
+  (qux [this] (println "qux" v)))
+
+(def r (->R "123"))
+
+(doto r
+  foo
+  bar
+  baz
+  (baz :a)
+  qux)
+
+(macroexpand-1 '(override [parent r] S (foo [this] (println "r-proxy foo" parent))))
+
+(override [parent r] S (foo [this] (println "r-proxy foo" parent))
+                     T
+                     U)
+
+(def r-override (override [parent r]
+                  S
+                  (foo [this] (println "r-proxy foo" parent))
+                  #_(bar [this] (println "r-proxy bar" parent))
+                  T
+                  U))
+
+(doto r-override
+  foo
+  bar
+  baz
+  (baz :a)
+  qux)
+
+)


Adds links to annotation documents

Adds links to annotation documents


Add ellipsis functionality in todo items...

... as well as clean up some of the horizontal spacing css code.
The ellipsis functionality means that if the text in a todo item becomes
so large as to go beyond the horizontal end of the todo item,
the todo item will stay the same size, and the text will be cut off
by an ellipsis, that is, '...'.

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/Reefersleep/sleepydo.git/'


Refactor: rename id to reflect component name


Slightly organic tunnel thing

Slightly organic tunnel thing

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

--- src/art/tunnel.clj
+++ src/art/tunnel.clj
@@ -0,0 +1,67 @@
+(ns art.tunnel
+  (:require [quil.core :as q]
+            [quil.middleware]))
+
+; (def width  810)
+; (def height 540)
+(def width 1080)
+(def height 720)
+
+(def colour [133 17 17])
+(def fade-speed 10)
+(def noise-speed 0.009)
+(def noise-amp 150)
+(def step-size 40)
+
+(defn to-noise [n]
+  (-> (q/frame-count)
+      (+ n)
+      (* noise-speed)
+      (quil.core/noise)
+      (* noise-amp)))
+
+(defn stepped-sizes []
+  (map #(* step-size %) (range)))
+
+(defn on-screen? [size]
+  (< size (* width 1.2)))
+
+
+(defn render []
+  (q/fill 0 fade-speed)
+  (q/rect 0 0 width height)
+  (q/translate (/ width 2) (/ height 2))
+
+  (let [noises (map to-noise (range))
+        noisey-sizes (map + noises (stepped-sizes))
+        values (take-while on-screen? noisey-sizes)]
+    (apply q/stroke colour)
+    (doseq [size values]
+      (q/fill 0 0)
+      (q/ellipse 0 0 size size))))
+
+(defn setup []
+  (q/fill 0 0)
+  (q/stroke 255)
+  (q/stroke-weight 1)
+  ; (render)
+  ; (q/save "flower.png")
+  )
+
+(defn step [state] state)
+
+(defn draw [state]
+  (render)
+  )
+
+(defn run []
+  (q/defsketch example
+    :title "Art!"
+    :middleware [quil.middleware/fun-mode]
+    :settings #(q/smooth 2)
+    :setup setup
+    :update step
+    :draw draw
+    :size [width height]
+    ))
+; (run)


Add initial work on sql build dsl.

Add initial work on sql build dsl.

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


removing interpolation dead code

removing interpolation dead code


Added "sandbox" module for common usages.

error: pathspec 'src/test_utils/sandbox.cljs' did not match any file(s) known to git

--- src/test_utils/sandbox.cljs
+++ src/test_utils/sandbox.cljs
@@ -0,0 +1,23 @@
+(ns test-utils.sandbox
+  (:require [test-utils.core :as tuc]
+            [test-utils.word-source :as ws]))
+
+;; Stuff I'm trying out
+
+(defn name-abbreviation-pair []
+  (repeatedly 3 ws/rand-word))
+
+(defn person-name []
+  [(ws/rand-word) (if (= 0 (rem (rand-int 300) 3)) (tuc/rand-alpha) "") (ws/rand-word)])
+
+(defn house-number []
+  (tuc/rand-4))
+
+(defn street-name []
+  (repeatedly 2 ws/rand-word))
+
+(defn zip-code []
+  (tuc/rand-5))
+
+(defn phone-number []
+  (str "555-" (tuc/rand-3) "-" (tuc/rand-4)))


Utilities function remove-map-nils removes all nil values from map

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

--- src/wishlistd/utilities.clj
+++ src/wishlistd/utilities.clj
@@ -0,0 +1,4 @@
+(ns wishlistd.utilities)
+
+(defn remove-map-nils [m]
+  (into {} (filter second m)))


[EN] Found failing test case on build server.

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/partner-works.git/'


New test module: dictionary-test

New test module: dictionary-test

error: pathspec 'test/clj_mrazik/dictionary_test.clj' did not match any file(s) known to git

--- test/clj_mrazik/dictionary_test.clj
+++ test/clj_mrazik/dictionary_test.clj
@@ -0,0 +1,121 @@
+;
+;  (C) Copyright 2017  Pavel Tisnovsky
+;
+;  All rights reserved. This program and the accompanying materials
+;  are made available under the terms of the Eclipse Public License v1.0
+;  which accompanies this distribution, and is available at
+;  http://www.eclipse.org/legal/epl-v10.html
+;
+;  Contributors:
+;      Pavel Tisnovsky
+;
+
+(ns clj-mrazik.dictionary-test
+  (:require [clojure.test :refer :all]
+            [clj-mrazik.dictionary :refer :all]))
+
+;
+; Common functions used by tests.
+;
+
+(defn callable?
+    "Test if given function-name is bound to the real function."
+    [function-name]
+    (clojure.test/function? function-name))
+
+
+(deftest test-highlight-existence
+    "Check that the clj-mrazik.dictionary/highlight definition exists."
+    (testing "if the clj-mrazik.dictionary/highlight definition exists."
+        (is (callable? 'clj-mrazik.dictionary/highlight))))
+
+
+(deftest test-black-existence
+    "Check that the clj-mrazik.dictionary/black definition exists."
+    (testing "if the clj-mrazik.dictionary/black definition exists."
+        (is (callable? 'clj-mrazik.dictionary/black))))
+
+
+(deftest test-red-existence
+    "Check that the clj-mrazik.dictionary/red definition exists."
+    (testing "if the clj-mrazik.dictionary/red definition exists."
+        (is (callable? 'clj-mrazik.dictionary/red))))
+
+
+(deftest test-green-existence
+    "Check that the clj-mrazik.dictionary/green definition exists."
+    (testing "if the clj-mrazik.dictionary/green definition exists."
+        (is (callable? 'clj-mrazik.dictionary/green))))
+
+
+(deftest test-blue-existence
+    "Check that the clj-mrazik.dictionary/blue definition exists."
+    (testing "if the clj-mrazik.dictionary/blue definition exists."
+        (is (callable? 'clj-mrazik.dictionary/blue))))
+
+
+(deftest test-purple-existence
+    "Check that the clj-mrazik.dictionary/purple definition exists."
+    (testing "if the clj-mrazik.dictionary/purple definition exists."
+        (is (callable? 'clj-mrazik.dictionary/purple))))
+
+
+(deftest test-yellow-existence
+    "Check that the clj-mrazik.dictionary/yellow definition exists."
+    (testing "if the clj-mrazik.dictionary/yellow definition exists."
+        (is (callable? 'clj-mrazik.dictionary/yellow))))
+
+
+(deftest test-bold-existence
+    "Check that the clj-mrazik.dictionary/bold definition exists."
+    (testing "if the clj-mrazik.dictionary/bold definition exists."
+        (is (callable? 'clj-mrazik.dictionary/bold))))
+
+
+(deftest test-yes-no-with-caution-existence
+    "Check that the clj-mrazik.dictionary/yes-no-with-caution definition exists."
+    (testing "if the clj-mrazik.dictionary/yes-no-with-caution definition exists."
+        (is (callable? 'clj-mrazik.dictionary/yes-no-with-caution))))
+
+
+(deftest test-print-field-existence
+    "Check that the clj-mrazik.dictionary/print-field definition exists."
+    (testing "if the clj-mrazik.dictionary/print-field definition exists."
+        (is (callable? 'clj-mrazik.dictionary/print-field))))
+
+
+(deftest test-use-it-existence
+    "Check that the clj-mrazik.dictionary/use-it definition exists."
+    (testing "if the clj-mrazik.dictionary/use-it definition exists."
+        (is (callable? 'clj-mrazik.dictionary/use-it))))
+
+
+(deftest test-incorrect-forms-existence
+    "Check that the clj-mrazik.dictionary/incorrect-forms definition exists."
+    (testing "if the clj-mrazik.dictionary/incorrect-forms definition exists."
+        (is (callable? 'clj-mrazik.dictionary/incorrect-forms))))
+
+
+(deftest test-correct-forms-existence
+    "Check that the clj-mrazik.dictionary/correct-forms definition exists."
+    (testing "if the clj-mrazik.dictionary/correct-forms definition exists."
+        (is (callable? 'clj-mrazik.dictionary/correct-forms))))
+
+
+(deftest test-preferred-forms-existence
+    "Check that the clj-mrazik.dictionary/preferred-forms definition exists."
+    (testing "if the clj-mrazik.dictionary/preferred-forms definition exists."
+        (is (callable? 'clj-mrazik.dictionary/preferred-forms))))
+
+
+(deftest test-find-word-existence
+    "Check that the clj-mrazik.dictionary/find-word definition exists."
+    (testing "if the clj-mrazik.dictionary/find-word definition exists."
+        (is (callable? 'clj-mrazik.dictionary/find-word))))
+
+
+(deftest test-word-exist?-existence
+    "Check that the clj-mrazik.dictionary/word-exist? definition exists."
+    (testing "if the clj-mrazik.dictionary/word-exist? definition exists."
+        (is (callable? 'clj-mrazik.dictionary/word-exist?))))
+


Added support for newer Google Docs export with inline styles

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/hudren/ebook-novel.git/'


Add tests for mime-convertible

Add tests for mime-convertible

error: pathspec 'test/clojupyter/protocol/mime_convertible_test.clj' did not match any file(s) known to git

--- test/clojupyter/protocol/mime_convertible_test.clj
+++ test/clojupyter/protocol/mime_convertible_test.clj
@@ -0,0 +1,25 @@
+(ns clojupyter.protocol.mime-convertible-test
+  (:require [clojupyter.protocol.mime-convertible :refer :all]
+            [midje.sweet :refer :all]))
+
+(fact "Should render strings, keywords, and numbers"
+      (to-mime 1) => "{\"text/plain\":\"1\"}"
+      (to-mime "2") => "{\"text/plain\":\"\\\"2\\\"\"}"
+      (to-mime :1) => "{\"text/plain\":\":1\"}"
+      (to-mime ::1) =>
+        "{\"text/plain\":\":clojupyter.protocol.mime-convertible-test/1\"}")
+
+(fact "Should render lazy sequences"
+      (to-mime (map inc [1 2 3])) => "{\"text/plain\":\"(2 3 4)\"}"
+      (to-mime (map keyword ["a" "b" "c"])) => "{\"text/plain\":\"(:a :b :c)\"}")
+
+
+(deftype Custom [])
+
+(defmethod print-method Custom
+  [v ^java.io.Writer w]
+  (.write w "my-custom"))
+
+(fact "Should render deftype toString"
+      (to-mime (Custom.)) => "{\"text/plain\":\"my-custom\"}")
+


more under :profiles :dev

more under :profiles :dev

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/michaelsbradleyjr/ply.git/'


bump version to 2.8.9

bump version to 2.8.9

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/B2W-Digital/pdg-core.git/'


Version 0.6.0

Version 0.6.0

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/modnakasta/weasel.git/'


next dev cycle

next dev cycle

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/'


Added exclusions for ovation-api dependencies


Add lein modules config.

Add lein modules config.

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/cstorey/nrod.git/'


version bump

version bump

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/CraZySacX/nitelens.git/'


Bump version to 1.2.1

Bump version to 1.2.1

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/mprokopov/privat24-manager.git/'


chore(core): update version to 2.8.13

chore(core): update version to 2.8.13

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/B2W-BIT/restQL-server.git/'


bump teller

bump teller


Version 182-SNAPSHOT

Version 182-SNAPSHOT

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/tobias/clojars-web.git/'


Version 95-SNAPSHOT

Version 95-SNAPSHOT


configure cljs compilation

configure cljs compilation

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-hw.git/'


Add fns for debugging the JVM

Add fns for debugging the JVM

error: pathspec 'backend/src/circle/debug.clj' did not match any file(s) known to git

--- backend/src/circle/debug.clj
+++ backend/src/circle/debug.clj
@@ -0,0 +1,25 @@
+(ns circle.debug)
+
+(defn get-all-threads
+  "Returns a seq of every running thread"
+  []
+  (->
+   (Thread/getAllStackTraces)
+   (keys)))
+
+(defn get-all-user-threads
+  "Returns a seq of all user (non-daemon) threads"
+  []
+  (->> (get-all-threads)
+       (remove #(.isDaemon %))))
+
+(defn print-stack [thread]
+  (let [e (Exception.)]
+    (println "Thread" (.getName thread))
+    (.setStackTrace e (.getStackTrace thread))
+    (.printStackTrace e *out*)))
+
+(defn print-all-user-threads []
+  (doseq [t (get-all-user-threads)]
+    (print-stack t)))
+


Added forgotten main/clojure

Added forgotten main/clojure

error: pathspec 'kanbanik-statistics/src/main/clojure/org/kanbanik/statistics.clj' did not match any file(s) known to git

--- kanbanik-statistics/src/main/clojure/org/kanbanik/statistics.clj
+++ kanbanik-statistics/src/main/clojure/org/kanbanik/statistics.clj
@@ -0,0 +1,19 @@
+(ns org.kanbanik.statistics
+  (:require [monger.core :as mg]
+            [monger.collection :as mc])
+  )
+
+(defn f->t [] 12)
+
+(defn my-first-function [x] (+ x 1))
+
+(defn load-something-from-mongo []
+  (let [conn (mg/connect {:host "localhost" :port 27017})
+        db (mg/get-db conn "kanbanikdb")
+        coll "users"
+        ]
+
+    (mc/find db coll)
+    )
+  )
+


don't disable past dates

don't disable past dates


Sketch out protocol for Database

Sketch out protocol for 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/leif47/immutabledb-experimental.git/'


Also bump op-count when performing retractions


make user_uuid optional

make user_uuid optional

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/physion/ovation-webapi.git/'


condp instead of set

condp instead of set

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/michaelsbradleyjr/shen.clj.git/'


Create concentric_diamonds.clj

Create concentric_diamonds.clj

error: pathspec 'concentric_diamonds.clj' did not match any file(s) known to git

--- concentric_diamonds.clj
+++ concentric_diamonds.clj
@@ -0,0 +1,106 @@
+(def spaces (repeatedly (constantly " ")))
+(def hashes (repeatedly (constantly "#")))
+
+
+(defn row [total-height level]
+  (let [buffer-width level
+        middle-width (- total-height (* 2 buffer-width))
+        left-buffer  (take buffer-width spaces)
+        middle       (take middle-width (interleave hashes spaces))
+        right-buffer left-buffer]
+    (apply str (concat left-buffer middle right-buffer))))
+
+
+(defn print-diamonds-helper [level row-fn]
+  (let [row-string (row-fn level)]
+    (println row-string)
+    (when (> level 0)
+      (print-diamonds-helper (dec level) row-fn)
+      (println row-string))))
+
+
+(defn print-diamonds [n-diamonds]
+  (let [half-height  (* 2 n-diamonds)
+        total-height (+ (* 2 half-height) 1)]
+    ;; half-height is half the height of the outermost diamond.
+    ;; There is a space between each concentric diamond. Hence half-height is
+    ;; 2 * n-diamonds instead of just n-diamonds.
+    ;; total-height is also the total width (height and width of a diamond are equal).
+    (print-diamonds-helper half-height #(row total-height %))))
+
+
+(println)
+(println "Zero diamonds:")
+(println)
+(print-diamonds 0)
+; #
+
+(println)
+(println "One diamond:")
+(println)
+(print-diamonds 1)
+;   #
+;  # #
+; # # #
+;  # #
+;   #
+
+(println)
+(println "Two diamonds:")
+(println)
+(print-diamonds 2)
+;     #
+;    # #
+;   # # #
+;  # # # #
+; # # # # #
+;  # # # #
+;   # # #
+;    # #
+;     #
+
+(println)
+(println "Three diamonds:")
+(println)
+(print-diamonds 3)
+;       #
+;      # #
+;     # # #
+;    # # # #
+;   # # # # #
+;  # # # # # #
+; # # # # # # #
+;  # # # # # #
+;   # # # # #
+;    # # # #
+;     # # #
+;      # #
+;       #
+
+(println)
+(println "Four diamonds:")
+(println)
+(print-diamonds 4)
+;         #
+;        # #
+;       # # #
+;      # # # #
+;     # # # # #
+;    # # # # # #
+;   # # # # # # #
+;  # # # # # # # #
+; # # # # # # # # #
+;  # # # # # # # #
+;   # # # # # # #
+;    # # # # # #
+;     # # # # #
+;      # # # #
+;       # # #
+;        # #
+;         #
+
+
+; (println)
+; (print-diamonds 25)
+
+(println)


Load font-awesome locally

Load font-awesome locally

--- dev/src/yada/dev/manual.clj
+++ dev/src/yada/dev/manual.clj
@@ -116,6 +116,7 @@
           (tableOfContents (case toc true org.asciidoctor.Placement/LEFT false))
           (noFooter true)
           (imagesDir "img")
+          (iconFontCdn (java.net.URI. "/adoc/font-awesome-4.5.0/css/font-awesome.min.css"))
           (styleSheetName "juxt.css")
           #_(stylesDir "resources/asciidoctor/stylesheets")
           (sectionNumbers true))))))))


Working on 0127.

Working on 0127.

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

--- src/project_euler/problem_0127.clj
+++ src/project_euler/problem_0127.clj
@@ -0,0 +1,51 @@
+(ns project-euler.problem_0127)
+
+;; The radical of n, rad(n), is the product of distinct prime factors of n.
+;; For example, 504 = 2^3 × 3^2 × 7, so rad(504) = 2 × 3 × 7 = 42.
+
+;; We shall define the triplet of positive integers (a, b, c) to be an abc-hit if:
+
+;; GCD(a, b) = GCD(a, c) = GCD(b, c) = 1
+;; a < b
+;; a + b = c
+;; rad(abc) < c
+;; For example, (5, 27, 32) is an abc-hit, because:
+
+;; GCD(5, 27) = GCD(5, 32) = GCD(27, 32) = 1
+;; 5 < 27
+;; 5 + 27 = 32
+;; rad(4320) = 30 < 32
+;; It turns out that abc-hits are quite rare and there are only thirty-one abc-hits for c < 1000,
+;; with ∑c = 12523.
+
+;; Find ∑c for c < 120000.
+
+(defn gcd [x y]
+  (if (zero? y)
+    x
+    (recur y (rem x y))))
+
+(defn rad [x]
+  (loop [x x p 2 q 0 r 1]
+    (cond (> (* p p) x)   (if (== x q) r (* r x))
+          (< 0 (rem x p)) (recur x          (if (== 2 p) 3 (inc p)) p r)
+          (== p q)        (recur (quot x p) p                       p r)
+          :else           (recur (quot x p) p                       p (* r p))
+        )))
+
+(defn naive-solution-for [c-max]
+  (->> (range 3 c-max)
+       (mapcat (fn [c]
+                 (->> (if (odd? c) (iterate inc 1) (iterate #(+ % 2) 1))
+                      (map (fn [a] [a (- c a) c]))
+                      (take-while (fn [[a b c]] (< a b)))
+                      )))
+       (filter (fn [[a b c]] (and (== 1 (gcd a b))
+                                  (== 1 (gcd a c))
+                                  ;;(== 1 (gcd b c))
+                                  (< (rad (* a b c)) c)
+                                  )))
+       (map (fn [[a b c]] c))
+       (reduce +)
+       ;;(count)
+       ))


improved test

improved test

error: pathspec 'test/clj/just_married/api_test.clj' did not match any file(s) known to git

--- test/clj/just_married/api_test.clj
+++ test/clj/just_married/api_test.clj
@@ -0,0 +1,19 @@
+(ns just-married.api-test
+  (:require [clojure.test :as t]
+            [clojure.string :refer [includes?]]
+            [ring.mock.request :as mock]
+            [just-married.api :refer [app]]
+            [clojure.java.io :as jio]))
+
+(t/deftest homepage-test
+  (let [req (mock/request :get "/")
+        resp (app req)]
+
+    (t/testing "Homepage returns 200"
+      (t/is (= 200 (-> resp :status))))
+
+    (t/testing "Homepage contains some valid content"
+      (t/is (true? (includes?
+                    (slurp
+                     (.toString (:body resp)))
+                    "Andrea"))))))


tests for UCUM vs

tests for UCUM vs

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/fhirbase/fhirterm.git/'


Add voting-method-preference to return of make-application-form

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/vote-by-mail-works.git/'


Implementation of linked-list

Implementation of linked-list

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

--- src/Miscellaneous/datastructure.clj
+++ src/Miscellaneous/datastructure.clj
@@ -0,0 +1,81 @@
+(ns Miscellaneous.datastructure)
+
+(deftype Node [car cdr])
+
+(def node (Node. "foo" nil))
+
+(.car node)
+(.cdr node)
+
+(new Node "bar" nil)
+
+
+(def linked-list (Node. "foo" (Node. "bar" (Node. "baz" nil))))
+
+
+(.car (.cdr linked-list))
+
+(deftype Node [^:volatile-mutable car ^:volatile-mutable cdr])
+
+;well this makes it impossible to access the field from the outside world.
+
+(definterface INode
+  (getCar [])
+  (getCdr [])
+  (setCar [x])
+  (setCdr [x]))
+
+(deftype Node [^:volatile-mutable car ^:volatile-mutable cdr]
+  INode
+  (getCar [this] car)
+  (getCdr [this] cdr)
+  (setCar [this x] (set! car x) this)
+  (setCdr [this x] (set! cdr x) this))
+
+(def node (Node. "foo" nil))
+
+(.getCar node)
+
+(.getCdr (.setCdr node "bar"))
+
+(definterface INode
+  (getCar [])
+  (setCar [x])
+  (getCdr [])
+  (setCdr [n])
+  (reverse []))
+
+(deftype Node
+  [^:volatile-mutable car ^:volatile-mutable ^INode cdr]
+  INode
+  (getCar [_] car)
+  (setCar [_ x] (set! car x))
+  (getCdr [_] cdr)
+  (setCdr [_ n] (set! cdr n))
+  (reverse [this]
+            (loop [cur this
+                   new-head nil]
+              (if-not cur
+                new-head
+                (recur (.getCdr cur) (Node. (.getCar cur) new-head))
+                ))))
+
+(def linked-list (Node. "c" (Node. "b" (Node. "a" nil))))
+
+(linked-list )
+
+
+
+(.. linked-list getCar)
+
+(.. linked-list reverse getCar)
+
+
+(deftype Node
+  [^:volatile-mutable car ^:volatile-mutable ^INode]
+  )
+
+
+
+
+


Initial commit

Initial commit

--- project.clj
+++ project.clj
@@ -0,0 +1,5 @@
+(defproject bitauth-cljs "0.3.2"
+  :description "ClojureScript Wrapper around BitPay's BitAuth"
+  :url "https://github.com/xcthulhu/bitauth-cljs"
+  :license {:name "MIT"
+            :url "https://opensource.org/licenses/MIT"})


Support external log4j configuration

Support external log4j configuration

Support external log4j configuration. If the property
log4j.configuration is set, do not run `riemann.logging/init`.
`riemann.logging/init` prevents the use of external configuration files
because it removes all configured appenders.

So long as `riemann.logging/init`, it is possible to configure log4j
using a log4j.properties

--- src/riemann/bin.clj
+++ src/riemann/bin.clj
@@ -57,7 +57,8 @@
   ([config]
    (-main "start" config))
   ([command config]
-   (riemann.logging/init)
+   (when (nil? (System/getProperty "log4j.configuration"))
+     (riemann.logging/init))
    (case command
      "start" (try
                (info "PID" (pid))