Fork me on GitHub
#clojure-russia
<
2018-07-15
>
akond13:07:42

видно гитхаб не позволяет делать такие запросы

akond13:07:59

406 всё-таки

igrishaev16:07:27

@okilimnik Мне кажется проще завести edn-файл и постепенно наполнять данными. Если нужно много данных, посмотри либу test.check, у нее на борту хороший генератор. Он поддерживает в т.ч. генерацию связанных мам.

👍 4
dottedmag22:07:52

Господа, а как бы вы делали такую вещь: есть у меня некий компонент (не в смысле com.stuartsierra/component) с состоянием. Чтобы его инициализировать, надо сделать три вещи по очереди (к примеру, создать директорию для временных файлов, открыть сокет к Selenium, создать в Selenium экземпляр браузера). Если какая-то из вещей ломается — надо откатить предыдущие. Если все три получились — надо компонент вернуть для вского разнообразного использования. Для деинициализации нужно все эти три вещи в обратном порядке отменить.

dottedmag22:07:28

Т.е. хочется чего-то типа

(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))))

dottedmag22:07:01

Но менее ужасное: do-some-stuff может быть асинхронным, длинным, и вообще хочется в этом месте точку возврата из функции, которая создаёт компонент.

dottedmag22:07:53

Придумал нечто, но выглядит дико. Неужели лучше ничего не придумать?

(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))))

ag22:07:51

@dottedmag two words: "Integ" "rant" 😉

dottedmag22:07:22

Integrant для "временной директории" как-то уж слишком монструозно.

dottedmag22:07:56

Кроме того, у меня эти компоненты создаются и удаляются в runtime.

dottedmag22:07:05

Открыл один, поработал с ним, закрыл, открыл другой...

ag22:07:17

ну не знаю... imo integrant в самый раз тут

dottedmag23:07:47

Интересно, как интегрант работает рекурсивно: получится ли создать компонент, в котором внутри делается (ig/init) / (ig/halt!)?

dottedmag23:07:51

Да, в интегранте не видно глобального состояния никакого, можно попробовать.

ag23:07:22

можно инитить ключи по отдельности или всю систему целиком

rustam.gilaztdinov23:07:53

@dottedmag Мне кажется, mount отлично ляжет в задачу, он поддерживает порядок вызова, но там даже проще все, если сделать defstate зависимыми друг от друга, то порядок запуска и остановки учтется автоматически. Плюс он супер простой, буквально пару функций добавить.