Вопрос про atom/agent/<что-то другое>.
Disclaimer: С кложей играюсь недавно
Задача: Нужна in-memory DB и по идее просто hash-map обернутый в atom подходит, с переодичным дампом данных в файл (в edn или json).
Проблема:
Ожидал что смогу с самого верхнего уровня передать в функцию запуска веб сервера (в примере http-server) atom (параметр db функции - http-server)
но получается так что после передачи, в функцию передается уже внутренняя структура которую содержит atom
Нагугленные решения выглядят как объявление функции (def in-memory-db (atom {})) и далее обращение к этому атому через fully.qualified.namespace.in-memory-db формат
что выглядит костыльным как минимум для того чтоб при тестировании можно было иметь несколько изолированных тестов запускаемых параллельно каждый из которых может писать
в свою изолированную копию atom. Судя по поведению agent'ы в плане передачи как параметра в функцию ведет себя так же как и atom
Вопросы:
1. В чем мое заблуждени(е/я) ? 😄
2. Как решаются подобные in-memory-db решения на базе атомов/агентов
Код:
(defn http-server [db]
(println "inside HTTP server scope =" (type db)))
(deftest demo-test
(testing "how to pass atom"
(let [db (atom {})]
(println "inside application bootstrap scope =" (type db))
(http-server [db]))
))
Output:
inside application bootstrap scope = clojure.lang.Atom
inside HTTP server scope = clojure.lang.PersistentVector
Заранее благодарен за разбор кейса 🙏