Size: a a a

💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢

2020 October 05

ᛒᚨᚱᛏᛟᛋᛋᛟ... in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Andrey Sugak
Пойду сегодня 127.5 жать.
источник

AS

Andrey Sugak in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
источник

R

RattenK 🍄🐀🌹 in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Это я в зеркале
источник

R

RattenK 🍄🐀🌹 in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Andrey Sugak
Пойду сегодня 127.5 жать.
Попробую норм 57.5 пожать(
источник

Oℕ

Oleg ℕizhnik in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Andrey Sugak
Что за бутоны?
https://github.com/manatki/manatki/blob/master/src/main/scala/manatki/free/Bud.scala#L5:L5

Идея примерно такая как у дегоза c Layer
Только вместо гетерогенной мапки в ридере - это ковариантный фикспойнт
Bud[Petal[F]] = F[Bud[Petal[F]]
За счёт двойной контравариантности мы получаем, что Bud ковариантен по F

Ну и типа пишешь
sealed trait UserRepoT[ +E, +A]

case class ReadUser(userId: UserId) extends UserRepoT[UserNotFound, User]
case class WriteUser(user: User) extends UserRepoT[UserConflict, Unit]

type UserRepo = Petal.Simple[UserRepoT]


sealed trait KafkaPullT[+F[+_, +_], +E, +A]
case class AddConsumer[+F[+_, +_]](topic: Topic, handler: KafkaMessage => F[Nothing, Unit]) extends KafkaPullT[F, Nothing, Unit]

type  KafkaPull = Petal[KafkaPullT]

и потом типа оборачиваешь
def writeUser(user: User): Bud[UserRepo, UserConflict, Unit] = Bud(WriteUser(user))

def addConsumer[P <: Petal[Nothing]](topic: Topic, handler: KafkaMessage => Bud[P, Nothing, Unit]): Bud[P with KafkaPull] = Bud(AddConsumer(topic, handler)

потом  хуяк, юзаешь
for {
  k <- writeUser(oleg)
  _ <- addConsumer(sugakTopic, eatHinkalee)
} yield

и тип выводится автоматически как Bud[UserRepo with KafkaPull with Monadic]
источник

w

welcometotheclubbudd... in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Oleg ℕizhnik
https://github.com/manatki/manatki/blob/master/src/main/scala/manatki/free/Bud.scala#L5:L5

Идея примерно такая как у дегоза c Layer
Только вместо гетерогенной мапки в ридере - это ковариантный фикспойнт
Bud[Petal[F]] = F[Bud[Petal[F]]
За счёт двойной контравариантности мы получаем, что Bud ковариантен по F

Ну и типа пишешь
sealed trait UserRepoT[ +E, +A]

case class ReadUser(userId: UserId) extends UserRepoT[UserNotFound, User]
case class WriteUser(user: User) extends UserRepoT[UserConflict, Unit]

type UserRepo = Petal.Simple[UserRepoT]


sealed trait KafkaPullT[+F[+_, +_], +E, +A]
case class AddConsumer[+F[+_, +_]](topic: Topic, handler: KafkaMessage => F[Nothing, Unit]) extends KafkaPullT[F, Nothing, Unit]

type  KafkaPull = Petal[KafkaPullT]

и потом типа оборачиваешь
def writeUser(user: User): Bud[UserRepo, UserConflict, Unit] = Bud(WriteUser(user))

def addConsumer[P <: Petal[Nothing]](topic: Topic, handler: KafkaMessage => Bud[P, Nothing, Unit]): Bud[P with KafkaPull] = Bud(AddConsumer(topic, handler)

потом  хуяк, юзаешь
for {
  k <- writeUser(oleg)
  _ <- addConsumer(sugakTopic, eatHinkalee)
} yield

и тип выводится автоматически как Bud[UserRepo with KafkaPull with Monadic]
Не читаемо в текстовом виде.
источник

AS

Andrey Sugak in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Oleg ℕizhnik
https://github.com/manatki/manatki/blob/master/src/main/scala/manatki/free/Bud.scala#L5:L5

Идея примерно такая как у дегоза c Layer
Только вместо гетерогенной мапки в ридере - это ковариантный фикспойнт
Bud[Petal[F]] = F[Bud[Petal[F]]
За счёт двойной контравариантности мы получаем, что Bud ковариантен по F

Ну и типа пишешь
sealed trait UserRepoT[ +E, +A]

case class ReadUser(userId: UserId) extends UserRepoT[UserNotFound, User]
case class WriteUser(user: User) extends UserRepoT[UserConflict, Unit]

type UserRepo = Petal.Simple[UserRepoT]


sealed trait KafkaPullT[+F[+_, +_], +E, +A]
case class AddConsumer[+F[+_, +_]](topic: Topic, handler: KafkaMessage => F[Nothing, Unit]) extends KafkaPullT[F, Nothing, Unit]

type  KafkaPull = Petal[KafkaPullT]

и потом типа оборачиваешь
def writeUser(user: User): Bud[UserRepo, UserConflict, Unit] = Bud(WriteUser(user))

def addConsumer[P <: Petal[Nothing]](topic: Topic, handler: KafkaMessage => Bud[P, Nothing, Unit]): Bud[P with KafkaPull] = Bud(AddConsumer(topic, handler)

потом  хуяк, юзаешь
for {
  k <- writeUser(oleg)
  _ <- addConsumer(sugakTopic, eatHinkalee)
} yield

и тип выводится автоматически как Bud[UserRepo with KafkaPull with Monadic]
Понял.
источник

AS

Andrey Sugak in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Спасибо.
источник

Oℕ

Oleg ℕizhnik in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
проблема только в том,что не читаемо в текстовом виде
источник

AS

Andrey Sugak in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Oleg ℕizhnik
проблема только в том,что не читаемо в текстовом виде
источник

AS

Alex Sh in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
welcometotheclubbuddy
Не читаемо в текстовом виде.
Для этго нужен специальный отдел головного мозга отрастить.
источник

AS

Alex Sh in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
И возможно - спинного тоже
источник

D

Dima in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
Oleg ℕizhnik
https://github.com/manatki/manatki/blob/master/src/main/scala/manatki/free/Bud.scala#L5:L5

Идея примерно такая как у дегоза c Layer
Только вместо гетерогенной мапки в ридере - это ковариантный фикспойнт
Bud[Petal[F]] = F[Bud[Petal[F]]
За счёт двойной контравариантности мы получаем, что Bud ковариантен по F

Ну и типа пишешь
sealed trait UserRepoT[ +E, +A]

case class ReadUser(userId: UserId) extends UserRepoT[UserNotFound, User]
case class WriteUser(user: User) extends UserRepoT[UserConflict, Unit]

type UserRepo = Petal.Simple[UserRepoT]


sealed trait KafkaPullT[+F[+_, +_], +E, +A]
case class AddConsumer[+F[+_, +_]](topic: Topic, handler: KafkaMessage => F[Nothing, Unit]) extends KafkaPullT[F, Nothing, Unit]

type  KafkaPull = Petal[KafkaPullT]

и потом типа оборачиваешь
def writeUser(user: User): Bud[UserRepo, UserConflict, Unit] = Bud(WriteUser(user))

def addConsumer[P <: Petal[Nothing]](topic: Topic, handler: KafkaMessage => Bud[P, Nothing, Unit]): Bud[P with KafkaPull] = Bud(AddConsumer(topic, handler)

потом  хуяк, юзаешь
for {
  k <- writeUser(oleg)
  _ <- addConsumer(sugakTopic, eatHinkalee)
} yield

и тип выводится автоматически как Bud[UserRepo with KafkaPull with Monadic]
источник

Oℕ

Oleg ℕizhnik in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
короче плюс понятно в том, что нет промежуточных оборачиваний - только юзерский кейсклассы
источник

Oℕ

Oleg ℕizhnik in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
и в том, что эффекты композятся через with, что ,к счастью в скалке работает нормально
источник

Oℕ

Oleg ℕizhnik in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
понятно, что
Bud[Foo with Bar with Baz] - это примерно как
Fix[FooT | BarT | BazT]
источник

Oℕ

Oleg ℕizhnik in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
только я пока не придумал, как нормально сделать паттерн-матчинг такой коллективный
источник

Oℕ

Oleg ℕizhnik in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
зато хендлеры можно делать рекурсивно зависимыми
источник

Oℕ

Oleg ℕizhnik in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
но вот как кучу хендлеров в один сгрести, пока не придумал
источник

V

Vasiliy in 💯 ПОКА ОДЕРСКИ НЕ ВИДИТ 💢 69% 💢
источник