immutable-sorted icon indicating copy to clipboard operation
immutable-sorted copied to clipboard

Feature request: get-and-delete operation for SortedMap

Open abonander opened this issue 7 years ago • 3 comments
trafficstars

I just today realized that Immutable.js doesn't provide an operation for this, though I really only need it for SortedMap. I would like a method on SortedMap that removes and returns the value under the given key as well as the updated map. In Flow the function prototype is straightforward:

getAndDelete(key: K): [?V, SortedMap<K, V>] {}

let [val, map] = map.getAndDelete('key');

Apparently in Immutable.js this can be done by returning null from the closure passed to Collection.update() (though this is undocumented) but SortedMap doesn't appear to support this; it just updates the value as null. I know this can be done with get() then delete() but I'd like to avoid the redundant lookup if possible.

abonander avatar Mar 06 '18 17:03 abonander

Thank you for your suggestion, this would would definitely be more efficient than two separate calls. It would be nice to have it implemented across all the collections (List, Set, Map, OrderedSet, OrderedMap, SortedSet, SortedMap)

Please note, the get function includes optional notSetValue argument to distinguish the missing key in the map from the key having unusual values like null, undefined, {}, etc.:

get<NSV>(key: K, notSetValue: NSV): V | NSV;

Would it make sense to include this additional argument into getAndDelete()?

applitopia avatar Mar 06 '18 21:03 applitopia

Would it make sense to include this additional argument into getAndDelete()?

It certainly wouldn't hurt though returning any falsey value is sufficient for my use-case. I'm not sure how default parameters interact with type parameters, though; is this valid syntax?

getAndDelete<NSV = ?V>(key: K, notSetValue: NSV = null): V | NSV {}

abonander avatar Mar 06 '18 21:03 abonander

As for merging it upstream, I figure it would be easier to prototype here first before proposing it for Immutable.js. Implementing it on SortedMap would be enough for me either way.

abonander avatar Mar 06 '18 21:03 abonander