* New functions: id, any, all, same as in Haskell.
* Function `sourceFilesBySuffices' to import all files matching given extensions in a directory. svn path=/nixpkgs/trunk/; revision=10072
This commit is contained in:
parent
7a3501953c
commit
8c615616c7
|
@ -9,6 +9,12 @@ in
|
||||||
|
|
||||||
rec {
|
rec {
|
||||||
|
|
||||||
|
|
||||||
|
# Identity function.
|
||||||
|
id = x: x;
|
||||||
|
|
||||||
|
|
||||||
|
# !!! need documentation...
|
||||||
innerSumArgs = f : x : y : (if y == null then (f x)
|
innerSumArgs = f : x : y : (if y == null then (f x)
|
||||||
else (innerSumArgs f (x // y)));
|
else (innerSumArgs f (x // y)));
|
||||||
sumArgs = f : innerSumArgs f {};
|
sumArgs = f : innerSumArgs f {};
|
||||||
|
@ -19,6 +25,7 @@ rec {
|
||||||
f (tail (tail l));
|
f (tail (tail l));
|
||||||
pairMap = innerPairMap [];
|
pairMap = innerPairMap [];
|
||||||
|
|
||||||
|
|
||||||
# "Fold" a binary function `op' between successive elements of
|
# "Fold" a binary function `op' between successive elements of
|
||||||
# `list' with `nul' as the starting value, i.e., `fold op nul [x_1
|
# `list' with `nul' as the starting value, i.e., `fold op nul [x_1
|
||||||
# x_2 ... x_n] == op x_1 (op x_2 ... (op x_n nul))'. (This is
|
# x_2 ... x_n] == op x_1 (op x_2 ... (op x_n nul))'. (This is
|
||||||
|
@ -65,14 +72,12 @@ rec {
|
||||||
# "y"] applied to some set e returns e.x.y, if it exists. The
|
# "y"] applied to some set e returns e.x.y, if it exists. The
|
||||||
# default value is returned otherwise.
|
# default value is returned otherwise.
|
||||||
getAttr = attrPath: default: e:
|
getAttr = attrPath: default: e:
|
||||||
let {
|
let attr = head attrPath;
|
||||||
attr = head attrPath;
|
in
|
||||||
body =
|
if attrPath == [] then e
|
||||||
if attrPath == [] then e
|
else if builtins ? hasAttr && builtins.hasAttr attr e
|
||||||
else if builtins ? hasAttr && builtins.hasAttr attr e
|
then getAttr (tail attrPath) default (builtins.getAttr attr e)
|
||||||
then getAttr (tail attrPath) default (builtins.getAttr attr e)
|
else default;
|
||||||
else default;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
# Filter a list using a predicate; that is, return a list containing
|
# Filter a list using a predicate; that is, return a list containing
|
||||||
|
@ -95,15 +100,33 @@ rec {
|
||||||
else head found;
|
else head found;
|
||||||
|
|
||||||
|
|
||||||
|
# Return true iff function `pred' returns true for at least element
|
||||||
|
# of `list'.
|
||||||
|
any = pred: list:
|
||||||
|
if list == [] then false
|
||||||
|
else if pred (head list) then true
|
||||||
|
else any pred (tail list);
|
||||||
|
|
||||||
|
|
||||||
|
# Return true iff function `pred' returns true for all elements of
|
||||||
|
# `list'.
|
||||||
|
all = pred: list:
|
||||||
|
if list == [] then true
|
||||||
|
else if pred (head list) then all pred (tail list)
|
||||||
|
else false;
|
||||||
|
|
||||||
|
|
||||||
# Return true if each element of a list is equal, false otherwise.
|
# Return true if each element of a list is equal, false otherwise.
|
||||||
eqLists = xs: ys:
|
eqLists = xs: ys:
|
||||||
if xs == [] && ys == [] then true
|
if xs == [] && ys == [] then true
|
||||||
else if xs == [] || ys == [] then false
|
else if xs == [] || ys == [] then false
|
||||||
else head xs == head ys && eqLists (tail xs) (tail ys);
|
else head xs == head ys && eqLists (tail xs) (tail ys);
|
||||||
|
|
||||||
|
|
||||||
# Workaround, but works in stable Nix now.
|
# Workaround, but works in stable Nix now.
|
||||||
eqStrings = a: b: (a+(substring 0 0 b)) == ((substring 0 0 a)+b);
|
eqStrings = a: b: (a+(substring 0 0 b)) == ((substring 0 0 a)+b);
|
||||||
|
|
||||||
|
|
||||||
# Determine whether a filename ends in the given suffix.
|
# Determine whether a filename ends in the given suffix.
|
||||||
hasSuffix = ext: fileName:
|
hasSuffix = ext: fileName:
|
||||||
let lenFileName = stringLength fileName;
|
let lenFileName = stringLength fileName;
|
||||||
|
@ -125,6 +148,15 @@ rec {
|
||||||
in src: builtins.filterSource filter src;
|
in src: builtins.filterSource filter src;
|
||||||
|
|
||||||
|
|
||||||
|
# Get all files ending with the specified suffices from the given
|
||||||
|
# directory. E.g. `sourceFilesBySuffices ./dir [".xml" ".c"]'.
|
||||||
|
sourceFilesBySuffices = path: exts:
|
||||||
|
let filter = name: type:
|
||||||
|
let base = baseNameOf (toString name);
|
||||||
|
in type != "directory" && any (ext: hasSuffix ext base) exts;
|
||||||
|
in builtins.filterSource filter path;
|
||||||
|
|
||||||
|
|
||||||
# Return a singleton list or an empty list, depending on a boolean
|
# Return a singleton list or an empty list, depending on a boolean
|
||||||
# value. Useful when building lists with optional elements
|
# value. Useful when building lists with optional elements
|
||||||
# (e.g. `++ optional (system == "i686-linux") flashplayer').
|
# (e.g. `++ optional (system == "i686-linux") flashplayer').
|
||||||
|
|
Loading…
Reference in a new issue