Nico
05/09/2020, 6:58 PMraulraja
05/09/2020, 7:00 PMNico
05/09/2020, 7:01 PMstreetsofboston
05/09/2020, 7:37 PMstojan
05/09/2020, 7:38 PMNico
05/09/2020, 7:41 PMstojan
05/09/2020, 7:49 PMraulraja
05/09/2020, 8:48 PMNico
05/09/2020, 9:09 PMmattmoore
05/10/2020, 12:02 AMNico
05/10/2020, 1:19 PMraulraja
05/10/2020, 1:36 PMraulraja
05/10/2020, 1:36 PMraulraja
05/10/2020, 1:38 PMraulraja
05/10/2020, 1:38 PMraulraja
05/10/2020, 1:38 PMraulraja
05/10/2020, 1:41 PMraulraja
05/10/2020, 1:42 PMmattmoore
05/10/2020, 3:37 PMwhen
expression with a function call that can apply those patterns at runtime, once we have the final value/type info resolved. I'm shooting in the dark a bit, and much of this may be wrong. But I'm enthusiastic that there may be an interesting solution here. I'm talking with some of the folks in Scala contributor Gitter to get some better ideas in mind.
I'd be more than happy to collaborate on this with you and @Nico ! Nico, I'll take a deeper look at your KEEP as well and see if I have any suggestions to offer. One of the things I've really missed in Kotlin is pattern matching.Nico
05/10/2020, 5:43 PMraulraja
05/10/2020, 5:43 PMraulraja
05/10/2020, 5:45 PMraulraja
05/10/2020, 5:45 PMNico
05/10/2020, 5:49 PMNico
05/10/2020, 5:49 PMraulraja
05/10/2020, 5:50 PMraulraja
05/10/2020, 5:51 PMraulraja
05/10/2020, 5:51 PMNico
05/10/2020, 5:52 PMraulraja
05/10/2020, 5:53 PMNico
05/10/2020, 5:53 PMraulraja
05/10/2020, 5:53 PMNico
05/10/2020, 5:55 PMraulraja
05/10/2020, 5:56 PMraulraja
05/10/2020, 5:57 PMEmployee.company.address.street.name
is a list of composable paths that you can transform to create an optional matchraulraja
05/10/2020, 5:57 PMraulraja
05/10/2020, 5:57 PMraulraja
05/10/2020, 5:58 PMraulraja
05/10/2020, 5:58 PMraulraja
05/10/2020, 5:59 PMNico
05/10/2020, 5:59 PMraulraja
05/10/2020, 6:00 PMNico
05/10/2020, 6:00 PMraulraja
05/10/2020, 6:01 PMraulraja
05/10/2020, 6:03 PMwhen (model) {
matches Employee.company.address.street.name -> { foo(name) }
matches Employee.company.name -> { bar(name) }
}
raulraja
05/10/2020, 6:03 PMraulraja
05/10/2020, 6:04 PMraulraja
05/10/2020, 6:05 PMraulraja
05/10/2020, 6:06 PMNico
05/10/2020, 6:06 PMNico
05/10/2020, 6:06 PMraulraja
05/10/2020, 6:07 PMmatches Employee.company.address.street.name.let(::upperCased) -> { foo(name) }
raulraja
05/10/2020, 6:07 PMraulraja
05/10/2020, 6:08 PMNico
05/10/2020, 6:08 PMraulraja
05/10/2020, 6:08 PMraulraja
05/10/2020, 6:08 PMraulraja
05/10/2020, 6:08 PMraulraja
05/10/2020, 6:08 PMraulraja
05/10/2020, 6:09 PMNico
05/10/2020, 6:10 PMraulraja
05/10/2020, 6:10 PMraulraja
05/10/2020, 6:11 PMraulraja
05/10/2020, 6:11 PMraulraja
05/10/2020, 6:12 PMraulraja
05/10/2020, 6:12 PMraulraja
05/10/2020, 6:12 PMraulraja
05/10/2020, 6:13 PMNico
05/10/2020, 6:14 PMraulraja
05/10/2020, 6:16 PMraulraja
05/10/2020, 6:17 PMraulraja
05/10/2020, 6:17 PMraulraja
05/10/2020, 6:17 PMid
after a silent refactor it’s now referring to comments
which also is a string and its bound as id
Nico
05/10/2020, 6:18 PMis Person(company = Company(hq = hq))
Nico
05/10/2020, 6:18 PMraulraja
05/10/2020, 6:18 PMraulraja
05/10/2020, 6:19 PMNico
05/10/2020, 6:19 PMNico
05/10/2020, 6:19 PMraulraja
05/10/2020, 6:20 PMraulraja
05/10/2020, 6:20 PMNico
05/10/2020, 6:20 PMNico
05/10/2020, 6:21 PMNico
05/10/2020, 6:21 PMraulraja
05/10/2020, 6:21 PMraulraja
05/10/2020, 6:22 PMNico
05/10/2020, 6:22 PMraulraja
05/10/2020, 6:22 PMNico
05/10/2020, 6:22 PMraulraja
05/10/2020, 6:22 PMraulraja
05/10/2020, 6:22 PMNico
05/10/2020, 6:23 PMraulraja
05/10/2020, 6:23 PMraulraja
05/10/2020, 6:23 PMraulraja
05/10/2020, 6:24 PMraulraja
05/10/2020, 6:24 PMNico
05/10/2020, 6:24 PMNico
05/10/2020, 6:24 PMNico
05/10/2020, 6:25 PMNico
05/10/2020, 6:25 PMNico
05/10/2020, 6:25 PMraulraja
05/10/2020, 6:26 PMraulraja
05/10/2020, 6:26 PMraulraja
05/10/2020, 6:26 PMraulraja
05/10/2020, 6:27 PMraulraja
05/10/2020, 6:27 PMNico
05/10/2020, 6:28 PMraulraja
05/10/2020, 6:28 PMraulraja
05/10/2020, 6:28 PMraulraja
05/10/2020, 6:28 PMNico
05/10/2020, 6:28 PMNico
05/10/2020, 6:29 PMandThen
that all worksraulraja
05/10/2020, 6:29 PMraulraja
05/10/2020, 6:29 PMNico
05/10/2020, 6:29 PMraulraja
05/10/2020, 6:30 PMNico
05/10/2020, 6:30 PMraulraja
05/10/2020, 6:30 PMraulraja
05/10/2020, 6:31 PMraulraja
05/10/2020, 6:31 PMNico
05/10/2020, 6:31 PMraulraja
05/10/2020, 6:32 PMNico
05/10/2020, 6:32 PMwhen
already doesraulraja
05/10/2020, 6:32 PMraulraja
05/10/2020, 6:32 PMNico
05/10/2020, 6:32 PMNico
05/10/2020, 6:33 PMraulraja
05/10/2020, 6:33 PMNico
05/10/2020, 6:35 PMwhen (Some(1) to Some(2)) {
is (Some(4), Some(y)) -> ... // case 1
is (Some(x), None) -> ... // case 2
is (None, Some(3)) -> ... // case 3
is (_, None) -> ... // case 4
}
No guards here (again, without contract black magic I do not see how to bring them into the equation)
You keep track of where an unconditional match has been performed. When all of them have you know you've exhausted all optionsNico
05/10/2020, 6:35 PMraulraja
05/10/2020, 6:35 PMraulraja
05/10/2020, 6:36 PMraulraja
05/10/2020, 6:37 PMNico
05/10/2020, 6:37 PMraulraja
05/10/2020, 6:37 PMraulraja
05/10/2020, 6:38 PMraulraja
05/10/2020, 6:39 PMNico
05/10/2020, 6:39 PMNico
05/10/2020, 6:39 PMNico
05/10/2020, 6:40 PMNico
05/10/2020, 6:40 PMNico
05/10/2020, 6:40 PMraulraja
05/10/2020, 6:41 PMNico
05/10/2020, 6:42 PMNico
05/10/2020, 6:42 PMraulraja
05/10/2020, 6:43 PMraulraja
05/10/2020, 6:43 PMNico
05/10/2020, 6:44 PMNico
05/10/2020, 6:44 PMraulraja
05/10/2020, 6:44 PMraulraja
05/10/2020, 6:44 PMNico
05/10/2020, 6:46 PMNico
05/10/2020, 6:48 PMNico
05/10/2020, 6:48 PMraulraja
05/10/2020, 6:49 PMNico
05/10/2020, 6:49 PMNico
05/10/2020, 6:50 PMraulraja
05/10/2020, 6:50 PMNico
05/10/2020, 6:50 PMNico
05/10/2020, 6:50 PMNico
05/10/2020, 6:51 PMNico
05/10/2020, 6:51 PMNico
05/10/2020, 6:51 PMraulraja
05/10/2020, 6:52 PMraulraja
05/10/2020, 6:52 PMraulraja
05/10/2020, 6:53 PMraulraja
05/10/2020, 6:53 PMNico
05/10/2020, 6:58 PMfun <T> List<T>.match2() = when(this.size) {
0 -> Triple(null, null, null)
1 -> Triple(get(0), null, null)
else -> Triple(get(0), get(1), drop(2))
}
// Then use it like:
when(listOf(1,2,3,4).match2) {
is (Int, String, _) -> ...
is (x, y, tail) -> ...
is (x, null) -> ...
is (null) -> ...
}
Nico
05/10/2020, 6:59 PMinstanceOf
so it being a List<Any>
is not an issue we are literally getting and checkingNico
05/10/2020, 6:59 PMraulraja
05/10/2020, 7:00 PMraulraja
05/10/2020, 7:00 PMNico
05/10/2020, 7:00 PMunapply
on everyone is just a bit ruderaulraja
05/10/2020, 7:01 PMraulraja
05/10/2020, 7:01 PMNico
05/10/2020, 7:01 PMoverride
semantics it is a bitraulraja
05/10/2020, 7:01 PMNico
05/10/2020, 7:01 PMNico
05/10/2020, 7:03 PMraulraja
05/10/2020, 7:03 PMraulraja
05/10/2020, 7:04 PMNico
05/10/2020, 7:04 PMoperator fun
rightraulraja
05/10/2020, 7:04 PMNico
05/10/2020, 7:04 PMraulraja
05/10/2020, 7:05 PMraulraja
05/10/2020, 7:05 PMraulraja
05/10/2020, 7:05 PMNico
05/10/2020, 7:05 PMpakoito
05/10/2020, 9:15 PMpakoito
05/10/2020, 9:15 PMpakoito
05/10/2020, 9:17 PMPerson(name = "Paco")
? or ==
or a new symbol?pakoito
05/10/2020, 9:19 PMpakoito
05/10/2020, 9:19 PMpakoito
05/10/2020, 9:19 PMmattmoore
05/10/2020, 9:21 PMmattmoore
05/10/2020, 10:04 PMNico
05/10/2020, 10:12 PMunapply
(defined by the class author) which gives you a tuple, so you extract based on position. Haskell does more or less the same without unapply
and I propose doing the same with componentN
. Ideally, we can also destruct by property name but again, I don't have a nice syntax for thatNico
05/10/2020, 10:12 PMpakoito
05/10/2020, 10:17 PMpakoito
05/10/2020, 10:18 PMis
for deep value matching, keep it only for type matching