pakoito
04/19/2019, 4:34 PMlouiscad
04/19/2019, 5:49 PMpakoito
04/19/2019, 7:24 PMlouiscad
04/19/2019, 7:49 PMinstanceof
nor is
check here. Reference equality and unchecked casts are used, and these are way cheaper than any complicated Option
type you can come up with and nesting it.pakoito
04/19/2019, 7:56 PMthere’s any big performance tradeoffs there at allI thought you meant compared to sealed classes, which depending on implementation may be a direct call into one of the branches instead of doing the ifcheck
sealed class Tristate<A> {
fun <B> fold(fu: () -> B, fn: () -> B, fa: (A) -> B)
object Uninitialized: Tristate<Nothing> {
override fun <B> fold(fu: () -> B, fn: () -> B, fa: (A) -> B) = fu()
}
object Nullish: Tristate<Nothing> {
override fun <B> fold(fu: () -> B, fn: () -> B, fa: (A) -> B) = fn()
}
data class Option<A>(val a: A): Tristate<A> {
override fun <B> fold(fu: () -> B, fn: () -> B, fa: (A) -> B) = fa(a)
}
}
Object
like in a dynamic languagelouiscad
04/19/2019, 8:50 PMlazy
FYI.pakoito
04/19/2019, 8:56 PMComparing a reference check to JavaScript is a bit excessive IMO.Not reference check, going down to
Any?
to store a value on a variable so the variable can contain an arbitrary value of an unrelated type. So, dynamic typing of variables 😄louiscad
04/19/2019, 9:02 PMVsevolod Tolstopyatov [JB]
04/20/2019, 2:19 PMVirtual dispatch is not an issue here. But allocations ofvirtual dispatchinstaceof
Option
on each value and lambdas for fold
are.
One could think of Result
-like inline
class, but then boxing kicks in 😞Dico
04/21/2019, 1:05 AM