diff options
author | danbst <abcz2.uprola@gmail.com> | 2019-07-14 13:17:49 +0300 |
---|---|---|
committer | danbst <abcz2.uprola@gmail.com> | 2019-07-14 13:29:58 +0300 |
commit | 69920dafbffcd757acff23f659263ec4b952a017 (patch) | |
tree | 4390925c6087d284c11183193044835152f6cea5 /lib | |
parent | 696767a9c9dc4b6b5066a3172c89138c0bb6e40d (diff) |
lib: introduce `foreach` = flip map
The main purpose is to bring attention to `flip map`, which improves code readablity. It is useful when ad-hoc anonymous function grows two or more lines in `map` application: ``` map (lcfg: let port = lcfg.port; portStr = if port != defaultPort then ":${toString port}" else ""; scheme = if cfg.enableSSL then "https" else "http"; in "${scheme}://cfg.hostName${portStr}" ) (getListen cfg); ``` Compare this to `foreach`-style: ``` foreach (getListen cfg) (lcfg: let port = lcfg.port; portStr = if port != defaultPort then ":${toString port}" else ""; scheme = if cfg.enableSSL then "https" else "http"; in "${scheme}://cfg.hostName${portStr}" ); ``` This is similar to Haskell's `for` (http://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Traversable.html#v:for)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/default.nix | 2 | ||||
-rw-r--r-- | lib/lists.nix | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/lib/default.nix b/lib/default.nix index 3efaaf0f8f9e9..f876c57e25c88 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -71,7 +71,7 @@ let zipAttrsWithNames zipAttrsWith zipAttrs recursiveUpdateUntil recursiveUpdate matchAttrs overrideExisting getOutput getBin getLib getDev chooseDevOutputs zipWithNames zip; - inherit (lists) singleton foldr fold foldl foldl' imap0 imap1 + inherit (lists) singleton foreach foldr fold foldl foldl' imap0 imap1 concatMap flatten remove findSingle findFirst any all count optional optionals toList range partition zipListsWith zipLists reverseList listDfs toposort sort naturalSort compareLists take diff --git a/lib/lists.nix b/lib/lists.nix index 30d87ece66412..f9953720ee104 100644 --- a/lib/lists.nix +++ b/lib/lists.nix @@ -21,6 +21,19 @@ rec { */ singleton = x: [x]; + /* Apply the function to each element in the list. Same as `map`, but arguments + flipped. + + Type: foreach :: [a] -> (a -> b) -> [b] + + Example: + foreach [ 1 2 ] (x: + toString x + ) + => [ "1" "2" ] + */ + foreach = xs: f: map f xs; + /* “right fold” a binary function `op` between successive elements of `list` with `nul' as the starting value, i.e., `foldr op nul [x_1 x_2 ... x_n] == op x_1 (op x_2 ... (op x_n nul))`. |