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 PMSNir
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: Availableephemient
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