mirror of
https://github.com/NixOS/nix
synced 2025-06-29 14:53:16 +02:00
This is like builtins.{filterSource,path}, but returns a virtual path that applies the filter lazily, rather than copying the result to the Nix store. Thus filterPath can be composed.
63 lines
1.6 KiB
Nix
63 lines
1.6 KiB
Nix
with builtins;
|
|
|
|
rec {
|
|
|
|
fold = op: nul: list:
|
|
if list == []
|
|
then nul
|
|
else op (head list) (fold op nul (tail list));
|
|
|
|
concat =
|
|
fold (x: y: x + y) "";
|
|
|
|
and = fold (x: y: x && y) true;
|
|
|
|
flatten = x:
|
|
if isList x
|
|
then fold (x: y: (flatten x) ++ y) [] x
|
|
else [x];
|
|
|
|
sum = foldl' (x: y: add x y) 0;
|
|
|
|
hasPrefix = pref: str: substring 0 (stringLength pref) str == pref;
|
|
|
|
hasSuffix = ext: fileName:
|
|
let lenFileName = stringLength fileName;
|
|
lenExt = stringLength ext;
|
|
in !(lessThan lenFileName lenExt) &&
|
|
substring (sub lenFileName lenExt) lenFileName fileName == ext;
|
|
|
|
# Split a list at the given position.
|
|
splitAt = pos: list:
|
|
if pos == 0 then {first = []; second = list;} else
|
|
if list == [] then {first = []; second = [];} else
|
|
let res = splitAt (sub pos 1) (tail list);
|
|
in {first = [(head list)] ++ res.first; second = res.second;};
|
|
|
|
# Stable merge sort.
|
|
sortBy = comp: list:
|
|
if lessThan 1 (length list)
|
|
then
|
|
let
|
|
split = splitAt (div (length list) 2) list;
|
|
first = sortBy comp split.first;
|
|
second = sortBy comp split.second;
|
|
in mergeLists comp first second
|
|
else list;
|
|
|
|
mergeLists = comp: list1: list2:
|
|
if list1 == [] then list2 else
|
|
if list2 == [] then list1 else
|
|
if comp (head list2) (head list1) then [(head list2)] ++ mergeLists comp list1 (tail list2) else
|
|
[(head list1)] ++ mergeLists comp (tail list1) list2;
|
|
|
|
id = x: x;
|
|
|
|
const = x: y: x;
|
|
|
|
range = first: last:
|
|
if first > last
|
|
then []
|
|
else genList (n: first + n) (last - first + 1);
|
|
|
|
}
|