Size: a a a

Scala User Group

2021 July 21

SA

Sergey Alaev in Scala User Group
между моками и фейками? нуууу не знаю
источник

Oℕ

Oleg ℕizhnik in Scala User Group
злейер это и есть диай через конструктор
источник

S

Simon in Scala User Group
Так там как раз через конструктор. Но до zio-magic композиция zlayer выглядела как призыв сатаны
источник

S

Simon in Scala User Group
я просто моки всегда инициировал в начале тестов и не трогал больше. Получалось почти иммутабельно.
источник

Oℕ

Oleg ℕizhnik in Scala User Group
композиция там специфична, не всегда можно легко сказать выполнится ли инициализация чего-то дважды и выполнится ли вообще
технически семантику понять несложно, но нужно внимательно следить глазами
тут и прячется главный подвох, злейеры это де-факто стрелки, а ручная стрелочная композиция - детектор на нечеловека, соответственно для злейера сделали свою локальную волгу под названием зио мэжик
но предсказать магическую структуру композиции не вполне возможно, а возвращаясь на два абзаца выше это может привести к сложнопредсказуемому поведению
в итоге рецепт делать все инициализации очень простыми, и композить одним скоупом, но это мы раньше умели и до зио делатт
источник

S

Simon in Scala User Group
У zio-magic результат довольно легко предсказывается. Если все результаты инстанциировать, то будут инстанциированы и все переданные куски. Причем по 1 разу. Если что-то из переданного не используется, то падает компиляция.
Так что если в итоге собрать 1 ресурс App и инстанциировать, то будет инстанциировано всё по разу.
источник

λ

λoλcat in Scala User Group
Еще напомню классику
https://github.com/zio/zio/issues/4085
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Ну если один из кусков сам скомпозирован с помощью зио мэджик, как проконтролировать, что другой кусок не встречается во внутренней и внешней композиции?
источник

S

Simon in Scala User Group
Можно пример?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
это будет небыстро
источник

S

Simon in Scala User Group
псевдокодом
источник

S

Simon in Scala User Group
Я просто не понял описание.
источник

Oℕ

Oleg ℕizhnik in Scala User Group
val cat = compose(
    fur
    couch,
    sleep,
    purr
)

val life = compose(
     tv,
     kvas,
     cat,
     couch
)
источник

Oℕ

Oleg ℕizhnik in Scala User Group
в life используется cat и couch, в cat используется ещё раз couch
источник

Oℕ

Oleg ℕizhnik in Scala User Group
как убедиться, что куски приложения не будут ссылаться на разные инстансы couch с радным состоянием
источник

S

Simon in Scala User Group
Это то, о чем ссылка выше.
((couch ++ (couch >>> cat)) >>> life) ++ (couch >>> cat)
Тут couch инициализируется 1 раз
меджик вообще коспозицию делает самым тупым способом. Если от couch зависят все лееры, то
val life = compose(      tv,      kvas,      cat,      couch)

Может превратиться во что-то вроде этого:
val life = (
 (couch >>> tv) ++
 (couch >>> cat) ++
 couch ++
) >>> kvas

На самом деле сложнее заставить ZLayer инстанциировать 2 экземпляра
источник

S

Simon in Scala User Group
При этом по рекомендациям от авторов надо как раз так и писать:
(a >>> b1) ++ (a >>> b2) >>> c 

И оставить мемоизацию инстансов на совесть злееров
источник

Oℕ

Oleg ℕizhnik in Scala User Group
ну вот там вроде не очень сложно эту мемоизацию сломать
источник

Oℕ

Oleg ℕizhnik in Scala User Group
достаточно, чтобы там был
def couch(...)
источник

S

Simon in Scala User Group
А вот не надо делать лееры дефами =)
источник