From ae71683886fa3349344719a8a71677eaec28b38c Mon Sep 17 00:00:00 2001 From: clyfe <> Date: Mon, 7 Dec 2020 10:41:00 +0200 Subject: [PATCH] Add ClojureScript support --- src/integrant/repl.clj | 94 --------------------------- src/integrant/repl.cljc | 115 ++++++++++++++++++++++++++++++++++ src/integrant/repl/state.clj | 8 --- src/integrant/repl/state.cljc | 8 +++ 4 files changed, 123 insertions(+), 102 deletions(-) delete mode 100644 src/integrant/repl.clj create mode 100644 src/integrant/repl.cljc delete mode 100644 src/integrant/repl/state.clj create mode 100644 src/integrant/repl/state.cljc diff --git a/src/integrant/repl.clj b/src/integrant/repl.clj deleted file mode 100644 index 0cb4d76..0000000 --- a/src/integrant/repl.clj +++ /dev/null @@ -1,94 +0,0 @@ -(ns integrant.repl - (:require [integrant.core :as ig] - [integrant.repl.state :as state] - [clojure.tools.namespace.repl :as repl])) - -(repl/disable-reload! (find-ns 'integrant.core)) - -(defn set-prep! [prep] - (alter-var-root #'state/preparer (constantly prep))) - -(defn- prep-error [] - (Error. "No system preparer function found.")) - -(defn prep [] - (if-let [prep state/preparer] - (do (alter-var-root #'state/config (fn [_] (prep))) :prepped) - (throw (prep-error)))) - -(defn- halt-system [system] - (when system (ig/halt! system))) - -(defn- build-system [build wrap-ex] - (try - (build) - (catch clojure.lang.ExceptionInfo ex - (if-let [system (:system (ex-data ex))] - (try - (ig/halt! system) - (catch clojure.lang.ExceptionInfo halt-ex - (throw (wrap-ex ex halt-ex))))) - (throw ex)))) - -(defn- init-system [config keys] - (build-system - (if keys - #(ig/init config keys) - #(ig/init config)) - #(ex-info "Config failed to init; also failed to halt failed system" - {:init-exception %1} - %2))) - -(defn- resume-system [config system] - (build-system - #(ig/resume config system) - #(ex-info "Config failed to resume; also failed to halt failed system" - {:resume-exception %1} - %2))) - -(defn init - ([] (init nil)) - ([keys] - (alter-var-root #'state/system (fn [sys] - (halt-system sys) - (init-system state/config keys))) - :initiated)) - -(defn go - ([] (go nil)) - ([keys] - (prep) - (init keys))) - -(defn clear [] - (alter-var-root #'state/system (fn [sys] (halt-system sys) nil)) - (alter-var-root #'state/config (constantly nil)) - :cleared) - -(defn halt [] - (halt-system state/system) - (alter-var-root #'state/system (constantly nil)) - :halted) - -(defn suspend [] - (when state/system (ig/suspend! state/system)) - :suspended) - -(defn resume [] - (if-let [prep state/preparer] - (let [cfg (prep)] - (alter-var-root #'state/config (constantly cfg)) - (alter-var-root #'state/system (fn [sys] - (if sys - (resume-system cfg sys) - (init-system cfg nil)))) - :resumed) - (throw (prep-error)))) - -(defn reset [] - (suspend) - (repl/refresh :after 'integrant.repl/resume)) - -(defn reset-all [] - (suspend) - (repl/refresh-all :after 'integrant.repl/resume)) diff --git a/src/integrant/repl.cljc b/src/integrant/repl.cljc new file mode 100644 index 0000000..61b1a54 --- /dev/null +++ b/src/integrant/repl.cljc @@ -0,0 +1,115 @@ +(ns integrant.repl + (:require [integrant.core :as ig] + [integrant.repl.state :as state] + #?(:clj [clojure.tools.namespace.repl :as repl]))) + +#?(:clj (repl/disable-reload! (find-ns 'integrant.core))) + +(defn set-prep! [prep] + #?(:clj (alter-var-root #'state/preparer (constantly prep)) + :cljs (set! state/preparer prep))) + +#?(:clj (defn error [s] (Error. s)) + :cljs (defn error [s] (js/Error. s)) ) + +(defn- prep-error [] + (error "No system preparer function found.")) + +(defn prep [] + (if-let [prep state/preparer] + (do #?(:clj (alter-var-root #'state/config (fn [_] (prep))) + :cljs (set! state/config (prep))) + :prepped) + (throw (prep-error)))) + +(defn- halt-system [system] + (when system (ig/halt! system))) + +(defn- build-system [build wrap-ex] + (try + (build) + (catch #?(:clj clojure.lang.ExceptionInfo + :cljs ExceptionInfo) ex + (if-let [system (:system (ex-data ex))] + (try + (ig/halt! system) + (catch #?(:clj clojure.lang.ExceptionInfo + :cljs ExceptionInfo) + halt-ex + (throw (wrap-ex ex halt-ex))))) + (throw ex)))) + +(defn- init-system [config keys] + (build-system + (if keys + #(ig/init config keys) + #(ig/init config)) + #(ex-info "Config failed to init; also failed to halt failed system" + {:init-exception %1} + %2))) + +(defn- resume-system [config system] + (build-system + #(ig/resume config system) + #(ex-info "Config failed to resume; also failed to halt failed system" + {:resume-exception %1} + %2))) + +(defn init + ([] (init nil)) + ([keys] + #?(:clj (alter-var-root #'state/system (fn [sys] + (halt-system sys) + (init-system state/config keys))) + :cljs (set! state/system (do (halt-system state/system) + (init-system state/config keys)))) + :initiated)) + +(defn go + ([] (go nil)) + ([keys] + (prep) + (init keys))) + +(defn clear [] + #?(:clj (do (alter-var-root #'state/system (fn [sys] (halt-system sys) nil)) + (alter-var-root #'state/config (constantly nil))) + :cljs (do (set! state/system (do (halt-system state/system) nil)) + (set! state/config nil))) + :cleared) + +(defn halt [] + (halt-system state/system) + #?(:clj (alter-var-root #'state/system (constantly nil)) + :cljs (set! state/system nil)) + :halted) + +(defn suspend [] + (when state/system (ig/suspend! state/system)) + :suspended) + +(defn resume [] + (if-let [prep state/preparer] + (let [cfg (prep)] + #?(:clj (do (alter-var-root #'state/config (constantly cfg)) + (alter-var-root #'state/system (fn [sys] + (if sys + (resume-system cfg sys) + (init-system cfg nil))))) + :cljs (do (set! state/config cfg) + (set! state/system (if state/system + (resume-system cfg state/system) + (init-system cfg nil))))) + :resumed) + (throw (prep-error)))) + +(defn reset [] + (suspend) + #?(:clj (repl/refresh :after 'integrant.repl/resume) + :cljs (integrant.repl/resume))) + + +(defn reset-all [] + (suspend) + #?(:clj (repl/refresh-all :after 'integrant.repl/resume) + :cljs (integrant.repl/resume))) diff --git a/src/integrant/repl/state.clj b/src/integrant/repl/state.clj deleted file mode 100644 index cf03a64..0000000 --- a/src/integrant/repl/state.clj +++ /dev/null @@ -1,8 +0,0 @@ -(ns integrant.repl.state - (:require [clojure.tools.namespace.repl :as repl])) - -(repl/disable-reload!) - -(def config nil) -(def system nil) -(def preparer nil) diff --git a/src/integrant/repl/state.cljc b/src/integrant/repl/state.cljc new file mode 100644 index 0000000..6655c79 --- /dev/null +++ b/src/integrant/repl/state.cljc @@ -0,0 +1,8 @@ +(ns integrant.repl.state + #?(:clj (:require [clojure.tools.namespace.repl :as repl]))) + +#?(:clj (repl/disable-reload!)) + +(def config nil) +(def system nil) +(def preparer nil)