2013-02-01 09:39:26 +04:00
|
|
|
with {
|
|
|
|
inherit (import ./lists.nix) deepSeqList;
|
|
|
|
inherit (import ./attrsets.nix) deepSeqAttrs;
|
|
|
|
};
|
|
|
|
|
2009-02-09 19:51:03 +03:00
|
|
|
rec {
|
|
|
|
|
|
|
|
# Identity function.
|
|
|
|
id = x: x;
|
|
|
|
|
|
|
|
# Constant function.
|
|
|
|
const = x: y: x;
|
|
|
|
|
|
|
|
# Named versions corresponding to some builtin operators.
|
|
|
|
concat = x: y: x ++ y;
|
|
|
|
or = x: y: x || y;
|
|
|
|
and = x: y: x && y;
|
2009-07-02 12:58:30 +04:00
|
|
|
mergeAttrs = x: y: x // y;
|
2013-11-12 16:48:19 +04:00
|
|
|
|
2009-02-09 19:51:03 +03:00
|
|
|
# Take a function and evaluate it with its own returned value.
|
|
|
|
fix = f: let result = f result; in result;
|
|
|
|
|
2009-10-23 11:34:56 +04:00
|
|
|
# Flip the order of the arguments of a binary function.
|
|
|
|
flip = f: a: b: f b a;
|
|
|
|
|
2010-08-19 16:37:10 +04:00
|
|
|
# `seq x y' evaluates x, then returns y. That is, it forces strict
|
|
|
|
# evaluation of its first argument.
|
|
|
|
seq = x: y: if x == null then y else y;
|
2013-11-12 16:48:19 +04:00
|
|
|
|
2013-02-04 16:20:14 +04:00
|
|
|
# Like `seq', but recurses into lists and attribute sets to force evaluation
|
|
|
|
# of all list elements/attributes.
|
2013-02-01 09:39:26 +04:00
|
|
|
deepSeq = x: y:
|
|
|
|
if builtins.isList x
|
|
|
|
then deepSeqList x y
|
|
|
|
else if builtins.isAttrs x
|
|
|
|
then deepSeqAttrs x y
|
|
|
|
else seq x y;
|
2013-11-12 16:48:19 +04:00
|
|
|
|
|
|
|
# Pull in some builtins not included elsewhere.
|
|
|
|
inherit (builtins)
|
|
|
|
pathExists readFile isBool isFunction
|
|
|
|
isInt add sub lessThan;
|
|
|
|
|
2009-02-09 19:51:03 +03:00
|
|
|
}
|