
Grigory
07.02.2018
06:06:45
Значит shapeless... спасибо
так честно говоря, контекста не очень много ты добавил, давай примером псевдо кода что есть и что хочется сделать

ilnur
07.02.2018
06:14:59
Конфиг
{
"inputFiles" : "/home/ilnur/Загрузки/csvToDataset/src/main/resources",
"outputFile" : "/home/ilnur/Загрузки/csvToDataset/src/main/resources/result/",
"transformationType" : {
"where" : [0, 1],
"equalTo" : [0, 1]
},
"columns" : [
"String",
"Int"
]
}
в массиве columns - схема
далее
парсим

Google

ilnur
07.02.2018
06:15:37
case class Config(inputFiles: List[Path], outputFile: String, where: Where, equalTo: EqualTo, columns: List[String])
далее читаем файлы
private val inputFiles = config.inputFiles.map { path =>
env.readCsvFile[(String, Int)](path.toString)
}
только типы я тут указал "вручную"
[(String, Int)]
не знаю как список туда передать в конце концов
columns: List[String]

Oleg
07.02.2018
06:18:16

ilnur
07.02.2018
06:20:31
ок

Oleg
07.02.2018
06:24:00
только типы я тут указал "вручную"
[(String, Int)]
но идея такая.
"Динамическим" мы называем то, что может изменяться с течением времени, "Статическим" - то, что сохраняет своё состояние, известное априори.
Если ты желаешь, чтобы информация, которую ты получишь, управляла твоим процессом, описанным на скалке, где типизация, напомню, статическая, у тебя два выхода
1 - компилить программу после того, как список типов станет тебе известным. Возможно, каждый раз при запуске потока.
2. смириться с динамической природой твоей структуры и использовать библиотеки не требующие явного полного определения типа строки. Можно только убедиться при чтении, что в источнике есть столбцы нужных тебе типов, и использовать этот факт уже статически в дальнейшем коде.
В 1-м случае тебе могут помочь и шейплес, и макросы, и компайлер/билд плагины
Но я рекомендую второй

ilnur
07.02.2018
06:29:01
спасибо за развернутый ответ
?

Wystan
07.02.2018
06:55:45
Прямо совсем в общем случае вряд ли какое-то разумное решение можно придумать. Если первая строчка csv файла - это лист хедеров, то я бы сделал case class со всеми возможными хедерами. Ну и кастомный ридер, что, основываясь на первой строчке. их заполняет. А уж дальше с кейс-классами просто работать

Dim
07.02.2018
07:19:30
@tailrec
def sliceEqual[A](s: Seq[A], acc: Seq[Seq[A]] = Seq()): Seq[Seq[A]] = {
s match {
case fst :: rest =>
val (l, r) = s.span(fst==)
sliceEqual(r, acc :+ l)
case Nil => acc
}
}

Google

Dim
07.02.2018
07:20:36
Делюсь решением одной задачки)
В обще делает из "ваау, ух ты крууутоо!" => "вау, ух ты круто!"

Oleg
07.02.2018
07:27:45
когда поправишь, переделай на foldLeft

Vladimir
07.02.2018
07:31:29
propertybased test InputSeq == OutputSeq.flatten

Vadim
07.02.2018
07:41:18
моя непонимать смысла функции)

Daniel
07.02.2018
07:42:06
я думал я дурак, полез тестить

Oleg
07.02.2018
07:42:27

Vadim
07.02.2018
07:42:50

Daniel
07.02.2018
07:43:20

Grigory
07.02.2018
07:47:30

Oleg
07.02.2018
07:47:35
ничего не поменялось)
не совсем точно, но близко https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BB%D0%B8%D0%BD_%D1%81%D0%B5%D1%80%D0%B8%D0%B9

Vadim
07.02.2018
07:52:54
а вкурил - пасиб олег)

Nikita
07.02.2018
08:27:35
Объясните пожалуйста, знатоки. Чем именно отличается потоковый вывод типов в скала от механизма вывода типов в стиле Хиндли - Милнера? И что значат слова Одерски:
В сравнении со стилем Хиндли - Милнера имеющийся в Scala механизм вывода типов обходится с объектно-ориентированной системой подтипов намного изящнее?

Oleg
07.02.2018
08:30:38
классический пример рекурсивная функция - в хиндли милнере ты можешь полагать, что все ветки условного выражения или матчинга одного типа.
С субтайпингом, ты ищешь наиконкретнейший общий тип, что в случае с рекурсией приводит к уравнению с твоей функцией в обеих частях
ну и т.д. и т.п.

Nikita
07.02.2018
08:36:26

Oleg
07.02.2018
08:37:02
Но в скалке всё ещё сложнее. Там есть path dependent types, что ещё не завтипы, но ставит те же ограничения на направление вывода типов

Google

Oleg
07.02.2018
08:37:55
Но лучше пойти а чатик завтипов и спросить у пацанов в теме

Grigory
07.02.2018
09:20:52
Scalalaz #38 - Haskell Yeaah с Алексеем Пироговым http://scalalaz.ru/series-38.html
Кто еще не видел, ну а кто не видел то без пина и не было наброса сюда ибо всякие митапы и тому подобное.
Юрий Спойлер: фомкин слился и поэтому твой вопрос до сих пор без ответов

Aleksei
07.02.2018
09:23:33
спился =)

Юрий
07.02.2018
09:26:15

Grigory
07.02.2018
09:26:30
кто-то приврал просто или перебрал

Александр
07.02.2018
09:43:31

Grigory
07.02.2018
09:43:57

Oleksandr
07.02.2018
10:30:16
https://softwaremill.com/comparing-scala-relational-database-access-libraries/

Oleg
07.02.2018
10:58:15
старьё, даже в ништяках есть

Pavel
07.02.2018
11:20:06
В kamon (akka) можно как-то поменьше метрик слать? По акторам очевидно как фильтрануть, а метрик все равно 100500. В datadog все приходит, остальные жалуются. В доках ничего, как бы я ничего не упускаю(?).

Oleg
07.02.2018
11:31:10
ой профунктор тоже старьё кидает, про зеленоградского стива джобса

Daniel
07.02.2018
11:32:08
после обвала курса биткоина не может продлить подписку на свежие мемасы

Alexey
07.02.2018
11:34:44
старье про либы для баз варски обновил, вот все и кидают

Александр
07.02.2018
11:53:23

Oleg
07.02.2018
11:56:55

Daniel
07.02.2018
12:59:34
Там в твитторе новая волна разборок на тему харассмента и лямбда конфа, кто-нибудь вникал от чего полыхнуло вновь?

Daniel
07.02.2018
13:00:14

Vadim
07.02.2018
13:00:31
господа,есть вопрос

Google

Vadim
07.02.2018
13:02:45
предположим что фьюча есть, в akka routing, которая в зависимости от результата должна возвращать одну из версий rest модели.
Есть ли какой то способ выполнить метод complete(akka routing dsl) из фьючи ?

Alexey
07.02.2018
13:04:10
по хорошему тебе надо написать директиву, которая вернёт тебе ToReponseMarshaller в зависимости от результата

Aleksei
07.02.2018
13:05:16
@IceTFoer https://markatta.com/codemonkey/blog/2016/08/03/actor-per-request-with-akka-http/
глянь может подойдет

Alexey
07.02.2018
13:05:50

Vadim
07.02.2018
13:06:03
момент

Alexey
07.02.2018
13:06:12
ему нужен маршаллер как я понимаю разный

Aleksei
07.02.2018
13:06:32
а я подумал что он хочет передавать реквест контекст в сервис и там внутри во фьюче его комплитить
кто прав?

Alexey
07.02.2018
13:06:46
да, условие целиком нужно )

Vadim
07.02.2018
13:07:19
есть директива`onSuccess`

Aleksei
07.02.2018
13:07:37
логично
а есть onComplete
=) короче нужно больше вводных

Vadim
07.02.2018
13:10:42
вот примерно что я хочу

Alexey
07.02.2018
13:11:24
map
выдели функцию Request => Future[Response] и используй ее в роутинге. потом реализуй. ну и стримы тебе в этом примере не нужны от слова совсем. просто сделай отправку в очередь: Data => Future[Unit]

Vadim
07.02.2018
13:14:58
ща подумаем,спасибо =)

Alexey
07.02.2018
13:17:55
вот такое тебе нужно:
def sendToQueue(x: String): Future[Unit] = ???
def handleRequest(x: String): Future[Response] = {
sendToQueue(x).map(_ => successResponse).recover {
case th => failureResponse
}
}
entity { e =>
complete(handleRequest(...))
}

Google

Alexey
07.02.2018
13:18:20
синтаксис сам поправишь )

Vadim
07.02.2018
13:20:38
чет ты не то советуешь - а как мандить с http кодом?

Alexey
07.02.2018
13:21:26
но ведь ответ может быть парой код и значение
для этого даже специальный маршаллер есть. для тапла

Vadim
07.02.2018
13:24:15
фигаж

Alexey
07.02.2018
13:24:41
ну ))

Aleksei
07.02.2018
13:27:10
ога
Ok -> Result =)

Vadim
07.02.2018
13:29:39
Я идею понял,это главное.Спасибо :)

Aliaksandr
07.02.2018
13:35:34
можно написать 2 маршаллера и в complete передавать Future
implicit val marshaller: Marshaller[Model0, HttpResponse] =
Marshaller.withFixedContentType(ContentTypes.`application/json`)(model0 => HttpResponse(StatusCodes.OK, model0))
implicit val customThrowableMarshaller: Marshaller[Throwable, HttpResponse] =
Marshaller.withFixedContentType(ContentTypes.`application/json`) {
case MyException(model1) => HttpResponse(StatusCodes.OK, model1)
case _ => HttpResponse(StatusCodes.InternalServerError)
}
complete(future)

Andry
07.02.2018
13:58:23

Gennady
07.02.2018
13:58:57
среда - неудачный день для пивной вечеринки (

Vadim
07.02.2018
13:59:38
я пасс,до дома ехать далеко.Оставаться в баре в среду не ок

Daniel
07.02.2018
14:00:55
по голосовалке было человек 5, не считая инициаторов
может кто-то еще так придет

Vadim
07.02.2018
14:01:40
забавно будет если никто не придет =)