# manual-retain

Prefer retain over replacing an owned array with its filtered result

Assigning an owned array's filtered result back to the same place allocates replacement storage.
Instead, you SHOULD call `retain` to remove rejected elements from the owned array in place.

- Category: performance
- Level: warning
- Fix: suggestion
- Scope: module

## Reported

```ds title="main.ds"
function keepPositive(input: ^int32[]): ^int32[] {
    let values = input;
    values = values.filter((value) => value > 0);
    return values;
}
```

## Accepted

```ds title="main.ds"
function keepPositive(input: ^int32[]): ^int32[] {
    let values = input;
    values.retain((value) => value > 0);
    return values;
}
```

## Prior art

- [Clippy · manual_retain](https://rust-lang.github.io/rust-clippy/master/index.html#manual_retain)

[language/linter/src/rules/performance/manual_retain.rs:8](https://github.com/destack-sh/destack/blob/main/language/linter/src/rules/performance/manual_retain.rs#L8)
