BenoƮt
08/31/2022, 2:11 PMJavier
08/31/2022, 2:16 PMJavier
08/31/2022, 2:17 PMJavier
08/31/2022, 2:17 PMsimon.vergauwen
08/31/2022, 2:48 PMList.serializer
Javier
08/31/2022, 2:49 PMBenoƮt
08/31/2022, 2:49 PMthan_
08/31/2022, 3:07 PMinterface IsoSerializer<ENTITY, SURROGATE> : KSerializer<ENTITY> {
val surrogateSerializer: KSerializer<SURROGATE>
val iso: Iso<ENTITY, SURROGATE>
override fun deserialize(decoder: Decoder): ENTITY =
decoder.decodeSerializableValue(surrogateSerializer).let(iso::reverseGet)
override val descriptor: SerialDescriptor
get() = surrogateSerializer.descriptor
override fun serialize(encoder: Encoder, value: ENTITY) {
encoder.encodeSerializableValue(surrogateSerializer, iso.get(value))
}
companion object {
inline operator fun <ENTITY, reified SURROGATE> invoke(
iso: Iso<ENTITY, SURROGATE>,
surrogateSerializer: KSerializer<SURROGATE>,
) = object : IsoSerializer<ENTITY, SURROGATE> {
override val surrogateSerializer = surrogateSerializer
override val iso = iso
}
}
}
here you can easily serialize anything by just providing a serializable surrogate type and an iso between your type and the surrogate
class NelSerializer<T>(elementSerializer: KSerializer<T>) :
IsoSerializer<NonEmptyList<T>, List<T>> by IsoSerializer(Nel.listIso(),
ListSerializer(elementSerializer))
fun <T> NonEmptyList.Companion.listIso(): Iso<NonEmptyList<T>, List<T>> = Iso(
get = ::identity,
reverseGet = { if (it is Nel<T>) it else Nel.fromListUnsafe(it) }
)
BenoƮt
09/01/2022, 5:47 PM