diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2022-03-24 14:02:58 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-24 14:02:58 +0100 |
commit | d67fe90375132848c601cd579b6242493dbfeb89 (patch) | |
tree | 17b6d926f80b124e605c0471a4b1918f147f4a0f /src/libexpr | |
parent | 97734fea1b94d03a6ef00ae5bf8adf38013a96ba (diff) | |
parent | 0736f3651d56d3e0c3b742fe0d90958c90e9c968 (diff) |
Merge pull request #6305 from flox/genericClosure_doc
docs: genericClosure
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/primops.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 2d16a8d7a..f5d9aa9ae 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -694,7 +694,32 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar static RegisterPrimOp primop_genericClosure(RegisterPrimOp::Info { .name = "__genericClosure", + .args = {"attrset"}, .arity = 1, + .doc = R"( + Take an *attrset* with values named `startSet` and `operator` in order to + return a *list of attrsets* by starting with the `startSet`, recursively + applying the `operator` function to each element. The *attrsets* in the + `startSet` and produced by the `operator` must each contain value named + `key` which are comparable to each other. The result is produced by + repeatedly calling the operator for each element encountered with a + unique key, terminating when no new elements are produced. For example, + + ``` + builtins.genericClosure { + startSet = [ {key = 5;} ]; + operator = item: [{ + key = if (item.key / 2 ) * 2 == item.key + then item.key / 2 + else 3 * item.key + 1; + }]; + } + ``` + evaluates to + ``` + [ { key = 5; } { key = 16; } { key = 8; } { key = 4; } { key = 2; } { key = 1; } ] + ``` + )", .fun = prim_genericClosure, }); |