Size: a a a

Scala User Group

2020 January 17

M

Mikhail in Scala User Group
Ayrat Hudaygulov
Там надо чтобы для типов, в которых есть теги, выводились енкодеры аатомагически
И не используй инстансофы, таггеты для того чтобы такого не было. https://scastie.scala-lang.org/rudogma/rnT2xtNASVWaLA6Xp7AKgA/13
источник

AH

Ayrat Hudaygulov in Scala User Group
О, прекрасно. Спасибо!
источник

M

Mikhail in Scala User Group
@omgszer только не знаю зачем тебе контрамап) Он же тебе лишнюю обертку добавляет. Может ты хотел просто залифтить кодек
источник

AH

Ayrat Hudaygulov in Scala User Group
Mikhail
@omgszer только не знаю зачем тебе контрамап) Он же тебе лишнюю обертку добавляет. Может ты хотел просто залифтить кодек
Я пробовал, оно не взлетело. Через lifterF, который в комплекте супертагеда идёт

И да, я хотел залифтить сразу все енкодеры
источник

M

Mikhail in Scala User Group
Ayrat Hudaygulov
Я пробовал, оно не взлетело. Через lifterF, который в комплекте супертагеда идёт

И да, я хотел залифтить сразу все енкодеры
источник

AS

Aλeχander Semenov in Scala User Group
у меня немного другие таггед типы, но с похожим апи, если нужны хэлперы для инстансов (без implicit), то с supertagged что-то похожее тоже можно

  def taggedEncoder[T: Encoder, U]: Encoder[T @@ U] =
   Encoder[T].@@@[U]

 def taggedDecoder[T: Decoder, U]: Decoder[T @@ U] =
   Decoder.instance(_.as[T].@@@[U])

 def taggedTypeEncoder[T: Encoder](taggedType: TaggedType[T]): Encoder[taggedType.Type] =
   taggedEncoder[T, taggedType.Tag]

 def taggedTypeDecoder[T: Decoder](taggedType: TaggedType[T]): Decoder[taggedType.Type] =
   taggedDecoder[T, taggedType.Tag]

 def taggedCodec[T: Encoder : Decoder, U]: Codec[T @@ U] =
   Codec.from(taggedDecoder[T, U], taggedEncoder[T, U])

 def taggedTypeCodec[T: Encoder : Decoder](taggedType: TaggedType[T]): Codec[taggedType.Type] =
   Codec.from(taggedTypeDecoder(taggedType), taggedTypeEncoder(taggedType))
источник

AH

Ayrat Hudaygulov in Scala User Group
Но тогда у каждого типа надо ручками писать. Ручками, да получилось
источник

M

Mikhail in Scala User Group
и import types._ не нужен, в автоскоупе будет. Но если енкодеры в отдельный пакет пихать будешь, то конечно там доп импорт будет
источник

λ

λoλegΥch in Scala User Group
а чо строка заквоченая получилась?
источник

AH

Ayrat Hudaygulov in Scala User Group
λoλegΥch
а чо строка заквоченая получилась?
Тоже заметил, но я думаю он берёт строку и пытается ее заенкодить как строку, оттого ескейп получается. Уверен, это поправимо
источник

M

Mikhail in Scala User Group
Ayrat Hudaygulov
Но тогда у каждого типа надо ручками писать. Ручками, да получилось
Можно так, чтобы и не надо. Все тоже самое, только женерик https://scastie.scala-lang.org/rudogma/rnT2xtNASVWaLA6Xp7AKgA/16
источник

M

Mikhail in Scala User Group
Ayrat Hudaygulov
Тоже заметил, но я думаю он берёт строку и пытается ее заенкодить как строку, оттого ескейп получается. Уверен, это поправимо
Это потому, что ты рендеришь тип в жсон, а потом то, что отрендерено рендеришь как строку энивей
источник

λ

λoλegΥch in Scala User Group
а можно и не обьвлять тагед тип для каждого айди и юзать просто class Id[T](value:String)
источник

AH

Ayrat Hudaygulov in Scala User Group
Я писал просто lifterF[Encoder], он тоже возвращает Encoder и оно не работало.

В твоём снипете ещё .lift есть, вот что мне не хватило для победы. Супер
источник

AH

Ayrat Hudaygulov in Scala User Group
λoλegΥch
а можно и не обьвлять тагед тип для каждого айди и юзать просто class Id[T](value:String)
Но это не совсем opaque тип. Точнее вообще не
источник

M

Mikhail in Scala User Group
Ayrat Hudaygulov
Я писал просто lifterF[Encoder], он тоже возвращает Encoder и оно не работало.

В твоём снипете ещё .lift есть, вот что мне не хватило для победы. Супер
lifterF[Serializer] - возвращает хелпер. то, что в доках - работает из-за импорта ._ и импортится liftAnyF - который этого лифтера подхватывает. Но так лучше не делать, это бэд кейс
источник

λ

λoλegΥch in Scala User Group
Ayrat Hudaygulov
Но это не совсем opaque тип. Точнее вообще не
опацк не опак без разницы
источник

M

Mikhail in Scala User Group
λoλegΥch
опацк не опак без разницы
variable.value vs variable . Ну да, ну да)
источник

λ

λoλegΥch in Scala User Group
голый value нигде не нужен
источник

λ

λoλegΥch in Scala User Group
а где нужен точно так же анврапаешь как и с супертагед
источник