
Александр
14.12.2017
13:09:35

Alexander
14.12.2017
13:09:52
а иначе кому отдаётся сабскрипшн - непонятно
почему тебя это вообще волнует?

Oleksandr
14.12.2017
13:10:30
я не до конца понимаю спеку
раз так, то я наверняка что-то упустил

Google

Alexander
14.12.2017
13:11:07
просто реализуй паблишера

Oleksandr
14.12.2017
13:11:26
в общем, можно ли считать, что эта спека — что-то вроде монадных законов, и её корректная на 100% реализация подразумевается априори ?

Alexander
14.12.2017
13:12:17
https://github.com/reactive-streams/reactive-streams-jvm/tree/master/tck

Oleksandr
14.12.2017
13:13:31
о, круто, как-то не заметил эту штуку, спасибо

Yura
14.12.2017
13:40:08
А можете подсказать, столкнулся с проблемой. Примешиваю трейт в несколько классов, в трейте находится набор полей, можно ли сделать так, что бы поля в трейте инициализировали единожды и в потомков ушёл один объект?

Eugene
14.12.2017
13:41:19
положить рядом с трейтом object компаньон и там держать синглетон инициализацию
trait AppConfig {
val config = AppConfig.config
protected val gamesInPool = config.as[Int]("nodewars.pool.games.count")
protected val endpoint = config.as[String]("nodewars.endpoint")
protected val prod = config.as[Boolean]("nodewars.prod")
}
object AppConfig {
lazy val config = ConfigFactory.load()
}
типа так?

Yura
14.12.2017
13:42:49
Спасибо, не додумался через def прокинуть ссылку на синглетон

Eugene
14.12.2017
13:43:40
как вы тут код форматируете? сдедал через тройный обратные кавычки как в мануале написано а он обычным текстом...

Aleksei
14.12.2017
13:44:27
def main
ну вот обратные

Eugene
14.12.2017
13:44:42
lazy val config = ConfigFactory.load()

Google

Eugene
14.12.2017
13:44:45
хм
magic

Aleksei
14.12.2017
13:45:09
отредактируй попробуй свое

Eugene
14.12.2017
13:45:53
неа - у меня не получается
одинарные обратные кавычки вот как чуть выше получилось
а тройные нет
а во затащщило, спасибо
нельзя перевод строки делать

Aleksei
14.12.2017
13:50:41
можно
надо делать тройные бэктики
на отдельных строках перед и после
тогда ок

Eugene
14.12.2017
13:52:20
спасибо

Oleksandr
14.12.2017
14:21:16
abstract class Column {
type T
val data: Array[T]
}
abstract class Encoder[T] {
val initialState: Seq[Column]
def encode(t: T): Seq[Column#T]
}
можно ли как-то зафорсить, чтобы тип результата у encode был именно тем, что выдается от initialState ?
грубый пример использования:
T = (Int, String)
initialState = Seq(new Int32Column, new StringColumn)
encode(...): (Int32Column#T, StringColumn#T) === (Int, String)

Alexey
14.12.2017
14:27:09
Тип колонок надо каждую отдельно сохранять

Eugene
14.12.2017
14:27:29
так неочень получится, потому что T находится внутри Column
соответственно надо Encoder[T] переписать тоже на Encoder { type T }

Oleksandr
14.12.2017
14:28:55
в этом сниппете энкодер можно по-всякому менять
а вот Column фиксированный (этот хак нужен)
идея в том, чтобы преобразовывать класс предметной области(кейс класс, тапл, ...) в нечто-состоящее-из-нужных-типов-колонок

Eugene
14.12.2017
14:30:10
а чем shapeless не подойдет?
там как раз куча генераторов на case class которые все приведут к HList
а уж на HList можно писать какие там нужно типобезопасные преобразования
и тогда на initialState мапится Poly c нужными типами

Google

Oleksandr
14.12.2017
14:32:01
крайне не хочется делать зависимость на шейплесс, по ряду причин

Eugene
14.12.2017
14:32:20
ну вы там по сути изобретаете его часть

Oleksandr
14.12.2017
14:32:21
можно считать это ограничением, без шейплеса :)

Eugene
14.12.2017
14:32:47
ну тогда надо добавить implicit evidence в метод, чтобы связать T и Column#T
но это будет боль
/me ненастоящий сварщик

Oleksandr
14.12.2017
14:36:13
я не уверен, что это и с шейплесом можно, мб я хочу странного
в частности,
val int32Encoder = new Encoder[Int]() {
override val initialState = Array(new Int32Column(...))
override def encode(t: Int) = {
Seq(t: Int32Column#T)
}
}
компилятор ругается
[info] Int <: T( forSome { type T <: chdriver.core.columns.Column#T })?
[info] Nothing <: Int?
[info] true
[info] Int <: chdriver.core.columns.Column#T?
[info] false
[info] false
, что как бы логично

Eugene
14.12.2017
14:37:05
а если с другой стороны зайти, и вместо засовывания encoder в отдельный трейт - просто сделать его тайпклассом?
и определить для Int32Column, StringColumn etc?

Oleksandr
14.12.2017
14:37:29
я так и хочу :)

Eugene
14.12.2017
14:38:06
не, ты хочешь чтобы сделать для Seq[Column]
компилятор не осилит понять что там за Seq[Column] в общем случае

Oleksandr
14.12.2017
14:38:35
только усложняется это тем, что обьекты предметной области мапятся на несколько колонок — например, case class Foo(i: Int, s: String) может мапиться на Int32Column, StringColumn

Alexey
14.12.2017
14:39:25
Можно конечно туплами разрулить, но это такое

Eugene
14.12.2017
14:40:00
Foo в данном случае - это Product, чтобы достать из него параметры типов - надо писать макрос или брать Shapeless

Oleksandr
14.12.2017
14:40:44
или попросить энкодер, который уже как-то будет сгенерен

Alexey
14.12.2017
14:40:58
meh

Eugene
14.12.2017
14:41:05
я бы взял макрос и не морочил голову, если не хочется shapeless
это не больно

Google

Oleksandr
14.12.2017
14:41:47
не в боли дело, а в лишней зависимости, и усложнении джава апи

Alexey
14.12.2017
14:42:10
Джава апи и тайпклассы

Eugene
14.12.2017
14:42:29
как мне кажется, в методах initialValue: Seq[Column] и encode: Seq[Column#T] нет никакой возможности связать типами initialValue и encode

Oleksandr
14.12.2017
14:42:31

Alexey
14.12.2017
14:42:58
а макросы?

Eugene
14.12.2017
14:43:05
а если это еще и из джавы вызывать - то ой
БЕГN

Admin
ERROR: S client not available

Oleksandr
14.12.2017
14:43:30
гм, да, надо все как-то проще
или забить на джаву :)

Eugene
14.12.2017
14:43:48
я бы сделал комбо - сделал проще и забил на джаву

Alexey
14.12.2017
14:43:50
Система типов джавки тебя пошлёт куда подальше

Oleksandr
14.12.2017
14:44:19
ладно, буду рыть дальше, спасибо за советы

Eugene
14.12.2017
14:44:51
shapeless - то, что тебе действительно надо если у тебя куча преобразований на case class
остальное будет или криво, или больно

Eugene
14.12.2017
14:58:20
хммм можно ли как-то сделать дефолтный тайпкласс?
скажем у меня из всего множества типов только для двух реализованы тайпклассы, для остальных я хочу дефолтный подсунуть...
звучит как влажные мечты конечно

Alexey
14.12.2017
14:58:49
Ну вообще не шибко сложно

Eugene
14.12.2017
15:03:43
variance

Eugene
14.12.2017
15:04:24
Да я вроде разобрался спс

Alex
14.12.2017
15:19:18
https://github.com/marcinzh/skutek было?

Google

Alex
14.12.2017
16:04:30
https://twitter.com/milessabin/status/941248412862861312

Daniel
14.12.2017
16:10:56
шейплезз3, скала10

Nikolay
14.12.2017
16:12:17
shapeless 3 на какой scala будет? 2.x или уже dotty?
а Miles уже рассказывал про shapeless 3 на каких-то конференциях?

Dmitry
14.12.2017
16:16:00
Может он как Сысоев
Пилит втихаря уже много лет
И никому не показывает

Alex
14.12.2017
16:17:13
в эту ветку последний коммит 2.5 года назад был :)

Dmitry
14.12.2017
16:17:28
В закрытой репе
Лол

Nikolay
14.12.2017
16:18:07
такой "к черту ваш опенсорс, будет shapeless enterprise версия по подписке, и точка!"

Grigory
14.12.2017
16:18:22

Dmitry
14.12.2017
16:18:26
И бэкпорты

Nikolay
14.12.2017
16:42:00
https://twitter.com/LukaJacobowitz/status/941335776209571840
с scalax обычно быстро видео выкладывают

Alexey
14.12.2017
16:49:46
https://blog.toggl.com/wp-content/uploads/2017/04/toggl-how-to-kill-the-dragon-with-9-programming-languages.jpg
они там ничего не попутали про Cкалу?

Oleg
14.12.2017
19:36:03

Nikolay
14.12.2017
20:14:37
https://skillsmatter.com/skillscasts/11104-shapeless-is-dead-long-live-shapeless
вообще есть уже видео