Add builtins.mapAttrs

Fixes #341
This commit is contained in:
Matthew Bauer 2018-08-09 18:22:35 -04:00
parent 266793a287
commit 10fe907c50
2 changed files with 19 additions and 0 deletions

View file

@ -231,6 +231,7 @@ builtinsList = sequence [
, add2 Normal "lessThan" lessThan
, add Normal "listToAttrs" listToAttrs
, add2 TopLevel "map" map_
, add2 TopLevel "mapAttrs" mapAttrs_
, add2 Normal "match" match_
, add2 Normal "mul" mul_
, add0 Normal "null" (return $ nvConstant NNull)
@ -566,6 +567,16 @@ map_ fun xs = fun >>= \f ->
. (f `callFunc`) . force')
<=< fromValue @[NThunk m] $ xs
mapAttrs_ :: forall e m. MonadNix e m
=> m (NValue m) -> m (NValue m) -> m (NValue m)
mapAttrs_ fun xs = fun >>= \f ->
fromValue @(AttrSet (NThunk m)) xs >>= \aset -> do
let pairs = M.toList aset
values <- traverse (thunk . withFrame Debug
(ErrorCall "While applying f in mapAttrs:\n")
. (f `callFunc`) . force') (map snd pairs)
toNix . M.fromList . zip (map fst pairs) $ values
filter_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
filter_ fun xs = fun >>= \f ->
toNix <=< filterM (fromValue <=< callFunc f . force')

View file

@ -328,6 +328,14 @@ case_rec_path_attr =
constantEqualText "10"
"let src = 10; x = rec { passthru.src = src; }; in x.passthru.src"
case_mapattrs_builtin =
constantEqualText' "{ a = 6; b = 7; }" [i|
(builtins.mapAttrs (x: x+5) {
a = 1;
b = 2;
})
|]
-----------------------
tests :: TestTree