kluck
05/20/2019, 7:59 AMOption<T>
to a T?
. Basically, serializing works, but deserializing doesn't 😢kluck
05/20/2019, 8:00 AMsimon.vergauwen
05/20/2019, 8:04 AMOption
. None.toNullable()
and Option.fromNullable(null)
.kluck
05/20/2019, 8:44 AM@Serializer(forClass = Option::class)
class OptionSerializer<T : Any>(private val dataSerializer: KSerializer<T>) : KSerializer<Option<T>> {
override val descriptor: SerialDescriptor = StringDescriptor.withName("OptionDescriptor")
override fun deserialize(input: Decoder): Option<T> {
return Option.fromNullable(input.decodeNullable(dataSerializer))
}
override fun serialize(output: Encoder, obj: Option<T>) {
when (obj) {
is None -> output.encodeNull()
is Some -> output.encodeNullable(dataSerializer, obj.t)
}
}
}
Then, I need to annotate my class @Serializable data class Stuff(@Serializable(with = OptionSerializer::class) val foo: Option<String>)
The downside is the verbosity, as the Option class is not annotated with @Serializable
, I have to add this chunk @Serializable(with = OptionSerializer::class)
to every optional property.
Here's a simple test and it's output:kluck
05/20/2019, 8:45 AM@Test
fun test() {
val someStuff = Stuff(Some("haha"))
val noneStuff = Stuff(None)
val serializer = Stuff.serializer()
val someStuffString = JSON.stringify(serializer, someStuff)
val noneStuffString = JSON.stringify(serializer, noneStuff)
println(someStuffString)
println(noneStuffString)
println(JSON.parse(serializer, someStuffString))
println(JSON.parse(serializer, noneStuffString))
}
{"foo":"haha"}
{"foo":null}
Stuff(foo=Some(haha))
Stuff(foo=None)
kluck
05/20/2019, 8:47 AMStore(uuid=uuid, name=name, ssid=None, connectivityTypes=[], location=Some(StoreLocation(address=Some(address), city=None, zipCode=None, latitude=None, longitude=None)))
{"uuid":"uuid","name":"name","ssid":null,"connectivityTypes":[],"location":{"address":"address","city":null,"zipCode":null,"latitude":null,"longitude":null}}
pakoito
05/20/2019, 8:51 AMStuart Moodie
05/20/2019, 11:34 AMpakoito
05/20/2019, 11:35 AMarrow-core-extensions
, see what's there?pakoito
05/20/2019, 11:35 AMStuart Moodie
05/20/2019, 11:40 AMStuart Moodie
05/20/2019, 11:41 AMStuart Moodie
05/20/2019, 11:43 AMpakoito
05/20/2019, 2:53 PMpakoito
05/20/2019, 2:53 PMarrow.instances.option.monad.monad
may have moved to arrow.core.extensions.option.monad.monadpakoito
05/20/2019, 2:54 PMpakoito
05/20/2019, 2:54 PMStuart Moodie
05/20/2019, 2:57 PMRobert Menke
05/20/2019, 3:28 PMOption
instances. Let’s say I have
val foo = Option("hello")
val bar = Option("world")
fun concat(first: String, second: String): String {
return "$first $second"
}
I want to call concat
with foo
and bar
given that each Option is Some(String)
. What’s the best way to achieve this?Bob Glamm
05/20/2019, 3:35 PMval baz = Option.applicative().map("foo".some(), "bar".some(), {(a, b) -> concat(a, b)})
Bob Glamm
05/20/2019, 3:36 PM.fix()
depending on use case/versionBob Glamm
05/20/2019, 3:37 PMBob Glamm
05/20/2019, 3:41 PM::concat.tupled()
pakoito
05/20/2019, 3:44 PMpakoito
05/20/2019, 3:44 PM{ a, b -> concat(a, b)}
Bob Glamm
05/20/2019, 3:44 PM::concat
is the wrong typeBob Glamm
05/20/2019, 3:46 PMRobert Menke
05/20/2019, 3:51 PMfun runMe(): Kind<ForOption, String> {
return Option
.applicative()
.map(foo, bar) { (a, b) -> concat(a, b) }
}
Robert Menke
05/20/2019, 3:51 PMconcat(a, b)
what do I need to do?pakoito
05/20/2019, 3:51 PM.fix()