Size: a a a

Scala User Group

2020 January 30

VS

Vladimir Sam in Scala User Group
Ну кажется, захоти я шарить базу в нескольких тестах, мб пригодилось бы
источник

VS

Vladimir Sam in Scala User Group
Но в тестах то и так нагадить можно, что-то верхнеуровневое потом за мной почистит
источник

AS

Alex Sh in Scala User Group
Vladimir Sam
Или наоборот инкапсулировать ресурс так, чтобы наружу из какого-то сервиса не торчал и нигде больше не пользовался
Нарушается принцип Dependency Injetion
Зависимости не должны создаются там где используются.
Но вообще я изначально так и хотел сделать 🙂
источник

VS

Vladimir Sam in Scala User Group
Alex Sh
Нарушается принцип Dependency Injetion
Зависимости не должны создаются там где используются.
Но вообще я изначально так и хотел сделать 🙂
Можно оставить di только никуда больше созданный не передавать
источник

SA

Sergey Alaev in Scala User Group
Alex Sh
Продолжая рубрику "Вопросы из зала".
Есть ли у нас в Скале(котах/зио/итп) что-то типа LazySingltonResource[F]?

Проблема/задача в следующем:
Есть приложение, которому нужно работать с другими сервисами по http.
Сча для этого создается http4s.Client[F], который распихивается по различным местам(3 места).
Однако настройки приложения позволяют работать и без взаимодействия с другими сервисами.
Например, заменяя отправку запросов логгированием в файл.

И вот хочется такую штуку
LazySingltonResource.createIfNotExists(): Resource[F, Client[F]]

чтобы она создавала ресурс при первом вызове, подсчитывала кол-во использований и закрывала ресурс, как только все секции
.use { resource => ... } завершены.
давно играюсь с этой идей. В таком варианте пишется легко, но мне хочется большего.
источник

SA

Sergey Alaev in Scala User Group
открываешь реализацию Resource и пишешь по аналогии
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Sergey Alaev
давно играюсь с этой идей. В таком варианте пишется легко, но мне хочется большего.
А где можно посмотреть вашу имплементацию?
источник

VS

Vladimir Sam in Scala User Group
Но вообще если святая корова хочет кровавых жертв, можно пожертвовать коровой ( и нарушить принцип)
источник

AS

Alex Sh in Scala User Group
Vladimir Sam
Но вообще если святая корова хочет кровавых жертв, можно пожертвовать коровой ( и нарушить принцип)
Ну сча я сделал eager creation для Client[F] и типа он всегда висит в памяти, даже если не нужен.
Потому что в нашем конкретном случае он нужен в 99% запусков программы.
Тут вообщем не про то, как это сделать в принципе, а как это сделать "по правильному" 🙂
источник

SA

Sergey Alaev in Scala User Group
Oleg ℕizhnik
А где можно посмотреть вашу имплементацию?
вам поглумиться или помочь?) задача сложная и я её до конца не решил.

Вот небольшой кусочек:
 private def memoize[F[_] : Async, A](r: Resource[F, A]): F[Resource[F, A]] = {
   Async.memoize(r.allocated.flatMap { case (a, close) =>
     Async.memoize(close).map(a -> _)
   }).map(f => Resource.apply(f))
 }
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Sergey Alaev
вам поглумиться или помочь?) задача сложная и я её до конца не решил.

Вот небольшой кусочек:
 private def memoize[F[_] : Async, A](r: Resource[F, A]): F[Resource[F, A]] = {
   Async.memoize(r.allocated.flatMap { case (a, close) =>
     Async.memoize(close).map(a -> _)
   }).map(f => Resource.apply(f))
 }
Посмотреть исходник, перед тем, как сделаю в тофу
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Sergey Alaev
вам поглумиться или помочь?) задача сложная и я её до конца не решил.

Вот небольшой кусочек:
 private def memoize[F[_] : Async, A](r: Resource[F, A]): F[Resource[F, A]] = {
   Async.memoize(r.allocated.flatMap { case (a, close) =>
     Async.memoize(close).map(a -> _)
   }).map(f => Resource.apply(f))
 }
Тут нет референс каунтинга
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Я написал с референс каунтингом за 10 минут, но нет нормальной синхронизации деаллокаций
источник

SA

Sergey Alaev in Scala User Group
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Ничё не понял
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Где там реюз ресурса
источник

SA

Sergey Alaev in Scala User Group
Context
источник

SA

Sergey Alaev in Scala User Group
т.е. смысл в том, что есть монада, в которую мы лифтим ресурс. потом эту монаду можно вычислить, получив мемоизированный ресурс и мутабельный кеш, содержащий мемоизированные данные
источник

SA

Sergey Alaev in Scala User Group
далее, можно вычислять другие монады из той же цепочки, доставя из из кеша, если они там есть
источник

SA

Sergey Alaev in Scala User Group
плюс - при вычислении можно указывать моки, т.е. вместо вычисления отдельных монад подставлять какие-то другие значения
источник