removeAttrs
lib.removeAttrs
Primop
Docs pulled from | This Revision | about 1 hour ago
Nix manual
Takes 2 arguments
set, list
Remove the attributes listed in list from set. The attributes don’t have to exist in set. For instance,
removeAttrs { x = 1; y = 2; z = 3; } [ "a" "x" "z" ]
evaluates to { y = 2; }.
Time Complexity
O(n + k log k) where:
n = number of attributes in input set k = number of attribute names to remove
Noogle detected
Detected Type
removeAttrs :: AttrSet -> [String] -> AttrSet
Implementation
This function is implemented in c++ and is part of the native nix runtime.
static void prim_removeAttrs(EvalState & state, const PosIdx pos, Value ** args, Value & v)
{
state.forceAttrs(*args[0], pos, "while evaluating the first argument passed to builtins.removeAttrs");
state.forceList(*args[1], pos, "while evaluating the second argument passed to builtins.removeAttrs");
/* Get the attribute names to be removed.
We keep them as Attrs instead of Symbols so std::set_difference
can be used to remove them from attrs[0]. */
// 64: large enough to fit the attributes of a derivation
boost::container::small_vector<Attr, 64> names;
names.reserve(args[1]->listSize());
for (auto elem : args[1]->listView()) {
state.forceStringNoCtx(
*elem, pos, "while evaluating the values of the second argument passed to builtins.removeAttrs");
names.emplace_back(state.symbols.create(elem->string_view()), nullptr);
}
std::sort(names.begin(), names.end());
/* Copy all attributes not in that set. Note that we don't need
to sort v.attrs because it's a subset of an already sorted
vector. */
auto attrs = state.buildBindings(args[0]->attrs()->size());
std::set_difference(
args[0]->attrs()->begin(), args[0]->attrs()->end(), names.begin(), names.end(), std::back_inserter(attrs));
v.mkAttrs(attrs.alreadySorted());
}