Open
Description
Following the discussion about immutable defaults in https://forum.rescript-lang.org/t/ann-rescript-core-a-new-batteries-included-drop-in-standard-library/4149, let's discuss which API:s are problematic and what we can do to remedy that.
First off, there's a few things we need to keep in mind in this discussion:
- A goal is to stay close to the JS API:s (deliberately not saying "as close as possible", but close). This means we have wiggle room to brush over inconsistencies and "improve" the JS API:s we bind to so they make more sense for idiomatic ReScript usage, where it makes sense. But a complete overhaul of API:s isn't something we'll pursue for
Core
. Not everyone is going to agree with this, and that's fine. But that's the way forward forCore
. - For full immutability,
Belt
is still a great alternative, andBelt
isn't going anywhere, it'll keep being around.
With that said, providing immutable defaults where it makes sense is definitively a good idea. So, let's detail what API:s are problematic right now. Please write down the API:s with mutability you worry about, and we'll discuss what we can do about it, if anything.
Let's also discuss what we can do about the mutable API:s to make it apparent that they're mutable. A few things come to mind:
- Return
unit
always, even if the underlying JS API returns itself mutated. One example for this isMap.set
which mutates and returns itself. This would returnunit
instead to signify that it's mutating. - Naming. This is already the case, suffixing functions mutating the original thing with
inPlace
. We can check that that's consistent. - Doc strings. Have a bolded
**This mutates the original array**
on top of each doc string, plus suggesting the immutable alternative. This will make it very apparent that you're using a mutable API as you're working in your editor.
Metadata
Metadata
Assignees
Labels
No labels