lib.lists.replaceElemAt: init (#477775)

This commit is contained in:
Johannes Kirschbauer 2026-01-22 15:58:28 +00:00 committed by GitHub
commit 04c56b7e59
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 51 additions and 0 deletions

View file

@ -295,6 +295,7 @@ let
elemAt
isList
concatAttrValues
replaceElemAt
;
inherit (self.strings)
concatStrings

View file

@ -2019,4 +2019,41 @@ rec {
:::
*/
concatAttrValues = set: concatLists (attrValues set);
/**
Replaces a list's nth element with a new element
# Inputs
`list`
: Input list
`idx`
: index to replace
`newElem`
: new element to replace with
# Type
```
replaceElemAt :: [a] -> int - b -> [a]
```
# Examples
:::{.example}
## `replaceElemAt` usage example
```nix
lib.replaceElemAt` [1 2 3] 0 "a"
=> ["a" 2 3]
```
:::
*/
replaceElemAt =
list: idx: newElem:
assert lib.assertMsg (idx >= 0 && idx < length list)
"'lists.replaceElemAt' called with index ${toString idx} on a list of size ${toString (length list)}";
genList (i: if i == idx then newElem else elemAt list i) (length list);
}

View file

@ -4909,4 +4909,17 @@ runTests {
targetTarget = "prefix-tt";
};
};
testReplaceElemAt = {
expr = lib.replaceElemAt [ 1 2 3 ] 1 "a";
expected = [
1
"a"
3
];
};
testReplaceElemAtOutOfRange = testingThrow (lib.replaceElemAt [ 1 2 3 ] 5 "a");
testReplaceElemAtNegative = testingThrow (lib.replaceElemAt [ 1 2 3 ] (-1) "a");
}