Daniel
15.02.2018
19:55:04
вот еще старый рассказ
похоже для касандры только один вариант - джавовый драйвер и велосипед свой
всунуть IO чтобы везде оставить конкретные реализации без общего интерфейса
очень полезно
у них есть универсальная концепция Context
для каждой базы они реализуют свои (для кассандры Async, Sync и Mirror)
раньше у них для асинка были скаловые фьючи (обертка над CompletableFuture), для остального результат
в версии 2.0 они притащили IOMonad (своя реализация)
типа абстрагироваться от вычисления
из коробки осталось ScalaFutureIO и SyncIO для прочего
иерархия такая у контекстов (названия могут быть неточные и пара связей, но суть остается)
Context — MirrorContext
| |
CassandraContext — CassandraMirrorContext
|
CassandraSessionContext
| |
AsyncCassContext SyncCassContext
так вот IOMonad никто не содержит из них
Асинхронный контекст прибит к ScalaFutureIO
Синхронный и зеркало к SyncIO
теперь привычная реализация для черной обезьяны - это какой-нить CassandraDao(ctx: ???)
Контекст передается аргументом, потому что казалось бы разумно его вытащить и для тестов вместо Async всобачить Mirror. Но результат у методов ctx.run разный, а новый ctx.runIO объявлен в IOMonad и как результат отсутствует у общего предка контекстов
попробовал вытащить дсл часть из "дао", потому что её можно протестировать независимо, но это новый трейт рядом в который тоже надо инжектить ctx (который содержит не только ценные методы но и 3-4кг имплиситов, поэтому его содержимое еще надо добавить целиком в скоуп import ctx._)
но это в итоге шляпа и новый бойлерплейт вокруг дсл квилла
Google
Daniel
15.02.2018
19:55:04
а да, я от этого еще эмоционально не отошел и все время забываю, что хотел свою реализацию для ИО сделать, чтобы сразу в твиттеровские фьючи конвертировать, но в контексте уже вшиты скаловые
А - абстракция
и прекрасный ответ от мейнтейнера и автора этой монады
> you can create a new context similar to the existing async one that returns twitter futures
по иронии судьбы он работает в твиттере
Daniel
15.02.2018
19:55:14
Daniel
15.02.2018
19:55:27
но там все контексты штампуются довольно однотипно
просто в каждом случае своя реализация языка
Daniel
15.02.2018
19:57:42
Andrey
15.02.2018
20:00:05
@danslapman а ты асинхронным драйвером для постгри пользуешься?
Daniel
15.02.2018
20:00:15
Grigory
15.02.2018
20:34:13
Андрей
15.02.2018
21:12:39
идея не умеет скалу в джаву из буффера? только наоборот? - чёт поздно и возможно туплю….
IG
15.02.2018
21:13:11
Google
Nikolay
15.02.2018
21:13:24
умеет джаву в скалу из буфера
копипасть, она тебе предложит конвертировать, но сделает так, что ты заплачешь
она как та собака из комикса
Viacheslav
15.02.2018
23:18:12
пасаны ваще свагерята! Всем привет. Кто-нибудь юзал swagger + finch? Можно из/для финчА сгенерить сваггер эндпоинты/апишку или чо там генерят?
Daniel
15.02.2018
23:32:32
и Олегу пока не дали зеленый свет на оупенсорс, 2ая проблема
Nikolay
15.02.2018
23:44:07
Daniel
15.02.2018
23:48:30
А можно ссылку?
https://github.com/finagle/finch/issues/581
но порывшись нашел ишью уже про сваггер и там в комментах упоминают стороннии реализации
https://github.com/finagle/finch/issues/73
V
16.02.2018
00:41:22
// Мне кажется, мы стали забывать...
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val l = List(Future(1), Future(2), Future(3))
val myFuture: Future[List[Int]] = Future.sequence(l)
val newFuture: Future[List[Int]] = Future.traverse(l)(identity)
Oleg
16.02.2018
05:12:25
стали забывать, что traverse identity == sequence?
Kirill
16.02.2018
05:15:24
Вот это поворот!
Anatoly
16.02.2018
06:47:36
Кто-нибудь встречал статьи на Medium или Hackernoon c иллюстрациями собственно ручно нарисованными про то как работают технологии? Я помню была подобная статья про Kafka, но найти не могу
Alexander
16.02.2018
07:48:58
статьи нужны типа таких ?
https://hackernoon.com/thorough-introduction-to-apache-kafka-6fbf2989bbc1
Alexey
16.02.2018
08:05:51
https://itunes.apple.com/us/app/paper-by-fiftythree/id506003812?mt=8
я рисовал таким
но удобно только на ипаде
с телефона сложно
Oleg
16.02.2018
08:29:04
кто-то понимает, почему в cats.data.ZipList сделан только Apply . а не Applicative?
https://github.com/typelevel/cats/blob/ef64ff8d4e8f186c7cc7564d37eb734273cd70fc/core/src/main/scala/cats/data/ZipList.scala
вчера хотел скалану показать, как я делаю транспоуз через травёрс, и обнаружил, что зиплист-то не аппликатив
а скалаз было зашкварно
Google
Eugene
16.02.2018
08:45:02
sherzod
16.02.2018
09:34:42
А ясно, в котах есть слабая версия аппликатива. Проглядел что в apply List[A].
Daniel
16.02.2018
09:46:09
лол, запустил бенчмарки в strawman:
> Run progress: 22.94% complete, ETA 2 days, 11:24:24
и это уже спусят почти сутки
Oleg
16.02.2018
10:27:44
видимо потому что "прост"
https://github.com/typelevel/cats/pull/1938#pullrequestreview-74505197
с зипстримом всё ок, а зипвектор тоже инвалидный
Aleksei
16.02.2018
11:10:58
кстати кто не в курсе, мы открыли флудльню где можно все https://t.me/scala_flood
Bulat
16.02.2018
11:22:27
нинужин
Vadim
16.02.2018
12:23:23
Я вот думаю
если у нас есть метод
some[A](a:Option[A]):Future[A]
предположим
мы подадим на вход Option[Int]
сможет ли оно вернуть Future[Seq[Int]] ?
схавает?
Alexey
16.02.2018
12:24:57
мне кажется ты немного запутался )))
откуда Seq??
Google
Vadim
16.02.2018
12:25:18
смотри,вопрос вот в чем
метод из Option[A] -> Future[A]
Grigory
16.02.2018
12:25:35
заведи второй параметр B
some[A, B](a:Option[A]):Future[B]
Vadim
16.02.2018
12:26:04
блин
Aleksei
16.02.2018
12:26:10
ну еще надо будет тогда передать f: A => B
Alexey
16.02.2018
12:26:19
Vadim
16.02.2018
12:26:23
ща
я кароче наверное мысль свою плохо выражаю
я уже 15 минут думаю
и не работаю
надо попробовать
Aleksei
16.02.2018
12:26:48
невероятно плохо и при этом очень многословно, в скасти сделай сниппет понятнее будет =)
Alexey
16.02.2018
12:27:21
или просто рассказать что ты хочешь получить, а не то как нам допилить решение которое тебе пришло в голову
Vadim
16.02.2018
12:27:34
простите =(
Alexey
16.02.2018
12:27:52
да, не, нам тоже весело, но это не приближает тебя к решению твоей проблемы
а куда пропал foldM для Set???
https://github.com/typelevel/cats/commit/1f0cba0490d22dc945a38f39c21f0a616202b574#diff-eea7ea856b0e132389c70620f0ad3afa
:(
решили что не нужен fold для set
Google
Vladimir
16.02.2018
12:42:21
курица не птица, сет не монада
Oleg
16.02.2018
12:42:45
https://github.com/typelevel/cats/blob/master/alleycats-core/src/main/scala/alleycats/std/set.scala
сет из-за хеширования неблагозаконная монада
import alleycats.std.set._
Dmitry
16.02.2018
12:44:56
Так вроде ж алейкет задеприкейтили, не?
Oleg
16.02.2018
12:45:48
нет, наоборот, его втащили в основную репу, задепрекейтил старый отдельный репозиторий
Dmitry
16.02.2018
12:46:25
Ну да, я про это собсна. А название пакета сохранилось?
Oleg
16.02.2018
12:47:30
нет
Alexander
16.02.2018
15:47:37
а что за alleycats, просветите?
Daniel
16.02.2018
15:48:25
судя по названию, грязные непослушные котики
Nikita
16.02.2018
17:18:20
вообще их уже помержили в cats, но нормальный ридми не завезли почему-то
Oleg
16.02.2018
19:01:59
юзайте на свой страх и риск
конкретно traversable для set нарушает
foldMap f . fmap g = foldMap (f . g)
потому что слева после map сет перетусует элементы и фолдиться они будут в другом порядке, нежели справа
Но для коммутативных моноидов тебе должно быть плевать, поэтому иногда ты захочешь поюзать такой вот треверсабл