Size: a a a

Scala User Group

2020 June 09

TG

Timofey Gusev in Scala User Group
источник

λ

λoλcat in Scala User Group
Timofey Gusev
Добрый день
Подскажите, пожалуйста, как правильно выйти из следующей ситуации:

Имеется функция def initRoutes[Env[_]: HasLocal[*[_], ApplicationContext]]: HttpRoutes[E] = ??? которая позволяет проинициализировать роуты. Для нее необходим контекст HasLocal.

Имеется функция def runHttp4sServer[F[_]: ConcurrentEffect](routes: HttpRoutes[F]): F[Unit] = ???  которая ранит хттп сервер с передаваемыми роутами.

Проблема заключается в том, что использовать одинаковый контекст для этих 2х функций нельзя, т.к. для подъема сервера у эффекта требуется ConcurrentEffect, а Env из тофу не поддерживает его.

Вопрос заключается в том, а как быть в такой ситуации?
Иметь разные эффекты - для инициализации, и для работы с контекстом
источник

TG

Timofey Gusev in Scala User Group
λoλcat
Иметь разные эффекты - для инициализации, и для работы с контекстом
Я вместо F подставляю Task, для Env - type AppContext[A] = Env[ApplicationContext, A].
Вопрос в том, а как мне в конечном итоге роуты, которые зависят от AppContext совместить с хттп сервером, который зависит от Task
источник

λ

λoλcat in Scala User Group
Зависит. Контекст формируется как и когда? Он действительно внешний по отношению к запуску сервера? Или он приходит в виде заголовков с хттп запросами?
источник

TG

Timofey Gusev in Scala User Group
λoλcat
Зависит. Контекст формируется как и когда? Он действительно внешний по отношению к запуску сервера? Или он приходит в виде заголовков с хттп запросами?
контекст формируется, когда приходит запрос
источник

λ

λoλdog in Scala User Group
runContext сделать над или что?
источник

λ

λoλcat in Scala User Group
Timofey Gusev
контекст формируется, когда приходит запрос
Ну тогда, сами руты работают с контекстным эффектом. А сервер запускается с бесконтекстным. И в рутах ты парсишь хэдер, формируешь контекст и делаешь ранконтекст для рута
источник

TG

Timofey Gusev in Scala User Group
λoλdog
runContext сделать над или что?
ага
источник

λ

λoλdog in Scala User Group
Ну кот написал
источник

TG

Timofey Gusev in Scala User Group
да, понял, спасибо большое
источник

S

SergejB in Scala User Group
Oleg ℕizhnik
менее радикально всё же будет поднять свой нексус
Менее радикальное решение не подходит. Наш salesforce team использует Heroku и успешно. Билд на хероке показал проблемы именно в коде, а не со средой, которая вообще говоря не совсем оптимизирована для разработчика
источник

AT

Aλeksei Tereχin in Scala User Group
ооокей, кто то перевед пост с редддита. дальше что?
источник

ИК

Иван Калининский... in Scala User Group
Сорян, удаляю
источник

TG

Timofey Gusev in Scala User Group
λoλcat
Ну тогда, сами руты работают с контекстным эффектом. А сервер запускается с бесконтекстным. И в рутах ты парсишь хэдер, формируешь контекст и делаешь ранконтекст для рута
Проблема с самих роутов ушла - 29 строка

Теперь появляется проблема, что сервис, чей функционал должен дергаться внутри runContext в роутах, зависит от другого сервиса, чей эффект не может быть контекстным из-за аналогичной проблемы с ConcurrentEffect.

Это проблема композиции сервисов или есть какое-либо решение данной проблемы?

https://scastie.scala-lang.org/1qLcNVfOTMWqoTXh7trcUQ
источник

λ

λoλcat in Scala User Group
Timofey Gusev
Проблема с самих роутов ушла - 29 строка

Теперь появляется проблема, что сервис, чей функционал должен дергаться внутри runContext в роутах, зависит от другого сервиса, чей эффект не может быть контекстным из-за аналогичной проблемы с ConcurrentEffect.

Это проблема композиции сервисов или есть какое-либо решение данной проблемы?

https://scastie.scala-lang.org/1qLcNVfOTMWqoTXh7trcUQ
Я, честно скажу, в вашу проблему не погружался. Может быть ПР в тофу #304 вам как-то поможет интегрироваться с плохим АПИ, оставаясь в контекстном эффекте?
источник

λ

λoλcat in Scala User Group
Timofey Gusev
Проблема с самих роутов ушла - 29 строка

Теперь появляется проблема, что сервис, чей функционал должен дергаться внутри runContext в роутах, зависит от другого сервиса, чей эффект не может быть контекстным из-за аналогичной проблемы с ConcurrentEffect.

Это проблема композиции сервисов или есть какое-либо решение данной проблемы?

https://scastie.scala-lang.org/1qLcNVfOTMWqoTXh7trcUQ
Попробуй создавать AnotherService в неконтекстном эффекте, а потом лифтить его в контекстный
источник

λ

λoλcat in Scala User Group
Кажется, это и будет решением данной конкретной проблемы
источник

TG

Timofey Gusev in Scala User Group
λoλcat
Попробуй создавать AnotherService в неконтекстном эффекте, а потом лифтить его в контекстный
F[Service[F]].liftTo[Env] даст Env[Service[F]].
То есть внутренний эффект не изменится
источник

λ

λoλcat in Scala User Group
Timofey Gusev
F[Service[F]].liftTo[Env] даст Env[Service[F]].
То есть внутренний эффект не изменится
Мне непонятна эта фраза
источник

λ

λoλcat in Scala User Group
Что мешает вывести для AnotherService functorK и залифтить инстанс в Env[_]?
источник