Fork me on GitHub
#clojure-russia
<
2016-03-17
>
rm07:03:26

привет. А как мне в cljs сделать свап в двух местах или последовательно, или так, чтобы реакт не влез между двумя свапами?

rm07:03:04

ну или можно как-нибудь типа (swap! x assoc :x 1 assoc-in [:y :z] 2) ?

larhat07:03:48

транзакция то есть нужна? ref и dosync в клжс можно кстати?

rm07:03:00

да, транзакция

fxposter08:03:47

1 же атом

rm08:03:03

у меня в другом проекте есть решение с core.async, но это как-то стремно тащить его ради пары строк.

fxposter08:03:06

(swap! x (fn [value] do anything here ))

rm08:03:28

спасибо

rm08:03:56

блин, как же я так. fxposter, большое спасибо

fxposter08:03:18

(swap! x (fn [x] (do (assoc x :x 1) (assoc-in x [:y :z] 2))))

fxposter08:03:24

так не сработает же

fxposter08:03:41

(swap! x (fn [x] (-> x (assoc :x 1) (assoc-in [:y :z] 2))))

fxposter08:03:44

так сработает

rm08:03:25

а чому не сработает? В репле вроде ок

rm08:03:32

понял

rm08:03:37

еще раз спасибо

fxposter08:03:44

не за что

rm15:03:24

а как в datascript задать первичный ключ?

abtv16:03:49

@rm а ты datascript в связке с чем используешь?

rm16:03:51

abtv: с реагентом. Или что ты имеешь в виду? База на сервере? мускул

prepor16:03:57

Пацаны, кто-нибудь занимался локализацией приложение в clojure / clojurescript?

abtv16:03:56

@rm да, именно фреймворк на фронте. ты и datascript базу используешь и в атомах данные хранишь?

rm16:03:16

да. У меня один стейт в реагентовом атоме, там несколько датаскриптовых баз и всякие другие штуки по мелочи

abtv16:03:06

а почему все в датаскриптовой базе не хранить, тормозить будет?

rm16:03:27

а зачем все? там все, что не в датаскрипте -- единичные значения

abtv16:03:26

ну один способ доступа чтобы был, хотя и правда, наверное, не факт что нужно, если там разные сервисы

rm17:03:54

чота все равно не понимаю. Вот у меня есть игрушечное приложение, в нем такой стейт:

(defonce default-state
  {:date nil
   :requested? {:users false :meals false}
   :meals (db/empty-db {:meal_id {:db/index true}
                           :date {:db/index true}
                           :time {:db/index true}})
   :users {db/empty-db {:login {:db/index true}}}
   :user "one"
   :filter {:date {:from nil :to nil}
            :time {:from nil :to nil}}})
зачем мне что-то совать в датаскрипт из того, что не там?

delaguardo17:03:45

@prepor я ковырял локализацию, а что интересует?

prepor17:03:21

@delaguardo: для начала решение работающее и в clojure и clojurescript одновременно

prepor17:03:04

@delaguardo: с каким-то простым форматом определения строк, который можно свести к стандартным key/value (gettext, json)

abtv17:03:15

@rm я так понимаю, что у тебя часть данных в базе на клиенте, а часть в атоме, правильно?

delaguardo17:03:18

tower неплох если только локализация, без плюрализации и форматирования дат и чего нибудь еще

delaguardo17:03:25

https://github.com/DeLaGuardo/boot-gettext - вот еще моя поделка, сырая правда сильно

rm17:03:30

abtv: ну вот стейт он один, суется в атом и потом туда складываются и базы, и значения.

prepor17:03:32

delaguardo: tower по первых не сводится к k/v. во-вторых плюрализация нужна конечно )

prepor17:03:13

delaguardo: оно mo файлики генерит или таки с gettext его ничто не связывает?

prepor17:03:47

и оно генерит какой-то свой формат?

delaguardo17:03:07

ничего кроме названия не сыязывает (

delaguardo17:03:14

не довел пока до ума

abtv17:03:14

@rm вот тут я запутался) я с датаскриптом не работал (потому и спросил), но а как ты данные запрашиваешь и изменяешь? у тебя есть сервисный ns для этого, который уже содержит детали реализации (swap! для атома и что там есть для датаскрипта)?

rm17:03:51

abtv: ну потому что датаскрипт -- это не совсем база, это такой хитровыдуманный мап

rm17:03:26

http://codepad.org/6oYJT12d вот мой ns для стейта, обрати внимание на update-meals-state

abtv17:03:18

а зачем ты делаешь (:meals @state) если он у тебя уже в x? @rm

abtv17:03:06

в смысле: зачем @state?

rm17:03:57

и правда

abtv17:03:55

и можно (fn [{:keys [meals] :as x}] ... ) чтобы лучше читалось

abtv17:03:44

меня чего-то смущает хранение базы внутри атома вместе с другими значениями... может я чего-то не понимаю simple_smile @rm

abtv17:03:22

если это чисто мап такой, то ок, но как-то странно

rm17:03:32

ну получается удобно

abtv17:03:38

ну для чтения наверняка удобно, а вот как изменить данные? в твоем примере ты просто заменяешь базу целиком, правильно?

rm17:03:09

я ее обновляю

rm17:03:13

то есть, если есть в ней 100 записей, а прилетело еще 100, то я напишу (db-with old new-map) и оно обновится

rm17:03:16

а блин

rm17:03:22

да, я ее заменяю :)

rm17:03:37

ну дык ФП, вся фигня

abtv17:03:23

во, так получается, что на чтение ты используешь датаскрипт, а на изменение свопаешь атом)) думаю, это не лучший подход (заменять базу целиком)

abtv17:03:55

там нельзя обновить датаскриптом только то, что нужно?

rm17:03:03

можно, там есть функция transact!, но я не осилил им пользоваться

abtv17:03:14

во, я думаю его и надо заюзать. иначе человеку со стороны (например, мне) будет тяжело разобраться в таком даже не большом проекте. не идиоматично и запутанно simple_smile

abtv17:03:43

я бы тогда вообще все сделал на датаскрипте, а если какие-то данные будут тяжелые, то можно вынести в атом, но не мешать их вместе

rm17:03:07

а как реагенту бибикать, что оно обновилось и пора перерисовать?

potapenko17:03:34

@rm: ну стейт обновить.

rm17:03:14

potapenko: ну для этого датаскриптовая база должна быть в стейте. Я не вижу в этом ничего плохого, но abtv протестует

potapenko17:03:12

основа реагента их атомы и реакшены

rm17:03:21

я вижу, ты тут используешь create-conn. Я так понимаю, там обычный, нереактивный атом

potapenko17:03:43

сделай фейковый атом и обновляй его

potapenko17:03:57

без атомов делать как-то через задницу

abtv17:03:19

ну мне сложно сказать, я датаскрипт не юзал, но я думаю, что (ds/db-with (:users @state) data) не изменяет данные в базе как задумано разработчиком датаскрипта, а создает новую базу, вот тут я и протестую, как говорит @rm simple_smile потому что коряво. А в связке реагента и датаскрипта судя по примеру (не моему) будет возня с подписками и отписками в :component-will-mount и :component-will-unmount , чтобы сказать реагенту, что данные изменились и пора перерисоваться. В общем, я не настаиваю, потому что сам не знаю, но мое чутье протестует simple_smile

rm18:03:53

abtv: спасибки, потом гляну

rm18:03:05

в двух словах, как они делают?

oxgrouby18:03:56

напомните плиз, а чому реагент, а не ом?

rm18:03:01

ом сложный

oxgrouby18:03:23

он притворяется

oxgrouby18:03:50

хотя я не долго его пинал, может чо не понял)

abtv19:03:27

@rm а ничего нового: создают атом и используют datascript/listen!, который сам изменяет значение атома, когда меняется значение по конкретному запросу. Просто ты внутри каждого компонента вызываешь bind (в котором спрятан вызов datascript/listen!) и он уже возвращает тебе обычный атом для реагента. В презентации почему-то нет примера с вызовом unbind, думаю его нужно вызывать, чтобы не плодить лишние атомы.

abtv19:03:17

ну и bind сам может создать атом, если ты ему передашь соединение и запрос.