aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2023-03-23 17:56:29 +0000
committers-ol <s+removethis@s-ol.nu>2023-03-23 18:01:46 +0000
commit697c1d7b4602f516c6f01105f19f6daa68708065 (patch)
treeef99f0f6882334ca8d720180bc2ff820cad2360b
parentadd Dockerfile, build support (diff)
downloadelectric-sudoku-697c1d7b4602f516c6f01105f19f6daa68708065.tar.gz
electric-sudoku-697c1d7b4602f516c6f01105f19f6daa68708065.zip
persist state using duratom
-rw-r--r--Dockerfile2
-rw-r--r--deps.edn3
-rw-r--r--src/app/sudoku.cljc20
3 files changed, 22 insertions, 3 deletions
diff --git a/Dockerfile b/Dockerfile
index 6c39f1e..eec2097 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -21,6 +21,8 @@ FROM amazoncorretto:11 AS app
WORKDIR /app
COPY --from=build /app/app.jar app.jar
EXPOSE 8080
+VOLUME /data
+ENV SUDOKU_STATE_FILE=/data/sudoku.edn
ARG VERSION
ENV VERSION=$VERSION
CMD java -DHYPERFIDDLE_ELECTRIC_VERSION=$VERSION -jar app.jar
diff --git a/deps.edn b/deps.edn
index c160c93..7eaf217 100644
--- a/deps.edn
+++ b/deps.edn
@@ -9,7 +9,8 @@
org.clojure/clojure {:mvn/version "1.11.1"}
org.clojure/clojurescript {:mvn/version "1.11.60"}
org.clojure/tools.logging {:mvn/version "1.2.4"}
- de.sfuhrm/sudoku {:mvn/version "5.0.1"}}
+ de.sfuhrm/sudoku {:mvn/version "5.0.1"}
+ duratom/duratom {:mvn/version "0.5.4"}}
:aliases {:dev
{:extra-deps
{binaryage/devtools {:mvn/version "1.0.6"}
diff --git a/src/app/sudoku.cljc b/src/app/sudoku.cljc
index 2137bba..dcbafb1 100644
--- a/src/app/sudoku.cljc
+++ b/src/app/sudoku.cljc
@@ -4,11 +4,13 @@
(:require [hyperfiddle.electric :as e]
[hyperfiddle.electric-dom2 :as dom]
[hyperfiddle.electric-ui4 :as ui]
- [clojure.string :as string]))
+ [clojure.string :as string]
+ #?(:clj [duratom.core :refer [duratom]])))
;;; logic
;;;;;;;;;
+
(defn map2dv [f]
(mapv #(mapv (partial f %) (range 9)) (range 9)))
@@ -34,16 +36,30 @@
(if (number? v) #{v} v))
; (and (not notes) (set? v) (= 1 (count v))) (first v)
+
;;; app state
;;;;;;;;;;;;;
+
; dynamic def for sharing state between server/client
(e/def state)
+#?(:clj (defn make-atom [init-val]
+ (let [state-file-path (System/getenv "SUDOKU_STATE_FILE")]
+ (if state-file-path
+ (do
+ (println "storing state in" state-file-path)
+ (duratom :local-file
+ :file-path state-file-path
+ :init init-val))
+ (atom init-val)))))
+
; server-side atom for actual storage
-(def !state #?(:clj (atom (make-sudoku 64))))
+(def !state #?(:clj (make-atom (make-sudoku 64))))
+
;;; view stuff
;;;;;;;;;;;;;;
+
(defn i->num [v]
(inc (+ v (quot v 3))))