summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cpcache/61020924.basis2
-rw-r--r--.cpcache/61020924.cp2
-rw-r--r--.nrepl-port2
-rw-r--r--deps.edn4
-rw-r--r--src/.main.clj.swpbin0 -> 16384 bytes
-rw-r--r--src/main.clj164
6 files changed, 131 insertions, 43 deletions
diff --git a/.cpcache/61020924.basis b/.cpcache/61020924.basis
index c6372b8..1a311ef 100644
--- a/.cpcache/61020924.basis
+++ b/.cpcache/61020924.basis
@@ -1 +1 @@
-{:classpath {"" {:path-key :paths}, "/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar" {:lib-name org.clojure/core.cache}, "/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar" {:lib-name refactor-nrepl/refactor-nrepl}, "/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar" {:lib-name missionary/missionary}, "/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar" {:lib-name org.clojure/data.priority-map}, "/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar" {:lib-name cider/orchard}, "/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar" {:lib-name cider/cider-nrepl}, "src" {:path-key :paths}, "/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar" {:lib-name org.ow2.asm/asm}, "/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar" {:lib-name org.clojure/tools.reader}, "/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar" {:lib-name cloroutine/cloroutine}, "/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar" {:lib-name org.clojure/tools.analyzer}, "/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" {:lib-name org.clojure/core.specs.alpha}, "/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" {:lib-name nrepl/nrepl}, "/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" {:lib-name mx.cider/logjam}, "/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" {:lib-name org.clojure/clojure}, "/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" {:lib-name org.reactivestreams/reactive-streams}, "/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar" {:lib-name org.clojure/core.memoize}, "resources" {:path-key :paths}, "/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar" {:lib-name org.clojure/tools.analyzer.jvm}, "/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" {:lib-name org.clojure/spec.alpha}}, :basis-config {:project "deps.edn", :user "/Users/jake/.config/clojure/deps.edn", :extra {:deps {nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.53.2"}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}}, :aliases {:cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}}}, :args nil, :aliases [:cider/nrepl]}, :mvn/repos {"central" {:url "https://repo1.maven.org/maven2/"}, "clojars" {:url "https://repo.clojars.org/"}}, :argmap {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}, :paths ["" "src" "resources"], :classpath-roots ["" "src" "resources" "/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar" "/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar" "/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" "/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" "/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar" "/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar" "/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" "/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar" "/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" "/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" "/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" "/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar" "/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar" "/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar" "/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar" "/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar" "/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar" "/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar"], :libs {org.clojure/clojure {:mvn/version "1.12.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar"]}, org.clojure/tools.analyzer {:mvn/version "1.1.1", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar"]}, org.clojure/core.specs.alpha {:mvn/version "0.4.74", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar"]}, org.clojure/spec.alpha {:mvn/version "0.5.238", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar"]}, mx.cider/logjam {:mvn/version "0.3.0", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar"]}, cider/orchard {:mvn/version "0.31.1", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar"]}, org.clojure/tools.analyzer.jvm {:mvn/version "1.2.3", :deps/manifest :mvn, :dependents [cloroutine/cloroutine], :parents #{[missionary/missionary cloroutine/cloroutine]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar"]}, cloroutine/cloroutine {:mvn/version "13", :deps/manifest :mvn, :dependents [missionary/missionary], :parents #{[missionary/missionary]}, :paths ["/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar"]}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar"]}, org.ow2.asm/asm {:mvn/version "9.2", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar"]}, cider/cider-nrepl {:mvn/version "0.53.2", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar"]}, missionary/missionary {:mvn/version "b.46", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar"]}, org.clojure/tools.reader {:mvn/version "1.3.6", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar"]}, org.reactivestreams/reactive-streams {:mvn/version "1.0.4", :deps/manifest :mvn, :dependents [missionary/missionary], :parents #{[missionary/missionary]}, :paths ["/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar"]}, nrepl/nrepl {:mvn/version "1.3.1", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar"]}, org.clojure/core.memoize {:mvn/version "1.0.253", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar"]}, org.clojure/data.priority-map {:mvn/version "1.1.0", :deps/manifest :mvn, :dependents [org.clojure/core.cache], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm org.clojure/core.memoize org.clojure/core.cache]}, :paths ["/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar"]}, org.clojure/core.cache {:mvn/version "1.0.225", :deps/manifest :mvn, :dependents [org.clojure/core.memoize], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm org.clojure/core.memoize]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar"]}}, :aliases {:deps {:replace-paths [], :replace-deps {org.clojure/tools.deps.cli {:mvn/version "0.11.86"}}, :ns-default clojure.tools.deps.cli.api, :ns-aliases {help clojure.tools.deps.cli.help}}, :test {:extra-paths ["test"]}, :dev {:extra-paths ["dev"]}, :cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}}, :deps {org.clojure/clojure {:mvn/version "1.12.0"}, missionary/missionary {:mvn/version "b.46"}, nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.53.2"}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}}} \ No newline at end of file
+{:classpath {"" {:path-key :paths}, "/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar" {:lib-name org.clojure/core.cache}, "/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar" {:lib-name refactor-nrepl/refactor-nrepl}, "/Users/jake/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar" {:lib-name com.google.code.gson/gson}, "/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar" {:lib-name missionary/missionary}, "/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar" {:lib-name org.clojure/data.priority-map}, "/Users/jake/.m2/repository/http-kit/http-kit/2.7.0/http-kit-2.7.0.jar" {:lib-name http-kit/http-kit}, "/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar" {:lib-name cider/orchard}, "/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar" {:lib-name cider/cider-nrepl}, "/Users/jake/.m2/repository/org/clojure/data.json/2.4.0/data.json-2.4.0.jar" {:lib-name org.clojure/data.json}, "src" {:path-key :paths}, "/Users/jake/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar" {:lib-name org.msgpack/msgpack}, "/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar" {:lib-name org.ow2.asm/asm}, "/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar" {:lib-name org.clojure/tools.reader}, "/Users/jake/.m2/repository/com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar" {:lib-name com.cognitect/transit-clj}, "/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar" {:lib-name cloroutine/cloroutine}, "/Users/jake/.m2/repository/com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar" {:lib-name com.cognitect/transit-java}, "/Users/jake/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar" {:lib-name org.javassist/javassist}, "/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar" {:lib-name org.clojure/tools.analyzer}, "/Users/jake/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" {:lib-name javax.activation/javax.activation-api}, "/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" {:lib-name org.clojure/core.specs.alpha}, "/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" {:lib-name nrepl/nrepl}, "/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" {:lib-name mx.cider/logjam}, "/Users/jake/.m2/repository/djblue/portal/0.61.0/portal-0.61.0.jar" {:lib-name djblue/portal}, "/Users/jake/.m2/repository/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar" {:lib-name javax.xml.bind/jaxb-api}, "/Users/jake/.m2/repository/com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar" {:lib-name com.cognitect/transit-js}, "/Users/jake/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.14.2/jackson-core-2.14.2.jar" {:lib-name com.fasterxml.jackson.core/jackson-core}, "/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" {:lib-name org.clojure/clojure}, "/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" {:lib-name org.reactivestreams/reactive-streams}, "/Users/jake/.m2/repository/com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar" {:lib-name com.cognitect/transit-cljs}, "/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar" {:lib-name org.clojure/core.memoize}, "/Users/jake/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar" {:lib-name com.googlecode.json-simple/json-simple}, "resources" {:path-key :paths}, "/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar" {:lib-name org.clojure/tools.analyzer.jvm}, "/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" {:lib-name org.clojure/spec.alpha}}, :basis-config {:project "deps.edn", :user "/Users/jake/.config/clojure/deps.edn", :extra {:deps {nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.53.2"}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}}, :aliases {:cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}}}, :args nil, :aliases [:cider/nrepl]}, :mvn/repos {"central" {:url "https://repo1.maven.org/maven2/"}, "clojars" {:url "https://repo.clojars.org/"}}, :argmap {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}, :paths ["" "src" "resources"], :classpath-roots ["" "src" "resources" "/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar" "/Users/jake/.m2/repository/djblue/portal/0.61.0/portal-0.61.0.jar" "/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar" "/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" "/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" "/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar" "/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar" "/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" "/Users/jake/.m2/repository/com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar" "/Users/jake/.m2/repository/com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar" "/Users/jake/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar" "/Users/jake/.m2/repository/http-kit/http-kit/2.7.0/http-kit-2.7.0.jar" "/Users/jake/.m2/repository/org/clojure/data.json/2.4.0/data.json-2.4.0.jar" "/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar" "/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" "/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" "/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" "/Users/jake/.m2/repository/com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar" "/Users/jake/.m2/repository/com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar" "/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar" "/Users/jake/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.14.2/jackson-core-2.14.2.jar" "/Users/jake/.m2/repository/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar" "/Users/jake/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar" "/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar" "/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar" "/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar" "/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar" "/Users/jake/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" "/Users/jake/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar" "/Users/jake/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar" "/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar" "/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar"], :libs {com.cognitect/transit-java {:mvn/version "1.0.371", :deps/manifest :mvn, :dependents [com.cognitect/transit-clj], :parents #{[djblue/portal com.cognitect/transit-clj]}, :paths ["/Users/jake/.m2/repository/com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar"]}, org.clojure/data.json {:mvn/version "2.4.0", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/org/clojure/data.json/2.4.0/data.json-2.4.0.jar"]}, org.clojure/clojure {:mvn/version "1.12.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar"]}, javax.activation/javax.activation-api {:mvn/version "1.2.0", :deps/manifest :mvn, :dependents [javax.xml.bind/jaxb-api], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java javax.xml.bind/jaxb-api]}, :paths ["/Users/jake/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar"]}, org.clojure/tools.analyzer {:mvn/version "1.1.1", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar"]}, org.clojure/core.specs.alpha {:mvn/version "0.4.74", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar"]}, org.clojure/spec.alpha {:mvn/version "0.5.238", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar"]}, mx.cider/logjam {:mvn/version "0.3.0", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar"]}, cider/orchard {:mvn/version "0.31.1", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar"]}, org.clojure/tools.analyzer.jvm {:mvn/version "1.2.3", :deps/manifest :mvn, :dependents [cloroutine/cloroutine], :parents #{[missionary/missionary cloroutine/cloroutine]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar"]}, com.googlecode.json-simple/json-simple {:mvn/version "1.1.1", :exclusions #{junit/junit}, :deps/manifest :mvn, :dependents [org.msgpack/msgpack], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java org.msgpack/msgpack]}, :paths ["/Users/jake/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar"]}, com.cognitect/transit-cljs {:mvn/version "0.8.280", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar"]}, cloroutine/cloroutine {:mvn/version "13", :deps/manifest :mvn, :dependents [missionary/missionary], :parents #{[missionary/missionary]}, :paths ["/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar"]}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar"]}, com.fasterxml.jackson.core/jackson-core {:mvn/version "2.14.2", :deps/manifest :mvn, :dependents [com.cognitect/transit-java], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java]}, :paths ["/Users/jake/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.14.2/jackson-core-2.14.2.jar"]}, djblue/portal {:mvn/version "0.61.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/djblue/portal/0.61.0/portal-0.61.0.jar"]}, org.ow2.asm/asm {:mvn/version "9.2", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar"]}, com.cognitect/transit-js {:mvn/version "0.8.874", :deps/manifest :mvn, :dependents [com.cognitect/transit-cljs], :parents #{[djblue/portal com.cognitect/transit-cljs]}, :paths ["/Users/jake/.m2/repository/com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar"]}, org.javassist/javassist {:mvn/version "3.18.1-GA", :deps/manifest :mvn, :dependents [org.msgpack/msgpack], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java org.msgpack/msgpack]}, :paths ["/Users/jake/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar"]}, org.msgpack/msgpack {:mvn/version "0.6.12", :deps/manifest :mvn, :dependents [com.cognitect/transit-java], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java]}, :paths ["/Users/jake/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar"]}, com.cognitect/transit-clj {:mvn/version "1.0.333", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar"]}, cider/cider-nrepl {:mvn/version "0.53.2", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar"]}, missionary/missionary {:mvn/version "b.46", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar"]}, org.clojure/tools.reader {:mvn/version "1.3.6", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar"]}, org.reactivestreams/reactive-streams {:mvn/version "1.0.4", :deps/manifest :mvn, :dependents [missionary/missionary], :parents #{[missionary/missionary]}, :paths ["/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar"]}, nrepl/nrepl {:mvn/version "1.3.1", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar"]}, org.clojure/core.memoize {:mvn/version "1.0.253", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar"]}, org.clojure/data.priority-map {:mvn/version "1.1.0", :deps/manifest :mvn, :dependents [org.clojure/core.cache], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm org.clojure/core.memoize org.clojure/core.cache]}, :paths ["/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar"]}, org.clojure/core.cache {:mvn/version "1.0.225", :deps/manifest :mvn, :dependents [org.clojure/core.memoize], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm org.clojure/core.memoize]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar"]}, javax.xml.bind/jaxb-api {:mvn/version "2.4.0-b180830.0359", :deps/manifest :mvn, :dependents [com.cognitect/transit-java], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java]}, :paths ["/Users/jake/.m2/repository/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar"]}, com.google.code.gson/gson {:mvn/version "2.10.1", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]}, http-kit/http-kit {:mvn/version "2.7.0", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/http-kit/http-kit/2.7.0/http-kit-2.7.0.jar"]}}, :aliases {:deps {:replace-paths [], :replace-deps {org.clojure/tools.deps.cli {:mvn/version "0.11.86"}}, :ns-default clojure.tools.deps.cli.api, :ns-aliases {help clojure.tools.deps.cli.help}}, :test {:extra-paths ["test"]}, :dev {:extra-paths ["dev"]}, :cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}}, :deps {org.clojure/clojure {:mvn/version "1.12.0"}, missionary/missionary {:mvn/version "b.46"}, djblue/portal {:mvn/version "0.61.0"}, nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.53.2"}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}}} \ No newline at end of file
diff --git a/.cpcache/61020924.cp b/.cpcache/61020924.cp
index 8818d57..7081348 100644
--- a/.cpcache/61020924.cp
+++ b/.cpcache/61020924.cp
@@ -1 +1 @@
-:src:resources:/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar:/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar:/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar:/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar:/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar:/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar:/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar:/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar:/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar:/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar:/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar:/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar:/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar:/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar:/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar:/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar:/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar:/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar \ No newline at end of file
+:src:resources:/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar:/Users/jake/.m2/repository/djblue/portal/0.61.0/portal-0.61.0.jar:/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar:/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar:/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar:/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar:/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar:/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar:/Users/jake/.m2/repository/com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar:/Users/jake/.m2/repository/com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar:/Users/jake/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar:/Users/jake/.m2/repository/http-kit/http-kit/2.7.0/http-kit-2.7.0.jar:/Users/jake/.m2/repository/org/clojure/data.json/2.4.0/data.json-2.4.0.jar:/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar:/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar:/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar:/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar:/Users/jake/.m2/repository/com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar:/Users/jake/.m2/repository/com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar:/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar:/Users/jake/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.14.2/jackson-core-2.14.2.jar:/Users/jake/.m2/repository/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar:/Users/jake/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar:/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar:/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar:/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar:/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar:/Users/jake/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:/Users/jake/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar:/Users/jake/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar:/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar:/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar \ No newline at end of file
diff --git a/.nrepl-port b/.nrepl-port
index ca6b7b8..41bb84d 100644
--- a/.nrepl-port
+++ b/.nrepl-port
@@ -1 +1 @@
-49885 \ No newline at end of file
+51213 \ No newline at end of file
diff --git a/deps.edn b/deps.edn
index b806450..87dde6f 100644
--- a/deps.edn
+++ b/deps.edn
@@ -1,3 +1,5 @@
{:paths ["" "src" "resources"]
- :deps {missionary/missionary {:mvn/version "b.46"}}
+ :deps {org.clojure/clojure {:mvn/version "1.12.0"}
+ missionary/missionary {:mvn/version "b.46"}
+ djblue/portal {:mvn/version "0.61.0"}}
:aliases {:dev {:extra-paths ["dev"]}}}
diff --git a/src/.main.clj.swp b/src/.main.clj.swp
new file mode 100644
index 0000000..b91b1b6
--- /dev/null
+++ b/src/.main.clj.swp
Binary files differ
diff --git a/src/main.clj b/src/main.clj
index eb0e2d2..7674cc1 100644
--- a/src/main.clj
+++ b/src/main.clj
@@ -2,30 +2,56 @@
(:require [missionary.core :as m]
[clojure.set :refer [difference union]]))
+(def >portal
+ (m/signal
+ (m/ap
+ (try
+ (m/?<
+ (m/observe
+ (fn [cb]
+ ((m/via m/blk ((requiring-resolve 'portal.api/open))) {} {})
+ (cb :open)
+ (fn []
+ ((m/via m/blk
+ ((requiring-resolve 'portal.api/close))
+ ((requiring-resolve 'portal.api/clear))) {} {})))))
+ (catch missionary.Cancelled _
+ (m/amb))))))
+
;; How many times per second are output continuous values sampled and turned
;; into events?
(def sample-rate (atom 30))
-(defn set-sample-rate [v] (reset! sample-rate v))
+(defn set-sample-rate
+ "Change the output sample rate."
+ [v]
+ (reset! sample-rate v))
-;; Temporary atom to explore the concept of note state as a continuous value
(def notes-on (atom #{}))
(def >notes-on (m/signal (m/watch notes-on)))
-(def playback-enabled? (atom true))
+(def midi-enabled? (atom true))
-(defn enable-playback []
- (reset! playback-enabled? true))
+(defn enable-midi
+ "Enable midi out."
+ []
+ (reset! midi-enabled? true))
-(defn disable-playback []
- (reset! playback-enabled? false))
+(defn disable-midi
+ "Stop all active notes and disable midi out."
+ []
+ (reset! midi-enabled? false))
-(defn play-notes [& v]
- (when @playback-enabled?
+(defn play-notes
+ "Play notes."
+ [& v]
+ (when @midi-enabled?
(swap! notes-on union (into #{} v))))
-(defn stop-notes [& v]
- (when @playback-enabled?
+(defn stop-notes
+ "Stop notes."
+ [& v]
+ (when @midi-enabled?
(swap! notes-on difference (into #{} v))))
(def clock
@@ -41,8 +67,9 @@
:tick
(recur)))))
-;; convert the continuous time >notes-on flow to a series of discrete midi note on and off events
(def output
+ "Convert the continuous time >notes-on flow to a series of discrete midi note
+ on and off events."
(m/eduction
(comp (remove #(= (select-keys % [:note-on :note-off]) {:note-on #{} :note-off #{}}))
(dedupe))
@@ -61,19 +88,22 @@
>notes-on
clock))))
-(def toggle-playback
+(def process-midi-toggle-events
+ "Listen for changes on midi-enabled?
+ When playback is disabled, send a note-off event for each active note
+ and then zero out notes-on."
(m/ap
- (let [local-playback-enabled? (atom nil)
+ (let [local-midi-enabled? (atom nil)
local-active (atom #{})
[tag value] (m/amb=
- [:playback-enabled? (m/?< (m/watch playback-enabled?))]
+ [:midi-enabled? (m/?< (m/watch midi-enabled?))]
[:note-event (m/?< output)])]
(case tag
- :playback-enabled?
- (let [playback-enabled? value
+ :midi-enabled?
+ (let [midi-enabled? value
active @local-active]
- (reset! local-playback-enabled? playback-enabled?)
- (if (not playback-enabled?)
+ (reset! local-midi-enabled? midi-enabled?)
+ (if (not midi-enabled?)
(do
(reset! notes-on #{})
(reset! local-active #{})
@@ -85,31 +115,87 @@
(let [{:keys [active]
:as note-event} value]
(reset! local-active active)
- (if @local-playback-enabled?
+ (if @local-midi-enabled?
note-event
(m/amb)))))))
-(defonce process (atom nil))
-
-(defn start-process []
- (when (not @process)
- (reset! process
- (do (enable-playback)
- ((m/reduce prn toggle-playback) {} {})))))
+(defonce engine (atom nil))
-(defn stop-process []
- (disable-playback)
- (@process)
- (reset! process nil))
+(def set->midi-events
+ "Convert set representation of notes to midi events"
+ (m/ap
+ (let [{:keys [note-on note-off]} (m/?< process-midi-toggle-events)]
+ (m/amb=
+ (loop [notes note-on]
+ (if (first notes)
+ (m/amb [:note-on (first notes)]
+ (recur (rest notes)))
+ (m/amb)))
+ (loop [notes note-off]
+ (if (first notes)
+ (m/amb [:note-off (first notes)]
+ (recur (rest notes)))
+ (m/amb)))))))
+
+(def enable-portal-submission? (atom false))
+(def >enable-portal-submission? (m/watch enable-portal-submission?))
+
+(defn enable-portal-submission []
+ (reset! enable-portal-submission? true))
+
+(defn disable-portal-submission []
+ (reset! enable-portal-submission? false))
+
+(def tap-flow
+ (m/ap
+ (let [local-enable-portal-submission? (atom nil)
+ [tag value]
+ (m/amb= [:enable-portal-submission? (m/?< >enable-portal-submission?)]
+ [:event (m/?< set->midi-events)])]
+ (case tag
+ :enable-portal-submission?
+ (do
+ (reset! local-enable-portal-submission? value)
+ (when value
+ (m/?< >portal))
+ (m/amb))
+ :event
+ (do
+ (when @local-enable-portal-submission?
+ (m/? (m/via m/blk ((requiring-resolve 'portal.api/submit) value))))
+ value)))))
+
+(defn start-engine
+ "Start playback engine."
+ []
+ (when (not @engine)
+ (reset! engine
+ (do (enable-midi)
+ ((m/reduce prn tap-flow) {} {})))))
+
+(defn stop-engine
+ "Stop playback engine."
+ []
+ (disable-midi)
+ (when @engine
+ (@engine)
+ (reset! engine nil)))
(comment
- (start-process)
- (stop-process)
- (set-sample-rate 1)
- (play-notes 1 2 3 4 5)
- (stop-notes 3)
+ (start-engine)
+
(play-notes 1 2 3 4 5)
- (stop-notes 1 2 3 4 5)
+ (stop-notes 4 5)
+ (enable-portal-submission)
+ (play-notes 1 2 3 4)
+
+ (disable-midi)
+ (play-notes 1 2 3 4)
+ (disable-portal-submission)
+
+ (enable-midi)
+ (play-notes 1 2 3 4)
+ (play-notes 6 7 8)
+ (play-notes 100)
- (enable-playback)
- (disable-playback))
+ (stop-engine))