Closed
Description
I use List/Map collections in my Redux store, and have problem with maintaining map sizes (i need last 5-6 records only)
First attempt to resolve this problem was to create helper function:
static sliceMap(map, maxSize = 5) {
if (!ImmutableUtils.isImmutable(map)) {
return map;
}
if (map.size <= maxSize) {
return map;
}
return map.slice(map.size - maxSize);
}
And use it like
let newMap = ImmutableUtils.sliceMap(oldMap);
But It's not good solution for me, as i have to call this method every time when i need to mutate map
Second attempt was to create new class and extend it with map, override set
/setIn
, but super methods will always return new map instance, so it was just pointless
So the only solution that is see to create new collections like: LRUMap
, LRUList
and else inspired by https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/LRUMap.html
EDIT
Found final solution for my problem
let data = Immutable.OrderedMap(); data.toString();
// "OrderedMap {}" - we need OrderedMap (for ... you know ... ordering)
data = data.set(1, 1).set(2, 2).set(3, 3).set(4, 4).set(5, 5).set(6, 6).takeLast(5); data.toString();
// "OrderedMap { 2: 2, 3: 3, 4: 4, 5: 5, 6: 6 }" - look good enough
data = data.set(2, 3).takeLast(5); data.toString();
// "OrderedMap { 2: 3, 3: 3, 4: 4, 5: 5, 6: 6 }" - here we got problem, key '2' took it's previous position
data = data.delete(2).set(2, 3).takeLast(5); data.toString();
// "OrderedMap { 3: 3, 4: 4, 5: 5, 6: 6, 2: 3 }" - that's better
data = data.delete(3).set(3, 4).takeLast(5); data.toString();
// "OrderedMap { 4: 4, 5: 5, 6: 6, 2: 3, 3: 4 }" - yep
data = data.delete(7).set(7, 7).takeLast(5); data.toString();
// "OrderedMap { 5: 5, 6: 6, 2: 3, 3: 4, 7: 7 }" - finally
// working example
static handleFetchSuccess(state, {response, id}) {
return state
.update('dataLoading', item => item.delete(id))
.update('data', item => item.delete(id).set(id, fromJS(response)).takeLast(10));
}
Metadata
Metadata
Assignees
Labels
No labels