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 idNico
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