Size: a a a

Scala User Group

2020 April 23

DG

Denis G in Scala User Group
Paveλ M
насколько я помню, Т инвариантен
sealed abstract class Try[+T] extends Product with Serializable {
или я что-то путаю, но вроде не инвариантен
источник

Oℕ

Oleg ℕizhnik in Scala User Group
а map.map и map.flatMap лучше вручную срастить в один вызов
источник

DG

Denis G in Scala User Group
Oleg ℕizhnik
последний flatMap упрощается до map
ахх да.
я там что-то делал непонятно зачем.
спасибо)))
источник

PM

Paveλ M in Scala User Group
Denis G
sealed abstract class Try[+T] extends Product with Serializable {
или я что-то путаю, но вроде не инвариантен
ничего не путаете, ковариантен, my bad.
источник

DG

Denis G in Scala User Group
из интереса, кто-то в проде уже использует Дотти или он еще сырой?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
синтаксис меняют слишком радикально с каждой версией
источник

DG

Denis G in Scala User Group
Oleg ℕizhnik
а map.map и map.flatMap лучше вручную срастить в один вызов
ага. так и сделал)))
я уже не помню, почему мне там нужен был отдельный flatMap
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Denis G
зачем, что?

в двух словах у меня старый проект на нетипизированных акка-акторах и мне нужно его допилить

код такой
Future
   .sequence(peers
               .map(peer => (peer ? _ValueForKey(key))(peerConnectionTimeout))
               .map(_.transform(Success(_))))
   .map { responses =>
     responses
       .collect { case Success(x: PersistedDataStoreValue) => x }
       .groupBy(_.creationTimestamp)
       .maxBy(_._1)
       ._2
   }
   .flatMap { latestKeyValueOccurences =>
     val occurences = latestKeyValueOccurences.length
     val responseVal = latestKeyValueOccurences.head.value

     val x = if (occurences < r) None else Some(responseVal)
     Future(GetResponse(key, x))
   }
}
.pipeTo(sender)
суть в том, что я отправляют пирам запрос. могу получить либо Success со своим респонсом (но так как я использую старые акторы, респонс не типизирован) поэтому Try[Any]
у вас в первой части в transform Try оборачивается в Success
источник

DG

Denis G in Scala User Group
Oleg ℕizhnik
у вас в первой части в transform Try оборачивается в Success
это по-видимому не правильно, потому что мои тесты падают на
[info]     java.lang.AssertionError: assertion failed: expected GetResponse(MockKey(key,5),None), found Future(Success(GetResponse(MockKey(key,5),None)))
источник

DG

Denis G in Scala User Group
я просто хочу отфильтровать те, которые вернули ответ до таймаута
источник

DG

Denis G in Scala User Group
Oleg ℕizhnik
у вас в первой части в transform Try оборачивается в Success
вы имеете в виду, что это редундантно?
источник

PM

Paveλ M in Scala User Group
Denis G
это по-видимому не правильно, потому что мои тесты падают на
[info]     java.lang.AssertionError: assertion failed: expected GetResponse(MockKey(key,5),None), found Future(Success(GetResponse(MockKey(key,5),None)))
упячка какая-то. вы делаете, получается, что-то вроде Future[Try[Any]](...) shouldBe GetResponse(MockKey(key,5),None), так?
источник

DG

Denis G in Scala User Group
Paveλ M
упячка какая-то. вы делаете, получается, что-то вроде Future[Try[Any]](...) shouldBe GetResponse(MockKey(key,5),None), так?
упячка?
источник

PM

Paveλ M in Scala User Group
ага, странный текст ошибки
источник

DG

Denis G in Scala User Group
по-видимому я оборачиваю фьючерс во фьючерс
источник

PM

Paveλ M in Scala User Group
попробуйте так:
val myfut: Future[Try[Any]] = ...
myfut.map(r => r shouldBe Success(GetResponse...
источник

DG

Denis G in Scala User Group
Paveλ M
попробуйте так:
val myfut: Future[Try[Any]] = ...
myfut.map(r => r shouldBe Success(GetResponse...
shouldBe вроде только в тестах можно, нет?
я тут акку акторы использую, поэтому у меня свои тесты, с блэкчэками
источник

Oℕ

Oleg ℕizhnik in Scala User Group
У меня получилось что-то вроде
Future
   .traverse(peers)(_ ? _ValueForKey(key) collect { case x: PersistedDataStoreValue => x })
   .map { values =>
     val latest = values.groupBy(_.creationTimestamp).maxBy(_._1)._2

     val res = latest.headOption.filter(_ => latest.length < r)
     GetResponse(key, res)
   }

но мне не нравится, что хранится весь список values, для результата это не нужно, если он большой, можно переписать на reductLeft
источник

DG

Denis G in Scala User Group
client.send(peer, Get(key))
successor.expectMsg(FindSuccessor(key.id))
successor.reply(SuccessorFound(peerEntry))
client.expectMsg(GetResponse(key, None))
источник

DG

Denis G in Scala User Group
Oleg ℕizhnik
У меня получилось что-то вроде
Future
   .traverse(peers)(_ ? _ValueForKey(key) collect { case x: PersistedDataStoreValue => x })
   .map { values =>
     val latest = values.groupBy(_.creationTimestamp).maxBy(_._1)._2

     val res = latest.headOption.filter(_ => latest.length < r)
     GetResponse(key, res)
   }

но мне не нравится, что хранится весь список values, для результата это не нужно, если он большой, можно переписать на reductLeft
да, но в противном случае я получаю вот это →
[info]     java.lang.AssertionError: assertion failed: expected GetResponse(MockKey(key,5),None), found Failure(akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://DHTSuite/user/$d#-1795963380]] after [1000 ms]. Message of type [peer.application.StorageActor$_Get] was sent by [Actor[akka://DHTSuite/user/$d#-1795963380]]. A typical reason for `AskTimeoutException` is that the recipient actor didn't send a reply.)
источник