# Dash NEWS -- history of user-visible changes

Copyright (C) 2012-2025 Free Software Foundation, Inc.

See the end of the file for license conditions.

## Change log

### From 2.19.1 to 2.20.0

#### Deprecations

- Calling `-zip` with two arguments now emits a warning.  This
  long-discouraged calling convention remains supported, but the
  caller is now referred to the equivalent `-zip-pair` instead (Stefan
  Monnier, #400).
- Calling `-zip-pair` with less than or more than two arguments is now
  deprecated, and can be replaced with the equivalent call to
  `-zip-lists` instead.

#### Fixes

- Fixed a regression from `2.18` in `-take` that caused it to
  prematurely signal an error on improper lists (#393).
- The function `-pad` can now be called with zero lists as arguments.
- The functions `-union`, `-intersection`, and `-difference` now
  return proper sets, without duplicate elements (#397).
- The functions `-same-items?` and `-permutations` now work on
  multisets (lists with duplicate elements) (#390, #397, #399).

  For example:

  ```el
  (-same-items? '(1 1 2 3) '(3 1 2)) ; => t
  (-permutations '(1 1 2)) ; => '((1 1 2) (1 2 1) (2 1 1))
  ```

- Several functions which are documented as returning a fresh, mutable
  object (such as a copy of one of their arguments) are no longer
  marked as `pure`.  Pure functions called with constant arguments are
  evaluated during byte-compilation; the resulting value is an
  immutable constant, and thus unsafe to modify destructively.  The
  functions in question are: `-clone`, `-cons*`, `-drop-last`,
  `-interleave`, `-interpose`, `-iota`, `-non-nil`, `-repeat`,
  `-slice`, `-snoc`, `-split-at`, `-take`, `-take-last`.

#### New features

- The function `-contains?` now returns the matching tail of the list
  instead of just `t`, similarly to `member` (#397).
- New function `-frequencies` that takes a list and counts how many
  times each distinct element occurs in it (suggested by @ebpa, #209,
  #214, #399).
- New functions `-zip-lists-fill` and `-unzip-lists` which are
  better-behaved versions of `-zip-fill` and `-unzip`, respectively
  (#400).

### From 2.19.0 to 2.19.1

#### Fixes

- Fixed a regression from `2.18` in `-is-suffix-p` which led to false
  negatives when parts of the suffix appeared multiple times in the
  list being searched (Bennett Rennier, #384).

### From 2.18.1 to 2.19.0

#### Fixes

- Reverted a breaking change introduced in `2.18.0` that caused the
  threading macro `-->` to be indented differently from `->` and `->>`
  (#375).
- Added and fixed Edebug specifications for many Dash macros (Philipp
  Stephani, #380, #381).

#### New features

- The combinators `-on`, `-flip`, `-not`, `-andfn`, and `-orfn` now
  return variadic functions that take any number of arguments (#308).
- New combinator `-rotate-args` similar to `-flip`, but for arbitrary
  arglist rotations (suggested by @vapniks, #72).
- New function `-every` and its anaphoric macro counterpart `--every`.
  They are like the existing `-every-p` and `--every-p`, respectively,
  but return the last non-`nil` result instead of just `t`.
- New macro `--partition-after-pred` which affords
  `-partition-after-pred` better performance (Per Weijnitz, #362).

### From 2.18.0 to 2.18.1

- Fixed a regression from `2.17` as well as a long-standing bug in
  `--iterate`, which evaluated its arguments one too many times.  This
  in turn could lead to errors in `-flatten-n` when it tried
  flattening certain structures too far (#373).

### From 2.17 to 2.18

This release absorbs the now obsolete `dash-functional` version
`1.3.0` into `dash`, and brings the very old version of `dash` on GNU
ELPA up to date.

Package maintainers should replace all uses of `dash-functional`,
which will eventually be deleted, with `dash` version `2.18.0`.  For
more information on this, see:
https://github.com/magnars/dash.el/wiki/Obsoletion-of-dash-functional.el

- New function `-iota` for generating arithmetic sequences
  (@holomorph, #215).

- Calling `-list` with more than one argument is now deprecated.

- `-lambda` now accepts an empty argument list.

- New anaphoric macros `--reductions-from`, `--reductions`,
  `--reductions-r-from`, and `--reductions-r` corresponding to the
  analogous non-anaphoric functions.

- `-doto` threading now works as with `->`.

- New buffer-local minor mode `dash-fontify-mode` and globalized
  counterpart `global-dash-fontify-mode` for fontifying special Dash
  variables such as `it`, `it-index`, `acc`, etc.  The minor mode also
  fontifies calls to Dash macros in older Emacs versions which did not
  dynamically detect macro calls.

  This obsoletes the user option `dash-enable-fontlock` and the
  function `dash-enable-font-lock`, which is now an alias of
  `global-dash-fontify-mode`.

- New command `dash-register-info-lookup` for integration with `C-h S`
  (`info-lookup-symbol`).  This command allows Dash symbols to be
  looked up in the Dash manual just like Elisp symbols are looked up
  in the Elisp manual.  The command can be called directly when
  needed, or automatically from your `user-init-file`.  For example:

  ```el
  (with-eval-after-load 'info-look
    (dash-register-info-lookup))
  ```

- Dash is now listed under the standard [Customization
  groups](https://gnu.org/software/emacs/manual/html_node/emacs/Customization-Groups.html)
  and [Finder
  keywords](https://gnu.org/software/emacs/manual/html_node/emacs/Package-Keywords.html)
  `extensions` and `lisp`.

- The Dash manual is now licensed under the GNU Free Documentation
  License version 1.3.

- Various other bug fix, performance, byte-compilation, and
  documentation improvements.

### From 2.16 to 2.17

- Sped up `-uniq` by using hash-tables when possible (@cireu, #305).
- Fixed `-inits` to be non-destructive (@SwiftLawnGnome, #313).
- Fixed indent rules for `-some->` and family (@wbolster, #321).
- Added `-zip-lists` which always returns a list of proper lists, even
  for two input lists, in contrast to `-zip` (see issue #135).

### From 2.15 to 2.16

- Added `--doto`, anaphoric version of `-doto` (#282).
- Aliased `-cons-pair-p` to `-cons-pair?` (#288).
- Generalized `-rotate` for `|N|` greater than the length of the list (@leungbk,
  #290).
- Added a mechanism to extend destructuring with custom matchers (@yyoncho,
  #277).

### From 2.14 to 2.15

This release brings new destructuring features, some new control flow
functions and performance optimizations.

- Added `-setq` with destructuring binding support similar to the `-let` family
  (#116).
- Added smarter key destructuring in `-let` and friends where variables are
  auto-derived from keys (#111).
- Allowed `-let` bindings without a source value form (#256).
- Added `-each-r` and `-each-r-while` (@doublep, #159).
- Added `-common-suffix` (@basil-conto, #263).
- Improved performance of folds (`-reduce` and friends) (@basil-conto, #264).

### From 2.13 to 2.14

This release retired Emacs 23 support.

- Added Edebug support for threading macros (@Wilfred).
- Added `-unzip`.
- Added support for `-first-item` and `-last-item` as [place
  forms](https://gnu.org/software/emacs/manual/html_node/elisp/Generalized-Variables.html).
- Added `-powerset` and `-permutations` (@holomorph).
- Added `-as->` for threading a named variable (@zck).
- Added `-partition-after-pred`, `-partition-before-pred`,
  `-partition-after-item`, and `-partition-before-item` (@zck).
- Fixed a bug in `-any-p` and friends testing for `null` on lists containing
  `nil` (#239).
- Fixed infinite loop bug in `-zip` and `-interleave` when called with empty
  input.
- Added `-second-item` through `-fifth-item` as alternatives to `nth`
  (@Wilfred).
- Added `-tails` and `-inits`.
- Added `-running-sum` and `-running-product`.
- Added the `-reductions[-r][-from]` family of functions (like `-reduce` but
  collecting intermediate results).
- Added `-common-prefix` (@basil-conto).

### From 2.12 to 2.13

- `-let` now supports `&alist` destructuring.
- Various performance improvements.
- `-zip` might change in a future release to always return a list of proper
  lists.  Added `-zip-pair` for users who explicitly want the old behavior.
- Enabled lexical binding in `dash.el` for Emacs versions 24 or newer (#130).
- Added `-select-column` and `-select-columns`.
- Fixed `-map-last` and `--remove-last` to be non-destructive (#158).
- Added `-each-indexed` and `--each-indexed`.
- Added `-take-last` and `-drop-last`.
- Added the `-doto` macro.
- `-cut <>` is now treated as a function, consistent with [SRFI
  26](https://srfi.schemers.org/srfi-26/srfi-26.html) (#185).

### From 2.11 to 2.12

- Added GNU ELPA support (Phillip Lord).
- Added `-some->`, `-some->>`, and `-some-->` macros (Cam Saul).
- `-is-suffix?` is now non-destructive.
- Faster hash table implementation for `-union`.
- Improvements to docstrings and examples.

### From 2.10 to 2.11

- Lots of clean up w.r.t. byte compilation, debug macros, and tests.

### From 2.9 to 2.10

- Added `-let` destructuring to `-if-let` and `-when-let` (Fredrik Bergroth).

### From 2.8 to 2.9

- Added `-let`, `-let*`, and `-lambda` with destructuring.
- Added `-tree-seq` and `-tree-map-nodes`.
- Added `-non-nil`.
- Added `-fix`.
- Added `-fixfn` (`dash-functional` version `1.2`).
- Added `-copy` (Wilfred Hughes).

### From 2.7 to 2.8

- Added `-butlast`.

### From 2.6 to 2.7

- `-zip` now supports more than two lists (Steve Lamb).
- Added `-cycle`, `-pad`, `-annotate`, and `-zip-fill` (Steve Lamb).
- Added `-table`, `-table-flat` (finite Cartesian product).
- Added `-flatten-n`.
- `-slice` now supports a "step" argument.
- Added functional combinators `-iteratefn` and `-prodfn`.
- Added `-replace`, `-splice`, and `-splice-list` which generalize `-replace-at`
  and `-insert-at`.
- Added `-compose`, `-iteratefn`, and `-prodfn` (`dash-functional` version
  `1.1`).

### From 2.5 to 2.6

- Added `-is-prefix-p`, `-is-suffix-p`, and `-is-infix-p` (Matus Goljer).
- Added `-iterate` and `-unfold` (Matus Goljer).
- Added `-split-on` and `-split-when` (Matus Goljer).
- Added `-find-last-index` (Matus Goljer).
- Added `-list` (Johan Andersson).

### From 2.4 to 2.5

- Added `-same-items?` (Johan Andersson).
- Various bugfixes.

### From 2.3 to 2.4

- Added `-snoc` (Matus Goljer).
- Added `-replace-at`, `-update-at`, `-remove-at`, and `-remove-at-indices`
  (Matus Goljer).

### From 2.2 to 2.3

- Added tree operations (Matus Goljer).
- Made Font Lock optional.

### From 2.1 to 2.2

- Added `-compose` (Christina Whyte).

### From 2.0 to 2.1

- Added indexing operations (Matus Goljer).

### From 1.8 to 2.0

- Split out `dash-functional.el` (Matus Goljer).
- Added `-andfn`, `-orfn`, `-not`, `-cut`, `-const`, `-flip`, and `-on` (Matus
  Goljer).
- Fixed `-min`, `-max`, `-min-by`, and `-max-by` (Matus Goljer).

### From 1.7 to 1.8

- Added `-first-item` and `-last-item` (Wilfred Hughes).

### From 1.6 to 1.7

- Added `-rotate` (Matus Goljer).

### From 1.5 to 1.6

- Added `-min`, `-max`, `-min-by`, and `-max-by` (Johan Andersson).

### From 1.4 to 1.5

- Added `-sum` and `-product` (Johan Andersson).

### From 1.3 to 1.4

- Added `-sort`.
- Added `-reduce-r` (Matus Goljer).
- Added `-reduce-r-from` (Matus Goljer).

### From 1.2 to 1.3

- Added `-partition-in-steps`.
- Added `-partition-all-in-steps`.

### From 1.1 to 1.2

- Added `-last` (Matus Goljer).
- Added `-insert-at` (Emanuel Evans).
- Added `-when-let` and `-if-let` (Emanuel Evans).
- Added `-when-let*` and `-if-let*` (Emanuel Evans).
- Various bugfixes.

## License

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.
