Changes since version 0.4
===
* New features
  * `list.ungroup` now supports `level` arguments to `unlist` a nested list recursively. (#102)
  * `list.flatten` now accepts `classes` to filter list element recursively by class name.
  * `list.expand` implements a list version of `expand.grid` (#107)
* Improvements
  * Support loading and parsing from xml to list. (#43)
  * `list.search` now uses `is.null` to clean the results.
  * Add `list.unzip` to `List` object.
  * `list.ungroup` now supports `group.names` to indicate whether to preserve group names.
  * Implement better error handling mechanism in `list.all`, `list.takeWhile`, `list.skipWhile`, etc.
  * `list.table` will directly call `table` upon input data if `...` is missing.
* Bug fixes
  * Fix returned value of `list.unserialize`.
  * `list.skip` returns the original data when asked to skip 0 elements.
  * `list.skip` takes the first `n` elements when asked to skip a negative number of elements.
  * Fix bug in lambda expression handling of `list.all` (#105)

Version 0.4
===
* New features
  * Include a dataset `nyweather` scraped from [OpenWeatherMap](https://openweathermap.org/) (#2)
  * `list.load` now supports text-based progress bar when `progress = TRUE` which is by default
    enabled if over 5 files are to be loaded. (#92)
  * New function `list.names` gives a list or vector names by mapping.
  * New functions `list.first` and `list.last` find the first or last list element that meets a
    given condition.
  * New function `list.unzip` to transform a list of elements with similar structure into a
    list of decoupled fields.
* Improvements
  * Add error handling in several edge cases. (#18)
  * `list.group` now supports grouping by multi-key which produces multi-level list. (#69)
  * `list.load` now supports loading from multiple filenames given in character vector. (#74)
  * `list.load` is now able to guess the file format even if the file type is not specified. (#76)
  * `list.maps` now allows the usage of `..1`, `..2`, etc. to refer to unnamed arguments. (#80)
  * `list.load` now supports merging and ungrouping as means to aggregating loaded results. (#82)
  * `list.stack` now uses `data.table::setDF` to convert `data.table` to `data.frame` if
    `data.table = FALSE`, which is done by reference and thus has higher performance.
* Bug fixes
  * `list.search` now takes `n` as the number of returned vector rather than that of the
    elements in all returned vectors, and is now able to jump out when the result set reaches
    given capacity. (#47, #84)
  * Fix how `list.table` deals with `NULL` values. (#73)
  * Fix how wrapper functions deal with default arguments. (#75)
  * Fix the dynamic scoping issues in `list.table`. (#86)
  * `list.all` and `list.any` behave the same as `all` and `any` respectively when the input is empty. (#87)
  * One-sided formula does not result in error now. (#89)
  * `list.flatten` now preserves names as specified. (#90)
  * Fix incorrect processing for fallback in `list.findi`. (#91)
  * Fix the implementation in `list.group` working with multi-key. (#93)
  * Fix incorrect ordering if some entries are multi-valued vectors and others and single-
    valued. If `list.order` and `list.sort` encounter such situation, they now report
    error rather than silently produced unreliable results. (#94)
  * Fix inconsistencies in `list.all`, `list.any`, `list.first` and `list.last`.
* Deprecation
  * `equal()` is removed and related packages are now suggested rather than imported. (#70)
  * `summary.list()` is deprecated. (#70)
  * No longer interprets `x -> f(x)` as a form a lambda expression. Use `x ~ f(x)` instead. (#54)
  * `desc(x)` is no longer supported in `list.sort` and `list.order`. Use `-x` or `(x)` instead. (#66)


Version 0.3
===
API Break: `list.search` now evaluates expression recursively in a list and supports lambda expression.

Add `equal()` function for logical and fuzzy filtering and searching which supports exact equality, atomic equality, inclusion, pattern matching, string-distance tolerance.

Add `List()` to provide an environment in which most list functions are defined for light-weight chaining that does not rely on external operators.



Version 0.2.5
===
Add `list.apply` which is a wrapper function of lapply.
Add `list.search` that searches a list recursively.
Add exact search functions: `equal`, `unequal`, `unidentical`, `include`, and `exclude`.
Add fuzzy search functions: `like` and `unlike` based on stringdist package.
Enhance `list.clean` which now supports recursive cleaning.

Version 0.2.4
===
Add `list.common` that returns the common cases of all list member by expression.


Version 0.2.3
===
Improve performance (#26, #27)
Add `list.flatten` that flattens a nested list to one-level.



Version 0.2.2
===
Add `list.stack` that binds list members to a data.frame.
Add `list.zip` that combines multiple lists element-wisely.
Add `list.maps` that performs mapping over multiple lists.
Performance improvements.
Minor maintainence updates.
`list.cases` supports list-like cases
Fixed [#23](https://github.com/renkun-ken/rlist/issues/23)
Fixed [#25](https://github.com/renkun-ken/rlist/issues/25)
`list.select` no longer accepts explicit lambda expressions.
Vignettes updated


Version 0.2.1
===
Add new function `list.table`
Minor maintainence updates.
Fixed [#6](https://github.com/renkun-ken/rlist/issues/6)
Fixed [#11](https://github.com/renkun-ken/rlist/issues/11)
Fixed [#20](https://github.com/renkun-ken/rlist/issues/20)
Fixed [#21](https://github.com/renkun-ken/rlist/issues/21)


Version 0.2
===
Add `list.join`, `list.mapv`, `list.do`, `list.clean`, `list.parse`
Add vignettes


Version 0.1
===
Implement functions