8000 Feature request: Limit maximum size of Collection (e.g. LRUMap/LRUList) · Issue #806 · immutable-js/immutable-js · GitHub < 8000 link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">
[go: up one dir, main page]

Skip to content
Feature request: Limit maximum size of Collection (e.g. LRUMap/LRUList) #806
Closed
@avocadowastaken

Description

@avocadowastaken

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0