Fábio Carneiro
03/17/2021, 9:15 PMNir
03/17/2021, 9:18 PMNir
03/17/2021, 9:18 PMNir
03/17/2021, 9:20 PMFábio Carneiro
03/17/2021, 9:20 PMNir
03/17/2021, 9:20 PMFábio Carneiro
03/17/2021, 9:21 PMFábio Carneiro
03/17/2021, 9:21 PMmkrussel
03/17/2021, 9:23 PMNir
03/17/2021, 9:23 PMNir
03/17/2021, 9:24 PMmkrussel
03/17/2021, 9:24 PMNir
03/17/2021, 9:24 PMNir
03/17/2021, 9:26 PMNir
03/17/2021, 9:27 PMmkrussel
03/17/2021, 9:27 PMephemient
03/17/2021, 9:34 PMFábio Carneiro
03/17/2021, 9:37 PMFábio Carneiro
03/17/2021, 9:38 PMsealed T { data class AvailableT() data class UnavailableT() }
Fábio Carneiro
03/17/2021, 9:40 PMFábio Carneiro
03/17/2021, 9:40 PMephemient
03/17/2021, 9:42 PMsealed class P {
abstract val x: Int
class C1(override val x: Int) : P()
class C2(override val x: Int) : P()
override fun hashCode() = x
override fun equals(other: Any?) = x == (other as? P)?.x
}
setOf(P.C1(1), P.C2(2)) + P.C2(1))
ephemient
03/17/2021, 9:43 PMsealed class P {
abstract val x: Int
class C1(override val x: Int) : P()
class C2(override val x: Int) : P()
}
sortedSetOf(compareBy(P::x), P.C1(1), P.C2(2)) + P.C2(1)
ephemient
03/17/2021, 9:43 PMephemient
03/17/2021, 9:44 PMephemient
03/17/2021, 9:45 PMFábio Carneiro
03/17/2021, 9:45 PMFábio Carneiro
03/17/2021, 9:47 PMFábio Carneiro
03/17/2021, 9:47 PMephemient
03/17/2021, 9:48 PMFábio Carneiro
03/17/2021, 9:48 PMephemient
03/17/2021, 9:49 PMcompareBy(P::x)
is a Comparator<P>
there, yesFábio Carneiro
03/17/2021, 9:49 PMFábio Carneiro
03/17/2021, 9:50 PMFábio Carneiro
03/17/2021, 9:50 PMephemient
03/17/2021, 9:50 PMFábio Carneiro
03/17/2021, 9:50 PMephemient
03/17/2021, 9:50 PMFábio Carneiro
03/17/2021, 9:50 PMFábio Carneiro
03/17/2021, 9:51 PMFábio Carneiro
03/17/2021, 9:53 PMsealed class P(open val x: Int){
data class C1( override val x:Int) : P(x)
...
}
Fábio Carneiro
03/17/2021, 9:54 PMephemient
03/17/2021, 10:05 PMephemient
03/17/2021, 10:08 PMclass C0 : P(0) {
private val rng = Random()
override val x: Int
get() = rng.nextInt()
then the field and the property no longer have any correlation to each other)ephemient
03/17/2021, 10:09 PMclass CMut(override var x: Int) : P(x)
ephemient
03/17/2021, 10:10 PMabstract val P.x
with no backing fieldephemient
03/17/2021, 10:10 PMx
must be defined for all subtypesephemient
03/17/2021, 10:10 PMFábio Carneiro
03/17/2021, 10:10 PMFábio Carneiro
03/17/2021, 10:12 PMFábio Carneiro
03/17/2021, 10:12 PMFábio Carneiro
03/17/2021, 10:12 PMFábio Carneiro
03/17/2021, 10:14 PMFábio Carneiro
03/17/2021, 10:14 PMNir
03/17/2021, 10:17 PMNir
03/17/2021, 10:17 PMNir
03/17/2021, 10:18 PMFábio Carneiro
03/17/2021, 10:18 PMFábio Carneiro
03/17/2021, 10:19 PMFábio Carneiro
03/17/2021, 10:19 PMNir
03/17/2021, 10:19 PMclass foo(val s: S, val p: P)
Nir
03/17/2021, 10:19 PMFábio Carneiro
03/17/2021, 10:19 PMNir
03/17/2021, 10:19 PMNir
03/17/2021, 10:20 PMFábio Carneiro
03/17/2021, 10:21 PMNir
03/17/2021, 10:21 PMFábio Carneiro
03/17/2021, 10:21 PMNir
03/17/2021, 10:22 PMfoo
as above, you can either have Map<S, P>
, and now each entry implicitly forms a foo, or you can have Map<S, foo>
, just a matter of convenienceNir
03/17/2021, 10:22 PMNir
03/17/2021, 10:22 PMFábio Carneiro
03/17/2021, 10:23 PMFábio Carneiro
03/17/2021, 10:23 PMNir
03/17/2021, 10:23 PMNir
03/17/2021, 10:23 PMFábio Carneiro
03/17/2021, 10:23 PMNir
03/17/2021, 10:23 PMx
and C2 to have an integer field called y
, but you want to try x == y as equality?Fábio Carneiro
03/17/2021, 10:23 PMFábio Carneiro
03/17/2021, 10:24 PMNir
03/17/2021, 10:24 PMNir
03/17/2021, 10:24 PMNir
03/17/2021, 10:25 PMFábio Carneiro
03/17/2021, 10:25 PMFábio Carneiro
03/17/2021, 10:26 PMNir
03/17/2021, 10:26 PMopen class foo(val s: S)
Fábio Carneiro
03/17/2021, 10:26 PMNir
03/17/2021, 10:26 PMNir
03/17/2021, 10:26 PMS
stateNir
03/17/2021, 10:27 PMS
Nir
03/17/2021, 10:27 PMNir
03/17/2021, 10:27 PMNir
03/17/2021, 10:28 PMMap<S, foo>
Nir
03/17/2021, 10:28 PMfoo
, or anything elseNir
03/17/2021, 10:28 PMsealed class foo(val s: S)
I guessFábio Carneiro
03/17/2021, 10:29 PMopen class foo(val state: S, val identifier: I)
?ephemient
03/17/2021, 10:29 PMsealed class State {
object Available : State()
object Unavailable : State()
}
data class Entity<out S : State, out Key>(state: State, key: Key)
typealias AvailableT = Entity<State.Available, Int>
typealias UnavailableT = Entity<State.Unavailable, Int>
sortedSetOf(compareBy(Entity<State, Int>::key))
Nir
03/17/2021, 10:29 PMFábio Carneiro
03/17/2021, 10:29 PMNir
03/17/2021, 10:30 PMsealed class State(val s: S) {
class Available(s: S) : State(s)
class Unavailable(s: S) : State(s)
}
Nir
03/17/2021, 10:30 PMephemient
03/17/2021, 10:30 PMFábio Carneiro
03/17/2021, 10:30 PMFábio Carneiro
03/17/2021, 10:31 PMNir
03/17/2021, 10:31 PMNir
03/17/2021, 10:31 PMNir
03/17/2021, 10:31 PMNir
03/17/2021, 10:31 PMNir
03/17/2021, 10:31 PMFábio Carneiro
03/17/2021, 10:31 PMFábio Carneiro
03/17/2021, 10:32 PMFábio Carneiro
03/17/2021, 10:32 PMFábio Carneiro
03/17/2021, 10:32 PMNir
03/17/2021, 10:32 PMa: Available
ephemient
03/17/2021, 10:32 PMFábio Carneiro
03/17/2021, 10:33 PMNir
03/17/2021, 10:33 PMNir
03/17/2021, 10:34 PMFábio Carneiro
03/17/2021, 10:36 PMmapOf<Int, P>(
1 to C1(1),
2 to C1(1)
)
Fábio Carneiro
03/17/2021, 10:36 PMNir
03/17/2021, 10:36 PMNir
03/17/2021, 10:37 PMFábio Carneiro
03/17/2021, 10:37 PMFábio Carneiro
03/17/2021, 10:37 PMNir
03/17/2021, 10:37 PMSet<State>
APINir
03/17/2021, 10:38 PMNir
03/17/2021, 10:38 PMFábio Carneiro
03/17/2021, 10:40 PMNir
03/17/2021, 10:40 PMFábio Carneiro
03/17/2021, 10:40 PMNir
03/17/2021, 10:40 PMFábio Carneiro
03/17/2021, 10:41 PMFábio Carneiro
03/17/2021, 10:41 PMFábio Carneiro
03/17/2021, 10:41 PMFábio Carneiro
03/17/2021, 10:42 PMFábio Carneiro
03/17/2021, 10:42 PMFábio Carneiro
03/17/2021, 10:44 PMFábio Carneiro
03/17/2021, 10:45 PMNir
03/17/2021, 10:46 PMsealed class P(val s: S) {
class Available(s: S) : P(s)
class Unavailable(s: S) : P(s)
}
class foo private constructor(val s: S, val p: P)
fun makeAvailableFoo(s: S): foo ...
fun makeUnavailableFoo(s: S): foo ...
Nir
03/17/2021, 10:46 PMNir
03/17/2021, 10:47 PMfoo
to ignore p
, that might be ok?Fábio Carneiro
03/17/2021, 10:47 PMFábio Carneiro
03/17/2021, 10:48 PMNir
03/17/2021, 10:49 PMFábio Carneiro
03/17/2021, 10:49 PMFábio Carneiro
03/17/2021, 10:49 PMNir
03/17/2021, 10:49 PMNir
03/17/2021, 10:50 PMwhen (x = foo.p) {
is Available -> some_func(x)
Nir
03/17/2021, 10:50 PMFábio Carneiro
03/17/2021, 10:50 PMFábio Carneiro
03/17/2021, 10:50 PMNir
03/17/2021, 10:50 PMNir
03/17/2021, 10:50 PMNir
03/17/2021, 10:51 PMFábio Carneiro
03/17/2021, 10:51 PMfun(foo: AvailableFoo)
I dont care about UnavailableFooFábio Carneiro
03/17/2021, 10:51 PMNir
03/17/2021, 10:51 PMNir
03/17/2021, 10:51 PM(foo as AvailableFoo)?.someFunc()
Fábio Carneiro
03/17/2021, 10:52 PMFábio Carneiro
03/17/2021, 10:52 PMNir
03/17/2021, 10:52 PMNir
03/17/2021, 10:52 PMFábio Carneiro
03/17/2021, 10:52 PMNir
03/17/2021, 10:52 PMNir
03/17/2021, 10:52 PMNir
03/17/2021, 10:53 PMFábio Carneiro
03/17/2021, 10:53 PMNir
03/17/2021, 10:53 PMNir
03/17/2021, 10:53 PMFábio Carneiro
03/17/2021, 10:53 PMFábio Carneiro
03/17/2021, 10:53 PMFábio Carneiro
03/17/2021, 10:53 PMNir
03/17/2021, 10:54 PMNir
03/17/2021, 10:54 PMNir
03/17/2021, 10:55 PMFábio Carneiro
03/17/2021, 10:55 PMsealed class P {
abstract val x: Int
class C1(override val x: Int) : P()
class C2(override val x: Int) : P()
override fun hashCode() = x
override fun equals(other: Any?) = x == (other as? P)?.x
}
here I can't do P(1)
Nir
03/17/2021, 10:55 PMFábio Carneiro
03/17/2021, 10:55 PMC1(1)
or C2(1)
Nir
03/17/2021, 10:56 PMNir
03/17/2021, 10:56 PMmakeAvailable(1)
or makeUnavailable(2)
Nir
03/17/2021, 10:56 PMFábio Carneiro
03/17/2021, 10:56 PMNir
03/17/2021, 10:56 PMFábio Carneiro
03/17/2021, 10:56 PMNir
03/17/2021, 10:57 PMNir
03/17/2021, 10:57 PMFábio Carneiro
03/17/2021, 10:58 PMwhen
everywhereFábio Carneiro
03/17/2021, 10:59 PMFábio Carneiro
03/17/2021, 10:59 PMFábio Carneiro
03/17/2021, 10:59 PMFábio Carneiro
03/17/2021, 11:00 PMfun whatever(foo: Foo) {}
Fábio Carneiro
03/17/2021, 11:00 PMfun whatever(foo: AvailableFoo) {}
Fábio Carneiro
03/17/2021, 11:01 PMNir
03/17/2021, 11:02 PMNir
03/17/2021, 11:02 PMP
, you cannot call a function that accepts a C1Fábio Carneiro
03/17/2021, 11:02 PMFábio Carneiro
03/17/2021, 11:03 PMFábio Carneiro
03/17/2021, 11:03 PMNir
03/17/2021, 11:04 PMNir
03/17/2021, 11:04 PMNir
03/17/2021, 11:05 PMNir
03/17/2021, 11:05 PMNir
03/17/2021, 11:06 PMfun someFunc(f: Foo)
in your approach, even if Foo is a sealed classNir
03/17/2021, 11:06 PMsomeFunc
, if you have fun someOtherFunc(c1: C1)
, you can only call someOtherFunc
from someFunc
if you do some kind of castNir
03/17/2021, 11:06 PMFábio Carneiro
03/17/2021, 11:12 PMyou can certain haveyou can but you dont have toin your approachfun someFunc(f: Foo)
Fábio Carneiro
03/17/2021, 11:13 PMNir
03/17/2021, 11:13 PMFábio Carneiro
03/17/2021, 11:13 PMNir
03/17/2021, 11:13 PMNir
03/17/2021, 11:13 PMNir
03/17/2021, 11:13 PMFábio Carneiro
03/17/2021, 11:14 PMFábio Carneiro
03/17/2021, 11:14 PMNir
03/17/2021, 11:14 PMFábio Carneiro
03/17/2021, 11:14 PMFábio Carneiro
03/17/2021, 11:15 PMFábio Carneiro
03/17/2021, 11:15 PMNir
03/17/2021, 11:15 PMFábio Carneiro
03/17/2021, 11:15 PMNir
03/17/2021, 11:16 PMf.p
instead of f
, that's really the only difference, and it saves you having to write multiple overrides, and generally cleans up the way that hash == worksNir
03/17/2021, 11:16 PMNir
03/17/2021, 11:16 PMFábio Carneiro
03/17/2021, 11:17 PMFábio Carneiro
03/17/2021, 11:18 PM