# Dash NEWS -- history of user-visible changes

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

See the end of the file for license conditions.

## Change log

### From 2.20.0 to ?.?.?

#### Fixes

- The `-cycle` function is no longer marked as `pure`, as it returns a
  copy of its argument (#405).

### 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` (#405).

#### 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:
...
...
