Commit Graph

59 Commits

Author SHA1 Message Date
Robert Hensing
afa6c51f27 lib: Use Nix's static scope checking, fix error message, optimize
Nix can perform static scope checking, but whenever code is inside
a `with` expression, the analysis breaks down, because it can't
know statically what's in the attribute set whose attributes were
brought into scope. In those cases, Nix has to assume that
everything works out.

Except it doesnt. Removing `with` from lib/ revealed an undefined
variable in an error message.

If that doesn't convince you that we're better off without `with`,
I can tell you that this PR results in a 3% evaluation performance
improvement because Nix can look up local variables by index.
This adds up with applications like the module system.

Furthermore, removing `with` makes the binding site of each
variable obvious, which helps with comprehension.
2020-10-22 13:46:47 +02:00
Drew Mullen
448d68c511 fix example for foldl 2020-05-08 08:31:27 -04:00
Frederik Rietdijk
66bc7fc1b3 Merge master into staging-next 2019-09-06 22:46:05 +02:00
Robert Hensing
a0b743f47c
Fix typo in lists.nix 2019-09-06 20:02:36 +02:00
Frederik Rietdijk
5061fe0c2c Merge staging-next into staging 2019-08-28 08:26:42 +02:00
volth
35d68ef143 treewide: remove redundant quotes 2019-08-26 21:40:19 +00:00
danbst
d0413360d3 rename foreach -> forEach 2019-08-05 14:06:20 +03:00
danbst
69920dafbf 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)
2019-07-14 13:29:58 +03:00
Léo Gaspard
8319ead594 lib: improve the implementation of the unique function 2019-04-12 20:08:29 +02:00
Matthias Beyer
3cf40fc794 lib: lists: Alias builtins.map
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Suggested-by: Profpatsch <mail@profpatsch.de>
2019-03-29 14:34:30 +01:00
Vincent Ambo
65f50a9bb0 lib/lists: Update documentation comments for doc generation
Updates documentation comments with extra information for nixdoc[1]
compatibility.

[1]: https://github.com/tazjin/nixdoc
2018-10-29 10:42:43 +01:00
Profpatsch
efdf618330 lib: move assertMsg and assertOneOf to their own library file
Since the `assertOneOf` uses `lib.generators`, they are not really trivial
anymore and should go into their own library file.
2018-09-06 18:14:27 +02:00
Profpatsch
3e45b61a99 lib/trivial: add a few examples of usage of assertMsg/assertOneOf 2018-09-06 18:14:27 +02:00
volth
87f5930c3f [bot]: remove unreferenced code 2018-07-20 18:48:37 +00:00
volth
e9a6c7cebb lib.concatMap and lib.mapAttrs to be builtins 2018-07-05 03:08:00 +00:00
volth
4e85c4ff27 lib: add groupBy (#38612) 2018-06-10 19:31:09 +02:00
volth
3f8c9106ea
lib: add naturalSort (move the example IPs to private space) 2018-04-08 13:54:39 +00:00
volth
25c2fd80b1 lib: add naturalSort 2018-04-08 13:18:13 +00:00
Graham Christensen
5aabf0fc34
Merge pull request #33898 from oxij/nixos/related-packages-v5
nixos: doc: implement related packages in the manual (again)
2018-02-09 20:36:27 -05:00
Jan Malakhovski
ee3220440d lib: implement compare, splitByAndCompare, and compareLists 2018-02-09 19:51:05 +00:00
symphorien
0146074560 nixos/tests: add predictable-interface-names.nix (#34305) 2018-02-09 18:40:39 +00:00
Graham Christensen
b5a61f2c59
Revert "nixos: doc: implement related packages in the manual" 2017-12-23 07:19:45 -05:00
Jan Malakhovski
bccab965b9 lib: implement compare, splitByAndCompare, and compareLists 2017-12-07 21:26:30 +00:00
Graham Christensen
152c63c9ff
Convert libs to a fixed-point
This does break the API of being able to import any lib file and get
its libs, however I'm not sure people did this.

I made this while exploring being able to swap out docFn with a stub
in #2305, to avoid functor performance problems. I don't know if that
is going to move forward (or if it is a problem or not,) but after
doing all this work figured I'd put it up anyway :)

Two notable advantages to this approach:

1. when a lib inherits another lib's functions, it doesn't
   automatically get put in to the scope of lib
2. when a lib implements a new obscure functions, it doesn't
   automatically get put in to the scope of lib

Using the test script (later in this commit) I got the following diff
on the API:

  + diff master fixed-lib
  11764a11765,11766
  > .types.defaultFunctor
  > .types.defaultTypeMerge
  11774a11777,11778
  > .types.isOptionType
  > .types.isType
  11781a11786
  > .types.mkOptionType
  11788a11794
  > .types.setType
  11795a11802
  > .types.types

This means that this commit _adds_ to the API, however I can't find a
way to fix these last remaining discrepancies. At least none are
_removed_.

Test script (run with nix-repl in the PATH):

  #!/bin/sh

  set -eux

  repl() {
      suff=${1:-}
      echo "(import ./lib)$suff" \
          | nix-repl 2>&1
  }

  attrs_to_check() {
      repl "${1:-}" \
          | tr ';'  $'\n' \
          | grep "\.\.\." \
          | cut -d' ' -f2 \
          | sed -e "s/^/${1:-}./" \
          | sort
  }

  summ() {
      repl "${1:-}" \
          | tr ' ' $'\n' \
          | sort \
          | uniq
  }

  deep_summ() {
      suff="${1:-}"
      depth="${2:-4}"
      depth=$((depth - 1))
      summ "$suff"

      for attr in $(attrs_to_check "$suff" | grep -v "types.types"); do
          if [ $depth -eq 0 ]; then
              summ "$attr" | sed -e "s/^/$attr./"
          else
              deep_summ "$attr" "$depth" | sed -e "s/^/$attr./"
          fi
      done
  }

  (
      cd nixpkgs

      #git add .
      #git commit -m "Auto-commit, sorry" || true
      git checkout fixed-lib
      deep_summ > ../fixed-lib
      git checkout master
      deep_summ > ../master
  )

  if diff master fixed-lib; then
      echo "SHALLOW MATCH!"
  fi

  (
      cd nixpkgs
      git checkout fixed-lib
      repl .types
  )
2017-09-16 21:36:43 -04:00
Vladimír Čunát
dfc004e69c lib.lists.mutuallyExclusive: add function 2017-07-07 12:02:29 -04:00
zimbatm
4d545297d8 lib: introduce imap0, imap1 (#25543)
* lib: introduce imap0, imap1

For historical reasons, imap starts counting at 1 and it's not
consistent with the rest of the lib.

So for now we split imap into imap0 that starts counting at zero and
imap1 that starts counting at 1. And imap is marked as deprecated.

See c71e2d4235 (commitcomment-21873221)

* replace uses of lib.imap

* lib: move imap to deprecated.nix
2017-07-04 23:29:23 +01:00
Tom Saeger
5989515b94 lib: trivial spelling fixes 2017-04-19 19:37:55 -05:00
Profpatsch
cb9ff8bfa7 lib/lists: rename fold to foldr & improve fold docs
In order to better distinguish foldr from foldl the default name is changed to
foldr, but fold is still a synonym.

Additionally the docs are improved and examples added.
2017-03-19 22:06:49 +01:00
Eelco Dolstra
822e1ddd89 Use builtins.partition if available 2016-08-29 17:50:06 +02:00
Jan Malakhovski
363b0fd040 lib: introduce listDfs and toposort, add example to hasPrefix 2016-08-23 17:48:13 +00:00
Domen Kožar
ebffa9fd06 flatten: drastically improve performance, see #17626 2016-08-10 12:02:58 +02:00
Eelco Dolstra
532211c68d Really remove library functions
Throwing a message like "removed 2016-02-29 because unused and broken"
is unhelpful because it doesn't show what function was removed.
2016-07-11 16:34:46 +02:00
zimbatm
bec28d748c Remove unecessary branching on old nix versions
All these builtins are available since 1.10 or earlier (1.10 being the
lib/minver.nix)
2016-06-17 11:06:48 +01:00
Domen Kožar
1ab408e1da lib.lists: fix fold example 2016-05-26 11:52:35 +01:00
zimbatm
c71e2d4235 lib/lists: document all functions 2016-03-10 12:31:05 +00:00
zimbatm
a086858ef5 Remove lib.deepSeqList and lib.deepSeqAttrs
Both functions are broken and unused in the repo.
2016-03-09 19:59:57 +00:00
Eelco Dolstra
395fdaef6c Use builtins.sort 2015-07-28 18:42:22 +02:00
Eelco Dolstra
5976d393fb Use builtins.genList
This fixes the quadratic complexity of functions like imap.
2015-07-28 18:42:22 +02:00
Eelco Dolstra
7c30ce9562 Remove zipTwoLists
This function is redundant (we also have zipLists).
2015-07-28 15:04:18 +02:00
Eelco Dolstra
447afef153 Use builtin all and any functions 2015-07-24 15:58:34 +02:00
Eelco Dolstra
637e35deb9 Use foldl' instead of fold in some places 2015-07-23 18:31:54 +02:00
Jaka Hudoklin
f953d77be2 Revert "Reverts a bunch of commits as a try to fix GC errors."
This reverts commit 1e4ba025c2.

Conflicts:
	pkgs/development/web/nodejs/build-node-package.nix
2015-03-21 17:49:37 +01:00
Domen Kožar
1e4ba025c2 Reverts a bunch of commits as a try to fix GC errors.
Commits

- 694f01db2d
- 829479d1dd
- bd81885f70
- b2fdcf801c
2015-03-17 08:55:03 +01:00
Eelco Dolstra
694f01db2d intersect -> intersectLists, subtract -> subtractLists 2015-03-04 22:15:46 +01:00
Eelco Dolstra
829479d1dd substract -> subtract 2015-03-04 22:15:45 +01:00
Jaka Hudoklin
ea13e2aa87 lib/lists: add intersect and substract functions 2015-02-28 04:02:15 +01:00
Ricardo M. Correia
1fea5866ae Add unique list function
It removes duplicate elements from a list.
2014-11-12 22:31:49 +01:00
Eelco Dolstra
6c2bf141cf lib: Use arithmetic operators rather than builtins.add etc. 2014-10-05 01:10:06 +02:00
Edward Tjörnhammar
2bbd01485a init list helper 2014-09-16 18:12:39 +02:00
Luca Bruno
9d5a06cfe7 gnome3: use package names for environment.gnome3.excludePackages 2014-04-14 09:58:03 +02:00