This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2018-07-15
Channels
- # beginners (16)
- # cljs-dev (12)
- # clojure (9)
- # clojure-berlin (5)
- # clojure-russia (16)
- # clojure-uk (26)
- # clojurescript (48)
- # community-development (2)
- # cursive (1)
- # data-science (10)
- # datomic (7)
- # emacs (27)
- # figwheel-main (31)
- # fulcro (6)
- # hoplon (47)
- # immutant (1)
- # jobs (1)
- # jobs-discuss (33)
- # off-topic (3)
- # onyx (34)
- # protorepl (5)
- # re-frame (26)
- # reagent (1)
- # reitit (1)
- # shadow-cljs (80)
- # spacemacs (44)
- # specter (4)
- # testing (1)
- # tools-deps (4)
@okilimnik Мне кажется проще завести edn-файл и постепенно наполнять данными. Если нужно много данных, посмотри либу test.check, у нее на борту хороший генератор. Он поддерживает в т.ч. генерацию связанных мам.
Господа, а как бы вы делали такую вещь: есть у меня некий компонент (не в смысле com.stuartsierra/component
) с состоянием. Чтобы его инициализировать, надо сделать три вещи по очереди (к примеру, создать директорию для временных файлов, открыть сокет к Selenium, создать в Selenium экземпляр браузера). Если какая-то из вещей ломается — надо откатить предыдущие. Если все три получились — надо компонент вернуть для вского разнообразного использования. Для деинициализации нужно все эти три вещи в обратном порядке отменить.
Т.е. хочется чего-то типа
(let [a (open-a)]
(try
(let [b (open-b a)]
(try
(let [c (open-c a b)]
(try
(do-some-stuff a b c)
(finally
(close-c c))))
(finally
(close-b b))))
(finally
(close-a a))))
Но менее ужасное: do-some-stuff
может быть асинхронным, длинным, и вообще хочется в этом месте точку возврата из функции, которая создаёт компонент.
Придумал нечто, но выглядит дико. Неужели лучше ничего не придумать?
(defn open []
(let [a (open-a)]
(try
(let [b (open-b a)]
(try
(let [c (open-c a b)]
{:a a :b b :c c})
(finally
(close {:a a :b b}))))
(finally
(close {:a a}))))
(defn close [{:keys [a b c]}]
(when c
(close-c c))
(when b
(close-b b))
(when a
(close-a a)))
;; usage
(let [session (open)]
(try
(do-some-stuff session)
(finally
(close session))))
@dottedmag two words: "Integ" "rant" 😉
Интересно, как интегрант работает рекурсивно: получится ли создать компонент, в котором внутри делается (ig/init)
/ (ig/halt!)
?
@dottedmag Мне кажется, mount
отлично ляжет в задачу, он поддерживает порядок вызова, но там даже проще все, если сделать defstate
зависимыми друг от друга, то порядок запуска и остановки учтется автоматически. Плюс он супер простой, буквально пару функций добавить.