08:26
<littledan>
Are we getting the video conference signup link?
08:27
<littledan>
I take it the meeting starts in half an hour. I don’t see it on the Reflector
08:40
<Rob Palmer>
It was posted on the Reflector 30mins ago. Please refresh.
08:44
<Rob Palmer>
We are now admitting people to the Google Meet. Please use Incognito/Private browsing mode - because that will allow you to specify your name. So you can call yourself "Name (Affiliation)".
08:59
<Rob Palmer>
We will begin the meeting in one minute!
08:59
<Rob Palmer>
If anyone has any troubles dialling in, please say here.
09:00
<yulia>
Is tcq not working for anyone else?
09:00
<yulia>
I get meeting not available
09:00
<Alex Vincent>
try reloading the page - that worked for me yulia
09:01
<yulia>
I still get meeting not found. should it be TKTK or is the meeting id different?
09:01
<Rob Palmer>
The signin form is available on the Reflector - please can all in-person attendees fill it out too: https://github.com/tc39/Reflector/issues/446
09:02
<Rob Palmer>
I just fixed the TCQ link on the draft schedule
09:02
<Alex Vincent>
hm, maybe I'd opened it as a fresh link from the Reflector issue
09:03
<rkirsling>
is it an obligation for the host to have a second CoC in play? obviously not a problem if they do have one, but somehow I don't have a recollection of that before
09:03
<yulia>
Found it -- the link is different than the text
09:03
<Robert Pamely>
Is it viable to turn off the lights above the projection screen?
09:03
<Robert Pamely>
Are those lights independent?
09:05
<Rob Palmer>
Romulo Cintra: Can you help with lights?
09:07
<Rob Palmer>
Thank you Jason and Ashley and Kevin for volunteering for notes!
09:07
<bakkot>
btw the bot is using a new language model, which hopefully is better
09:07
<bakkot>
we'll see though
09:07
<Romulo Cintra>
Romulo Cintra: Can you help with lights?
?
09:08
<Christian Ulbrich>
Romulo Cintra: Thx!
09:08
<Robert Pamely>
Thank you
09:08
<jasew>
That's much better
09:08
<Rob Palmer>
The room is now is dark mode, which helps us to see the projector screen.
09:09
<Romulo Cintra>
🌓
09:09
<nicolo-ribaudo>
Why is the "attendees" section in the notes only for remote people? Having the abbreviations there helps also for in-person attendees
09:09
<Rob Palmer>
it should be for both
09:10
<msaboff>
Please add your name, abbreviation and organization to the attendees section of the notes (each day).
09:12
<Justin Ridgewell>
Rob Palmer: I can't find the sign in form for remote attendees
09:12
<Justin Ridgewell>
Only the in person form
09:12
<ryzokuken>
Justin Ridgewell: it's on the reflector
09:12
<ryzokuken>
please refresh
09:12
<Justin Ridgewell>
I did...
09:12
<ryzokuken>
it was added a short while ago, you might have the old page loaded
09:13
<Rob Palmer>
It's in the video link section
09:13
<Justin Ridgewell>
Ahh, got it
09:13
<Justin Ridgewell>
It's tooooooo early.
09:14
<pipobscure>
BTW TCQ seems to still be on the Welcome/Intro
09:14
<jasew>
ryzokuken
09:15
<jasew>
Thanks
09:16
<rkirsling>
It's tooooooo early.
don't you mean late
09:16
<Justin Ridgewell>
4am in NYC. I just woke up
09:17
<rkirsling>
ohhh right whoops
09:17
<rkirsling>
true dedication
09:17
<msaboff>
4am in NYC. I just woke up
1am in California!
09:17
<shu>
i went to sleep at 8:30
09:17
<Rob Palmer>
Thank you for your dedication!
09:18
<msaboff>
i went to sleep at 8:30
That is about when I went to sleep.
09:18
<shu>
i don't want to be dedicated i want to be asleep
09:20
<rkirsling>
i don't want to be dedicated i want to be asleep
eternal mood
09:20
<rkirsling>
except that it's 6pm in Tokyo for this meeting
09:20
<rkirsling>
I'm now doomed for US meetings instead lol
09:28
<Rob Palmer>
Slides: https://docs.google.com/presentation/d/1sWm_ynPyH_4XHUVwRuGIB6McALQHZXdENncu7BD1q9Y/
09:42
<Rob Palmer>
If anyone struggles with screen-sharing, please just post a link to your slides here and someone helpful can screenshare on your behalf.
09:47
<rkirsling>
this was a non-rhetorical question re: hosting, btw (am I just forgetful/unobservant?)
09:48
<waldemar>
Is there a list of in-person attendees that the remote folks can see?
09:48
<waldemar>
I can't tell who is in the room at the moment
09:49
<Rob Palmer>
Waldermar, I'll update the notes doc to ensure in-person attendees are listed
09:50
<rbuckton>
I think we actually skipped the "traditional" in-person introductions at the start of the meeting, though that's understandable given how packed the agenda is.
09:51
<Rob Palmer>
we did a quick names-only runaround in the room before the meeting started - I will ensure this goes in the notes
09:53
<Luca Casonato>
waldemar: we have added "in-person" and "remote" labels to the attendee list in the notes
09:56
<ryzokuken>
this was a non-rhetorical question re: hosting, btw (am I just forgetful/unobservant?)
apologies if you were taken by surprise, I tried to give a heads up in the reflector post
09:56
<rkirsling>
no need for apology, just was curious about it
09:56
<ryzokuken>
this was basically a request by the Igalia CoC committee and the chair group decided to respect it, I'm not sure if a second CoC has been applied in the past.
10:13
<littledan>
What does STR mean?
10:13
<ryzokuken>
it was answered in #tc39-beginners:matrix.org
10:13
<nicolo-ribaudo>
Steps to reproduce
10:13
<littledan>
Oh thanks
10:14
<bakkot>
someone want to PR the glossary with that? seems useful
10:18
<Luca Casonato>
someone want to PR the glossary with that? seems useful
ill do it
10:20
<rkirsling>
is it used enough to justify? seems like we all shared the same confusion, so it might not be encourageable?
10:21
<littledan>
We often say “test case” for this sort of thing
10:27
<Luca Casonato>
https://github.com/tc39/how-we-work/pull/124 <- PR, if we want to merge it.
10:30
<littledan>
“groupedBy”
10:34
<littledan>
Three options or two?
10:35
<rbuckton>
A static method results in a pretty bad developer experience though. I've had some of the same issues with some of the Temporal APIs
10:35
<rkirsling>
which do you mean?
10:35
<Rob Palmer>
https://github.com/tc39/how-we-work/blob/main/presenting.md#temperature-checks
10:37
<rbuckton>
I discussed this awhile back about the poor DX around things like Temporal.Duration.compare being static only, though I haven't followed up. Until something like pipeline advances, it breaks left-to-right reading order.
10:37
<rkirsling>
tbh I feel like this is about more than just the method at hand is the thing
10:38
<rkirsling>
given the difficulty of adding methods to Array in general
10:38
<rbuckton>
I agree there, its disheartening that Array is constantly so difficult to extend.
10:39
<Michael Ficarra>
should we consider just pursuing this as an iterator helper method?
10:40
<rbuckton>
Its unfortunate because I believe this is something that belongs on Array.prototype. And this won't be the last time we run into this.
10:43
<Robert Pamely>
What is it that the static methods is consistent with? Object groupBy?
10:43
<rbuckton>
Another way to approach this might have been a .collect(collector) a. la. Java collectors (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html), but that's a completely different proposal
10:44
<rbuckton>
(i.e., array.collect(Collector.groupBy(keySelector)))
10:44
<nicolo-ribaudo>
What is it that the static methods is consistent with? Object groupBy?
Object.fromEntries, which produces an object given an array
10:45
<Robert Pamely>
Oh I see ok
10:45
<Robert Pamely>
I see that as quite a different helper from groupBy
10:46
<yulia>
did i miss the bit where we had bathroom explainations? cc ryzokuken
10:46
<Kris Kowal>
I like the suggestion for Object.groupBy and Map.groupBy, where you select the return type with the constructor.
10:46
<ryzokuken>
did i miss the bit where we had bathroom explainations? cc ryzokuken
oops, sorry
10:46
<Robert Pamely>
"Entries" are an array representation of an object. groupBy is an operation on an array.
10:46
<ryzokuken>
I could do that right after this item
10:46
<yulia>
"Entries" are an array representation of an object. groupBy is an operation on an array.
couldn't the same argument be made about entries?
10:47
<Robert Pamely>
Entries have to have a specific shape though
10:47
<Robert Pamely>
groupBy is more like reduce than fromEntries
10:47
<rbuckton>
I like the suggestion for Object.groupBy and Map.groupBy, where you select the return type with the constructor.
I'm not entirely against it, but I'd again rather see something like a formal collector API that those statics could be built off of.
10:47
<Kris Kowal>
"Entries" are an array representation of an object. groupBy is an operation on an array.
Of a map (and by implication objects-as-dictionaries, which are map-alike)
10:48
<Kris Kowal>
I'm not entirely against it, but I'd again rather see something like a formal collector API that those statics could be built off of.
Generators-as-collectors come to mind.
10:48
<Robert Pamely>
Of a map (and by implication objects-as-dictionaries, which are map-alike)
Yes I guess specifically Entries are a representation of key-value pairs, which objects and Maps can represent
10:48
<jasew>
I like the suggestion for Object.groupBy and Map.groupBy, where you select the return type with the constructor.
My understanding is this proposal only adds a static to Array right? Is there an addition to Object and Map also and i missed that?
10:48
<bakkot>
Of a map (and by implication objects-as-dictionaries, which are map-alike)
what is this "of" attached to?
10:49
<bakkot>
My understanding is this proposal only adds a static to Array right? Is there an addition to Object and Map also and i missed that?
I think it would only add statics to Object and Map, not to Array at all
10:49
<jasew>
I see
10:50
<Robert Pamely>
Given users are used to finding helpers like reduce on the array prototype, I don't think it will be obvious to look for these on Object and Map
10:50
<Kris Kowal>
Yes, I believe yulia suggested using Object and Map constructors as receivers instead of Array.
10:50
<yulia>
yeah i think that was just a mistake in the slides
10:51
<Justin Ridgewell>
Yes, it was a typo to have Array.groupBy and Tuple.groupBy
10:51
<Kris Kowal>
In any case, X.of is the good precedent for X.groupBy. Both return instances of X and have an open range for values of X.
10:51
<Justin Ridgewell>
It should just be Object.groupBy, Map.groupBy (and WeakMap), and possibly Record.groupBy
10:52
<Kris Kowal>
That is, provides clear guidance for a library SortedMap.groupBy
10:52
<jasew>
This makes more sense to me now, thanks for clarifying
10:52
<yulia>
Given users are used to finding helpers like reduce on the array prototype, I don't think it will be obvious to look for these on Object and Map
Object.entries can be created from a map. There we don't have entriesToObject on the map prototype or array prototype, so I think we have precedent for this. That said, i do understand where you are coming from, I am just agreeing with eemeli that we have similar patterns already
10:53
<bakkot>
groupBy is kind of a weird name if this is a static
10:53
<bakkot>
though I don't have a better one
10:54
<jasew>
fromGrouped? like fromEntries? I don't have a better name either
10:54
<Robert Pamely>
fromGrouped? like fromEntries? I don't have a better name either
The input is not grouped
10:55
<rbuckton>
The Java grouping collector is groupingBy, which was one of the options listed as an alternative for the .prototype version, if we're going to change the name anyways
10:55
<bakkot>
if we're ok with groupingBy it can probably still be on Array.prototype
10:55
<bakkot>
I doubt that will have conflicts like group and groupBy did
10:55
<rbuckton>
if we're ok with groupingBy it can probably still be on Array.prototype
That would be my preference, though I'd lean more towards .groupedBy in that case.
10:56
<bakkot>
though groupingByToMap is... not... a great name
10:56
<bakkot>
yeah I think I like groupedBy personally
10:56
<yulia>
if we continue to go with the prototype, then I don't think we can again just implement it and hope for bugs if there are problems
10:56
<yulia>
is there a more robust way we can test this name?
10:56
<bakkot>
yulia: even with a really weird name like groupingBy?
10:57
<rbuckton>
groupingBy indicates something that produces a thing will do the grouping (i.e., Java's Collectors.groupingBy), where as groupedBy indicates something that produces the grouped result.
10:57
<bakkot>
conflicts with group and groupBy are not too surprising because those are natural names that people might use
10:57
<yulia>
groupingBy and groupToObject is probably safe... but is this really better than it being a static if we are looking for really weird anmes?
10:57
<rkirsling>
Object.groupsFromArray?
10:57
<bakkot>

but is this really better than it being a static

eh, personally I think so

10:57
<yulia>
Object.toCategories?
10:57
<yulia>
idk
10:57
<bakkot>
statics are quite strange for this
10:57
<jasew>
Something with from in the name often implies one type (input) to another (usually the same as the reciever)
10:57
<Robert Pamely>
groupingBy and groupToObject is probably safe... but is this really better than it being a static if we are looking for really weird anmes?
One concern with static is chaining too. Without pipeline you lose the ability to easily chain at the end of array operations.
10:58
<yulia>
One concern with static is chaining too. Without pipeline you lose the ability to easily chain at the end of array operations.
you would not be chaining array methods anyway
10:58
<bakkot>
sure you would
10:58
<rkirsling>
Object.toCategories?
the FP community will surely have our heads 😂
10:58
<rbuckton>
As I mentioned earlier, I wonder if a comprehensive check for a more general-purpose Array.prototype.collect method would make sense, plus a formalized Collector API.
10:58
<bakkot>
x.filter().groupBy() is a pretty common thing to want
10:59
<yulia>
but you would have an object after groupBy
10:59
<Robert Pamely>
Object.groupBy(arr.filter().map()) vs arr.filter().map().groupedBy()
10:59
<rbuckton>
x.filter().groupBy() is a pretty common thing to want
Yes, I use this pattern all the time with my own libraries.
10:59
<yulia>
ah i see what you folks mean
10:59
<yulia>
thats fair
10:59
<rkirsling>
groop
10:59
<bakkot>
As I mentioned earlier, I wonder if a comprehensive check for a more general-purpose Array.prototype.collect method would make sense, plus a formalized Collector API.
I am not necessarily opposed to such a thing, but I have a hard time imagining it being as convenient as groupBy. .collect(Collectors.groupBy) is much worse than groupedBy.
11:00
<Robert Pamely>
groop
it's called the JS language for a reason
11:00
<yulia>
i mean, we can't even decide on a name for the language so ;)
11:00
<yulia>
officially its ECMAScript, which is the only still-capitalized thing for Ecma international
11:01
<rbuckton>
but you would have an object after groupBy
That depends on the implementation. A query/sequence-like groupBy would produce an array of groupings (i.e., key/values pairs)
11:01
<Kris Kowal>
Using groupBy will be good for discovery.
11:01
<yulia>
so i prefer to think that its still European Computer Manufacturer's Association Script, or, per the sporting world, soccer script
11:01
<yulia>
ill show myself out
11:01
<rkirsling>
has anyone ever tried to align the capitalization of ECMAScript? haha
11:02
<rkirsling>
clearly a task worthy of time and effort 🙄
11:02
<shu>
you know that's not the OG ecma
11:02
<Robert Pamely>
Using groupBy will be good for discovery.
In what sense? Searching docs?
11:02
<shu>
the OG ecma is carton manufacturers
11:02
<shu>
https://www.ecma.org/
11:02
<Kris Kowal>
In what sense? Searching docs?
Googling “mdn groupBy” on a lark and finding useful results.
11:02
<rbuckton>
I am not necessarily opposed to such a thing, but I have a hard time imagining it being as convenient as groupBy. .collect(Collectors.groupBy) is much worse than groupedBy.
Yes, but if we're considering statics anyways, a .collect would preserve LTR reading/method chaining
11:03
<rbuckton>
i.e., .collect(Map.groupingBy) for example
11:03
<Robert Pamely>
Googling “mdn groupBy” on a lark and finding useful results.
True, but "mdn group array" is a likely search too
11:03
<bakkot>
well, .collect(Map,groupingBy, fn), really
11:03
<Robert Pamely>
where any solution would be found hopefully..
11:03
<Kris Kowal>
the OG ecma is carton manufacturers
Carton: the language formerly known as variously ECMAScript and JavaScript.
11:04
<rbuckton>
well, .collect(Map,groupingBy, fn), really
Well, if you follow the Java design, .collect(Map.groupingBy(fn))
11:04
<bakkot>
Googling “mdn groupBy” on a lark and finding useful results.
no matter what option we do "groupBy" should be mentioned in the docs
11:04
<rbuckton>
Carton: the language formerly known as variously ECMAScript and JavaScript.
That's actually kinda catchy
11:04
<Robert Pamely>
These full on Java suggestions are hurting my eyes
11:04
<bakkot>
re: discoverability, I'm more worried about people being able to do x.gr... in the console and get autocomplete which suggests the thing they wanted
11:04
<Rob Palmer>
We will resume the meeting in 56 mins at 13:00 local time.
11:04
<bakkot>
which only works for proto methods, not static
11:04
<nicolo-ribaudo>
well, .collect(Map,groupingBy, fn), really
.collect(Map, fn) would also work, with a collectors protocol
11:08
<rkirsling>
Carton: the language formerly known as variously ECMAScript and JavaScript.
cool devs in 2030 only use Carbon and Carton
11:09
<Justin Ridgewell>
Are we changing our mind on static methods?
11:09
<bakkot>
different people always had different opinions I think
11:09
<Justin Ridgewell>
I'm just kinda exhausted with seeing naming conflicts with the ecosystem.
11:09
<bakkot>
I don't have that firm of an opinion at the moment
11:09
<Justin Ridgewell>
group was impossible to query for
11:09
<bakkot>
need to think about it more
11:10
<rbuckton>

We could seriously consider something like F#'s computation expressions (something jschoi was looking into) to create query DSLs:

// computation expression example using decorators and do-expression syntax:
const array = ...;
const result = @query do {
  for x in array
  groupBy x.name into y
  select y
};
11:10
<rkirsling>
I'm just kinda exhausted with seeing naming conflicts with the ecosystem.
this is what I'm saying; what I want is a solution that we can also apply to the next time this happens
11:11
<bakkot>

We could seriously consider something like F#'s computation expressions (something jschoi was looking into) to create query DSLs:

// computation expression example using decorators and do-expression syntax:
const array = ...;
const result = @query do {
  for x in array
  groupBy x.name into y
  select y
};
that is too many things
11:11
<bakkot>
JS does not have room for that
11:12
<bakkot>
if any of us had large twitter followings we could poll the community on Object.groupBy vs [].groupedBy
11:13
<bakkot>
just don't put a joking "break the web" option in or people will take it seriously and get mad that we don't
11:13
<rbuckton>
if any of us had large twitter followings we could poll the community on Object.groupBy vs [].groupedBy
I'm less convinced of the efficacy of twitter polls given the mass exodus of many in the tech community off of that platform and onto platforms like Mastodon.
11:14
<Kris Kowal>
I'm less convinced of the efficacy of twitter polls given the mass exodus of many in the tech community off of that platform and onto platforms like Mastodon.
Or, as we like to call it, the Lemmer Web.
11:15
<Kris Kowal>
(for Christine Lemmer-Webber, one of the authors of ActivityPub)
11:15
<rbuckton>
JS does not have room for that
I'm not so sure. async do {} is not so far off from what @async do {} might be in terms of how async {} works in F#.
11:15
<rbuckton>
But even if it is viable, its a long way off.
11:17
<bakkot>
I'm less convinced of the efficacy of twitter polls given the mass exodus of many in the tech community off of that platform and onto platforms like Mastodon.
eh, well, you can run it and see what results you get
11:17
<bakkot>
seems like there are still enough people around to get a decent sample size
11:18
<Justin Ridgewell>
We need scoped prototype methods
11:18
<bakkot>
if we could get decent sample size in the first place, anyway
11:18
<Justin Ridgewell>
{
  "use groupBy";
  [].groupBy; // => function
}
[].groupBy; // => undefined
11:19
<littledan>
We need scoped prototype methods
Jake was talking about this too, but how would it work?
11:19
<rbuckton>
We need scoped prototype methods
You mean like https://github.com/tc39/proposal-extensions?
11:19
<Justin Ridgewell>
Similar, but access would still use . instead of ::
11:19
<littledan>
if we could get decent sample size in the first place, anyway
Anyway we can do a parallel Mastodon poll!
11:19
<Justin Ridgewell>
Else it's just a pipe.
11:19
<rbuckton>
Else it's just a pipe.
That is the way
11:20
<rbuckton>
If only we could do something like C#'s extension methods, but that requires runtime typing
11:21
<Justin Ridgewell>
Jake was talking about this too, but how would it work?
Roughly, don't we already have similar tracking for strict property access?
11:22
<Justin Ridgewell>
Just need to track prototype scopes now, for every property access...
11:22
Justin Ridgewell
runs away
11:26
<rbuckton>
That is the way

We really do need to get pipeline to move forward, and then maybe we could just do this:

import { groupBy } from "std:array";

const result = ar.filter(...) |> groupBy(%, ...);
11:26
<littledan>
@bterlson @robpalme @ujjwal Is it too late for me to defer my next topic down the agenda? There is so much good stuff that we might not get a chance to discuss; consensus procedures can wait until next meeting
11:27
<littledan>
Apologies for not marking it as such earlier
12:00
<rkirsling>
that didn't sound like an ñ to me 😛
12:00
<rkirsling>
just teasin' ya
12:06
<Justin Ridgewell>
Have we restarted? I'm waiting to be admitted
12:06
<rbuckton>
Yes, they started up again.
12:06
<ryzokuken>
apologies, you're in
12:09
<bakkot>
I am trying a new language model for the bot, and it's definitely better, but it's slow enough that it gets behind sometimes, and that tradeoff isn't worth it :(
12:10
<bakkot>
it's google's speech-to-text service, so I'm surprised they have it lag instead of having it run on better hardware and charge more
12:11
<Ashley Claymore>
I am trying a new language model for the bot, and it's definitely better, but it's slow enough that it gets behind sometimes, and that tradeoff isn't worth it :(
ah that explains what I was seeing in the first half
12:11
<Ashley Claymore>
hopefully the lag will improve, as the model does seem much better as you say
12:13
<bakkot>
I wish they'd just publish the model so I could rent myself a faster GPU
12:13
<bakkot>
but alas
12:13
<bakkot>
I guess at some point I should try other services
12:14
<Michael Ficarra>
I didn't see deferred evaluation mentioned in Kris Kowal's slides
12:16
<Rob Palmer>
Richard slides: https://docs.google.com/presentation/d/1vyp3FZ5OIiN1xzKV_y7FZauBMdGow0CW2es4qbOQtgw/edit
12:16
<Kris Kowal>
Indeed, I didn’t touch on deferred evaluation. Briefly, that’s motivated by the ability to easily avoid executing the body of unused modules, which is possible and relied upon in practice with CommonJS.
12:16
<Anthony Bullard>
Sorry, I'm running a bit late, could someone admit me when they get a chance?
12:17
<Michael Ficarra>
Kris Kowal: I'm thinking there's overlap between reflection and deferred evaluation anyway
12:17
<Michael Ficarra>
I guess I'll talk about that more when we discuss reflection at this meeting
12:18
<yulia>
Anthony Bullard: are you joining the call?
12:18
<Rob Palmer>
If anyone needs to be admitted to the meeting, please notify ryzokuken here
12:18
<Kris Kowal>
I guess I'll talk about that more when we discuss reflection at this meeting
I thought this as well, but yulia’s deferred evaluation goes farther than deferred import.
12:19
<yulia>
yes, Guy and I have been working together on this, but deferred import eval won't be solved just by reflection
12:19
<Kris Kowal>
I think the uses of import reflection for deferring execution are more closely related to the code splitting use case than Yulia’s proposal, having learned more about the latter since I last presented.
12:20
<yulia>
deferred evaluation explicitly seeks to avoid the async tick by preloading and initializing the module. You can think of it as a dynamic import without the fetch. any async work is done up front as part of the module loading / linking stage
12:24
<Justin Ridgewell>
Bradford Smith: Re your iterable suggestion for groupBy, I think we could actually do that. Iterator needs special contiguous-run behavior, but that could be special to Iterator.groupBy (pending the Iterator helpers proposal)
12:25
<Rob Palmer>
In the room I have a black leather wallet that was handed in. Let me know if it is yours.
12:26
<Alex Vincent>
Is this potentially a "reserved properties" situation, like the reserved keywords of 262?
12:26
<Michael Ficarra>
Justin Ridgewell: it doesn't need to be that way, there's just pretty strong precedent from other languages for groupBy on a representation of a (possibly) infinite sequence to have that behaviour
12:26
<Anthony Bullard>
Anthony Bullard: are you joining the call?
I have joined
12:27
<Robert Pamely>
Bradford Smith: Re your iterable suggestion for groupBy, I think we could actually do that. Iterator needs special contiguous-run behavior, but that could be special to Iterator.groupBy (pending the Iterator helpers proposal)
What does contiguous-run behaviour mean?
12:27
<Christian Ulbrich>
Robert Pamely: Its mine.
12:28
<Robert Pamely>
Robert Pamely: Its mine.
Guessing you meant to tag Rob Palmer
12:28
<ryzokuken>
it's right in front of me and rob on the table
12:28
<Justin Ridgewell>
[1, 2, 1, 1] in by default groups to a single { 1 => [1, 1, 1], 2 => [2] }, but in infinite iterables it's not possible to collect all values into a key. So instead, you return an iterable [ [1, [1]], [2, [2]], [1, [1, 1]] ] grouping contiguous runs of the same key
12:28
<Christian Ulbrich>
Rob Palmer: Exactly :)
12:29
<yulia>
Rob Palmer -- i think waldemar is next?
12:29
<yulia>
he had a topic "factored spec"
12:29
<Rob Palmer>
we messed up the queue by double advancing
12:30
<Robert Pamely>
[1, 2, 1, 1] in by default groups to a single { 1 => [1, 1, 1], 2 => [2] }, but in infinite iterables it's not possible to collect all values into a key. So instead, you return an iterable [ [1, [1, 1]], [2, [2]], [1, [1]] ] grouping contiguous runs of the same key
I see thanks for clarifying
12:31
<rbuckton>
[1, 2, 1, 1] in by default groups to a single { 1 => [1, 1, 1], 2 => [2] }, but in infinite iterables it's not possible to collect all values into a key. So instead, you return an iterable [ [1, [1]], [2, [2]], [1, [1, 1]] ] grouping contiguous runs of the same key
grouping only contiguous runs seems like a different operation though, needing a different name to indicate the difference in behavior.
12:32
<nicolo-ribaudo>

Wishlist:

  • kevin's bot should replace "40 to" with 402
    (where can I open a PR for that?)
12:33
<Robert Pamely>
grouping only contiguous runs seems like a different operation though, needing a different name to indicate the difference in behavior.
I agree. It feels more like batching the same values or something.
12:34
<jasew>

Wishlist:

  • kevin's bot should replace "40 to" with 402
    (where can I open a PR for that?)

bakkot has an exception list somewhere, so pinging him usually

12:34
<Michael Ficarra>
jasew: nicolo-ribaudo https://github.com/bakkot/transcribe-to-gdocs/blob/master/replacements.js
12:35
<rbuckton>
I agree. It feels more like batching the same values or something.
Inside the TypeScript compiler we have a groupBy function that maps the input into discrete groups by key, and a spanMap function that maps contiguous sequences by key.
12:35
<Robert Pamely>
As it turns out, this has the unfortunate correction in google to "Spain map"
12:36
<rbuckton>
I also called that operation spanMap in @esfx/iter-fn: https://esfx.js.org/esfx/api/iter-fn.html#_esfx_iter_fn_spanMap_function_1_
12:36
<Christian Ulbrich>
This sounds convincing to me. ECMA262 should be able to be implemented w/o any stuff related to 402.
12:37
<ryzokuken>
isLeapDay
12:37
<ryzokuken>
😬
12:38
<Michael Ficarra>
rbuckton: I know span as the like "single step" version of group: https://hackage.haskell.org/package/base-4.17.0.0/docs/Prelude.html#v:span
12:39
<rbuckton>
Yeah, I have the same concept in @esfx/iter-fn as well: https://esfx.js.org/esfx/api/iter-fn.html#_esfx_iter_fn_span_function_4_
12:40
<littledan>
Wait, everything goes through plenary, regardless of outcome here
12:40
<Michael Ficarra>
rbuckton: I think using "span" in the names of both of those operations is weird
12:41
<rbuckton>
They both operate on contiguous sequences, e.g., a "span"
12:41
<Robert Pamely>
To clarify, why is it necessary to have a different group algorithm on iterators anyway? There are already operations like every that would never end on infinite iterators right?
12:42
<Michael Ficarra>
wouldn't we have already run into this issue with String.prototype.toLocaleLowerCase and likewise if they hadn't already been in 262 for historical reasons?
12:42
<shu>
littledan: you're right, sorry for being imprecise
12:42
<littledan>
In the web world, extensions are often used specifically to be able to act in cases where one spec wants to add a feature to another without working with all of those people (eg because maybe there isn’t an active WG). But other times just for factoring as here.
12:42
<Michael Ficarra>
Robert Pamely: it's not necessary, there's just precedent
12:42
<rbuckton>
And many other languages/library implement .groupBy over potentially infinite iterables assuming they are finite.
12:43
<shu>
littledan: i really do not see any advantage to requiring extra deliberation for this stuff in 262
12:43
<bakkot>
jasew: nicolo-ribaudo https://github.com/bakkot/transcribe-to-gdocs/blob/master/replacements.js
that's the file but yes pinging me is correct, rather than a PR
12:46
<shu>
i don't understand what the conclusion was
12:47
<Michael Ficarra>
was anyone other than Mark in the "no" camp?
12:47
<shu>
is the "narrow yes" non-normative notes?
12:47
<bakkot>
grouping only contiguous runs seems like a different operation though, needing a different name to indicate the difference in behavior.

I agree that calling this operation "groupBy" is bad. unfortunately, though, that's the behavior that groupBy has for infinite iterators in languages like python and haskell - https://docs.python.org/3/library/itertools.html#itertools.groupby / https://hackage.haskell.org/package/groupBy-0.1.0.0/docs/Data-List-GroupBy.html

I wouldn't want a thing called "groupBy" on Iterator.prototype which does something other than what the groupBy from python's itertools does

12:47
<ryzokuken>
is the "narrow yes" non-normative notes?
non-normative notes backreferencing 402
12:47
<ryzokuken>
like we do for the toLocaleString methods
12:47
<shu>
sgtm, thanks
12:48
<shu>
well not exactly like those i hope?
12:48
<bakkot>
can someone capture that in the notes
12:48
<Michael Ficarra>
yeah not quite like those
12:48
<ryzokuken>
in the same vein, I suppose
12:48
<shu>
toLocaleString is like, "this does something, who knows? but really, look at 402"
12:48
<shu>
i hope this is more like "this is added by 402, look at that"
12:48
<Michael Ficarra>
those are mandatory whether or not 402 is implemented, they just have a different behaviour
12:48
<shu>
right
12:49
<ryzokuken>
yeah that's because the stubs exist for toLocaleString
12:49
<Michael Ficarra>
shu: yeah that is my understanding
12:49
<ryzokuken>
so in this case we'll say "these classes might have additional properties that are defined here"
12:50
<shu>
okay i would characterize that as in fact not at all like toLocaleString
12:50
<ryzokuken>
hm, perhaps I misunderstood something thing. Richard Gibson could you clarify?
12:51
<bakkot>

NOTE: For historical reasons, the strings *"true"* and *"false"* are treated the same as the boolean value *true*.

12:51
<bakkot>
ah yes, javascript
12:51
<shu>
hell yeah brother
12:51
<ryzokuken>
"false" === true
12:52
<bakkot>
I guess I wrote that sentence
12:52
<bakkot>
well, !!"false" === true
12:52
<HE Shi-Jun>
I don't have time to comment last topic. I don't have strong opinion on whether 402 could extend 262, i just want to mention in this specific case, it not only an impl choose to impl 402 or not but also which calendars they want to support. for example, if support japanese calendar, it will have era field, if support chinese year calendar, it could have animal field (in the future?), if support both, it will have both fields... So the shape of the prototype may have many varieties.
12:54
<Michael Ficarra>
HE Shi-Jun: why would 402 make individual fields present only when certain locale data is present?
12:54
<Michael Ficarra>
I imagine the data would change but the shapes would be fixed
12:55
<HE Shi-Jun>
Actually I have seen some modifications on such data so only have specific locale to make the binary small.
12:55
<Michael Ficarra>
yes, it is normal to not have some locale data
12:55
<Michael Ficarra>
it would not be okay for 402 to say that the shape of the object changes based on that though
12:56
<Michael Ficarra>
like, I don't think that would pass the TG1 review
12:56
<HE Shi-Jun>
So you mean even an impl do not support japanese year calendar, it should still have era field?
12:56
<Michael Ficarra>
yes
12:57
<HE Shi-Jun>
I'm ok with that, hope 402 have clear spec text for it.
12:58
<ryzokuken>
HE Shi-Jun: we're working out the exact details for this
12:58
<ryzokuken>
check Frank's recent proposal for this
12:58
<rbuckton>
like, I don't think that would pass the TG1 review
Yeah, I'd lean towards something like a .getCalendarField("era"), etc. instead, so that the shape remains stable.
12:59
<HE Shi-Jun>
Yeah, I'd lean towards something like a .getCalendarField("era"), etc. instead, so that the shape remains stable.
stable, but not very ergonomics 😅
12:59
<bakkot>
in fairness getting the era is not a particularly common operation
12:59
<bakkot>
i expect, anyway
13:00
<rbuckton>
stable, but not very ergonomics 😅
True, but it also avoids needing to add more properties in the future that are potentially unused based on the locale/calendar in use.
13:00
<Michael Ficarra>
interesting, is era ever placed anywhere other than the end of the date?
13:01
<rbuckton>
It also could be .calendarData.era, where .calendarData is spec'd as a getter that just returns an empty object by default.
13:01
<shu>
interesting, is era ever placed anywhere other than the end of the date?
is stardate real
13:01
<HE Shi-Jun>
True, but it also avoids needing to add more properties in the future that are potentially unused based on the locale/calendar in use.
I agree. I just think the original idea to add era is for ergonomics.
13:04
<Richard Gibson>
hm, perhaps I misunderstood something thing. Richard Gibson could you clarify?
my understanding of the conclusion is a general self-imposed constraint to not extend ECMA-262 intrinsics in ECMA-402 without an indication of such within ECMA-262. For Temporal.….prototype specifically, I think it will take the form of text like "An ECMAScript implementation that includes the ECMA-402 Internationalization API may provide additional properties of the <type> prototype object as defined in the ECMA-402 specification.".
13:04
<Andreu Botella>
I wonder whether hiding the era name if it matches the current era by default would work well with the Japanese calendar
13:06
<Michael Ficarra>
Andreu Botella: I didn't think Japanese era provided any kind of disambiguation like gregorian era
13:08
<rkirsling>
era can't be omitted just because it's current, if I understood the idea correctly
13:08
<rkirsling>
like the current year is either 2022 or R4, but not "4"
13:36
<sffc>
rkirsling: can you post your experience here on https://github.com/tc39/proposal-intl-eradisplay/issues?
13:39
<msaboff>
@shu Did V8 implement RAB.transfer() returning a fixed array?
13:40
<shu>
msaboff: we did, but not shipped
13:41
<shu>
the only implementation that shipped AFAIK is Moddable, and they are supportive of changing the behavior to preserve resizability
13:42
<shu>
msaboff: further, very recently we split out transfer to be gated by its own feature flag in anticipation of this change
13:44
<msaboff>
shu: Our implementation is only available in STP. We'll retract .transfer() before shipping to customers awaiting a resolution.
13:44
<shu>
msaboff: tyvm
13:48
<rkirsling>
rkirsling: can you post your experience here on https://github.com/tc39/proposal-intl-eradisplay/issues?
er can I add it to #7? seems to be the relevant thing, probably
14:00
<rkirsling>
lack of fast paths for ISO8601 calendar has been a huge pain point as a Temporal implementer so I'm excited to see this progress
14:09
<pipobscure>
lack of fast paths for ISO8601 calendar has been a huge pain point as a Temporal implementer so I'm excited to see this progress
You have been heard 😀
14:10
<rkirsling>
sorry if any of my comments have come off as more annoyed than justifiable
14:11
<pipobscure>
No!!!! They are exactly what we want and need!
14:11
<rkirsling>
I'm certainly not upset with the champion group though I did get pretty frustrated while implementing stuff recently
14:12
<pipobscure>
It’s exactly what we need to ever get to “ready to ship”. Also without implementors, nothing ever gets done. So pick up a beer (for any value of beer) from me at your earliest convenience.
14:12
<rkirsling>
I will also be hugely excited to actually ship this thing
14:13
<pipobscure>
If we could get it done for the Seattle meeting next year, we should have cake and a party 😀
14:13
<pipobscure>
(It would be easy to get veterans there. Elsewhere it would require more effort)
14:14
<Michael Ficarra>
landing in smaller parts would be SO nice!
14:15
<Michael Ficarra>
it's probably a lot of work for the champions though 🙁
14:15
<ryzokuken>
throwback to that time when frank pointed out that the temporal proposal is larger than the entire 402 spec 😅
14:21
<rkirsling>
rkirsling: Your feedback about the japanese calendar behavior would be best in its own issue; thanks!
oh okay, I just didn't actually follow the context properly so I posed it as a comment against the topic of that issue
14:37
<Michael Ficarra>
I like this new trend of RangeErrors instead of silent conversion to 0/NaN and things like that
14:38
<rkirsling>
the "silence is golden" era of JS appears to be well past
14:39
<Michael Ficarra>
good riddance
14:39
<Richard Gibson>
henceforth, silence is considered radioactive
14:42
<Andreu Botella>
could you have times before the Big Bang?
14:45
<rkirsling>
yes but they're all undefined
14:45
<ryzokuken>
depends, which calendar? 😛
14:45
<Andreu Botella>
instants
14:49
<Christian Ulbrich>
As a developer I strongly support yearOfWeek, to me it is pretty obvious that having this sugar method not in the API would then warrant additional libs, that Temporal actually wants to replace.
14:50
<rkirsling>
that's a fair statement
14:50
<rkirsling>
also like
14:51
<rkirsling>
being clear that we're not close to done with impls shouldn't be taken as more negative that it is
14:51
<rkirsling>
this is a huge spec
14:51
<rkirsling>
but it is a beautiful feature
14:51
<rkirsling>
and it takes a ton of time
14:51
<rkirsling>
but it will be worth it
14:52
<Christian Ulbrich>
I think so too. I am looking forward to it!
14:52
<bakkot>
I understand Frank's frustration, but I disagree; it is more important to get things right than to minimize changes in stage 3
14:52
<bakkot>
ideally we wouldn't go to stage 3 unless there were no further changes to be made but this proposal was genuinely too large for that to happen
14:53
<rkirsling>
absolutely
14:53
<rkirsling>
this proposal is equivalent to shipping all of Intl in one fell swoop
14:53
<ryzokuken>
if not more 🙈
14:54
<shu>
bakkot: i don't think frank is saying to optimize for minimizing changes in stage 3, it's to do it before stage 3
14:55
<shu>
this is why i want a postmortem, i think our process cannot handle this level of project well
14:55
<rkirsling>
I agree with that—that our process is not designed for this
14:55
<rkirsling>
but I don't agree that we've misused the process that we have
14:56
<shu>
enough non-technical incentives caused it to advance to stage 3 to keep momentum to get implementers in the loop, so on and so forth
14:56
<rkirsling>
implementer feedback is just such a massive force
14:56
<rkirsling>
that's true even in the smallest proposal, it's just that the total time and effort isn't that great
14:56
<bakkot>
my understanding is that most of the changes which have been made were a result of implementation feedback, with a few others being a result of user feedback once people started actually treating the library as being close enough to done to be worth worrying about
14:57
<bakkot>
and I'm not really sure how to start getting either kind of feedback without calling it stage 3, or something functionally equivalent (module ready-to-ship bit)
14:58
<shu>
there are alternative ways to do standards development that aren't our staging model of "design up front, then throw over to implementers to get feedback"
14:58
<shu>
there are tradeoffs, of course
14:58
<rkirsling>
yes
14:58
<bakkot>
I mean the assumption is that implementers are giving feedback during design as well
14:58
<rkirsling>
we should discuss that and arguably we should've discussed it more in preparation for Temporal
14:58
<ryzokuken>
I don't understand, changes based on implementer and user feedback is literally the definition of Stage 3
14:58
<shu>
if it were a "normal" software project you'd have a much tighter feedback loop from the implementers and maybe even users at the start
14:59
<shu>
right, but the point here is culturally, stage 3 is a "throw it over the wall" point
14:59
<shu>
we give feedback during stage 3
14:59
<shu>
but the culture is not (and shouldn't be, by default) to try to implement for real before then
14:59
<shu>
we give feedback based on our experience and best guesses before stage 3, which is often wrong
15:00
<rkirsling>
I feel like all feedback is shades of educated guesswork until you try implementing the thing 😅
15:00
<rbuckton>
This goes more to the postponed discussion on "ready to ship", but several years ago we had a discussion about the meanings of Stage 3 and Stage 4. Prior to that discussion, my impression was that Stage 3 was a time for implementers to implement the proposal and provide feedback, and that Stage 4 meant "ok this is ready to ship". However, in that discussion it was put forth that "Stage 3 means shipping", which somewhat lessened the impact of Stage 4, leaving very little room for handling implementation feedback within the staging process.
15:01
<shu>
right, which, i don't think any of us disagree on, was needed earlier for proposals of the scale of temporal
15:01
<shu>
pointing to "this is what stage 3 is defined as" is missing the point. we define our own working mode...
15:02
<shu>
i see this as echoes of the failure mode of ES6, which was a much bigger failure of "design and throw over the wall to implementers"
15:02
<rkirsling>
at least we're sure to not end up with another TCO though
15:02
<rkirsling>
er PTC, whatever
15:03
<shu>
to me the root thing to address is to move away from the "design up front" culture for proposals like temporal
15:03
<rkirsling>
agile shu
15:04
<shu>
the tradeoff is that, then, big ambitious things might never happen because it's even harder to convince implementers to put in the time before designing has been done
15:04
<rbuckton>
I'm not entirely sure an agile Temporal design would have been coherent, though I could see a more layered approach working.
15:05
<bakkot>
the vast majority of the proposal design work hasn't changed
15:05
<bakkot>
it's mostly details about how you read options bags and stuff
15:06
<shu>
pretty sure frank would disagree with that characterization
15:07
<rkirsling>
look
15:07
<rkirsling>
I myself got sufficiently angry (not at anyone! just emotional state) while doing Temporal impl work
15:08
<rkirsling>
but
15:08
<rkirsling>
I can't claim that somebody did something wrong or in bad faith or anything
15:08
<rkirsling>
it's just a BIG thing.
15:10
<rbuckton>
The issues we're seeing with temporal now are only the result of really digging in to the implementation, and many proposals don't get that kind of feedback until they are well into Stage 3.
15:17
<shu>
but like it's our choice to not give that kind of feedback until well into stage 3, because we don't really dig into implementation until well into stage 3
15:18
<shu>
but we could maybe just... do something else for proposals that we know will frustrate if we wait till well into stage 3 to do that, and for which we're all already convinced should happen?
15:26
<rkirsling>
my point is merely that like
15:26
<rkirsling>
I don't think it's an issue with existing stage definitions
15:27
<rkirsling>
the process doesn't really make any accommodations for a proposal of this size, but
15:27
<shu>
i think i agree? to the extent i don't think we need to change the existing staging process for the vast majority of proposals
15:27
<rkirsling>
I don't exactly know what that implies wrt what "should have happened"
15:28
<shu>
oh, nothing
15:29
<shu>
there is no lamenting in what i'm saying
15:29
<shu>
just thinking about what to do next time
17:51
<ljharb>
what is in igalia's CoC that isn't covered by ours? that seems important to highlight broadly
17:56
<ljharb>
we still wouldn't have builtin modules; that's stalled for many other reasons
18:09
<ljharb>
can someone elaborate on what "narrow yes" means re 402/262?
18:10
<nicolo-ribaudo>
We clarified that at the end of the meeting, if you haven't read that part of the notes yet
18:31
<littledan>
but we could maybe just... do something else for proposals that we know will frustrate if we wait till well into stage 3 to do that, and for which we're all already convinced should happen?
I don't really know what champions should do to get the committee to review proposals in more detail before everyone agrees to Stage 3. This is the core challenge. Apparently talking about the proposal in committee frequently, having regular open meetings outside of plenary, and documenting design processes in detail on GitHub are insufficient to attract sufficiently detailed review before everyone agrees to Stage 3, knowing that Stage 3 implies stability and implementation. This is totally understandable since everyone is busy; it just means that things will come up during implementation, requiring iteration.
18:32
<littledan>
it's not like Temporal went to Stage 3 quickly
18:58
<ljharb>
nicolo-ribaudo: ok so if i'm reading it right, it's that anything specified in 262 can't be modified unless there's an explicit note about it?
19:01
<nicolo-ribaudo>
Nothing can be modified by 402 unless there is the note, or at least that's my understanding
19:03
<ljharb>
ah ok, gotcha
19:04
<ljharb>
to be fair, there was a lot of pressure for it to go to stage 3 without a long stretch of time passing without normative changes
20:09
<littledan>
ljharb: You've suggested this sort of waiting period for stability idea before, but I'm not sure if it would've helped in Temporal's case. The changes were driven by things discovered later, mostly based on implementation experience. Maybe we could make an agenda item in a future meeting if you have an idea for when champions should wait for what sort of stretch of time before proposing advancement?
20:11
<littledan>
I'm not at all opposed to the idea in principle, especially for Stage 3, but I think it should be laid out in advance as guidance for champions, rather than only a critique afterwards
20:14
<littledan>
do we think a waiting period would motivate people to do more detailed reviews before Stage 3?
20:41
<ljharb>
in general i'm not really sure. there's very few proposals where this is ever a problem in practice - temporal is a bit of an anomaly
20:44
<Kris Kowal>
in general i'm not really sure. there's very few proposals where this is ever a problem in practice - temporal is a bit of an anomaly
“temporal anomaly” sounds about right. it did disrupt the spacetime continuum.