Version 3.5.0
=============

Changes
-------
- improved the parser, so that inline terms are resolved correctly (https://github.com/ljedrz/lambda_calculus/issues/60)
- undefined terms can no longer be considered supercombinators
- update edition to 2024 and MSRV to 1.88

Version 3.4.0
=============

Changes
-------
- the terms in the classic notation can now be parsed with a context of free variables
- added `ParseError::UndefinedFreeVariable`, `parse_with_context`, `Context`, `Term::{max_free_index, with_context}`

Thanks
-------
- @hiratara for all the changes in this release

Version 3.3.0
=============

Changes
-------
- variable names can now contain digits (but they must start with a letter)
- added `Term::{has_free_variables, is_isomorphic_to}`

Thanks
-------
- @AgentElement for all the changes in this release

Version 3.2.2
=============

Changes
-------
- fixed the names of free variables when printing in classic notation

Thanks
-------
- @hiratara for implementing the fix

Version 3.2.1
=============

Changes
-------
- fixed the parsing of free variables in classic notation

Thanks
-------
- @hiratara for implementing the fix

Version 3.2.0
=============

Changes
-------
- add support for crates like `anyhow` by implementing `Error` for errors

Thanks
-------
- @Zicklag for adding languages to code-blocks in README
- @hiratara for implementing `Error` for `ParseError` and `TermError`

Version 3.1.0
=============

Changes
-------
- a pass with the current `clippy`
- bumped Rust edition to 2021

Version 3.0.2
=============

Changes
-------
- a pass with the current `clippy`
- the removal of outdated benches

Version 3.0.1
=============

Changes
-------
- a pass with the current `clippy`

Version 3.0.0
=============

Changes
-------
- use only one `Box` in `Term::App`

Version 2.2.0
=============

Thanks
-------
@billpmurphy for adding `list::pair::{drop, drop_while, replicate}` and a docfix

Changes
-------
- `parse` now accepts Unicode variables in `Classic` mode
- improve parser code (~25% speedup in `Classic` mode)
- add `list::pair::{drop, drop_while, replicate}`

Version 2.1.0
=============

Thanks
-------
@billpmurphy for creating `num::signed` and `data::result` and their applicable `Into` conversions,
adding `signed::{add, modulus, neg, simplify, sub, to_signed, mul}`, `result::{ok, err, is_ok,
is_err, option_ok, option_err, unwrap_or, map, map_err, and_then}` and `stumpfu::{mul, to_church,
to_scott, to_parigot}`

Changes
-------
- add `boolean::{xnor, imply}`
- add signed numbers
- add result data type
- add `signed::{add, modulus, neg, simplify, sub, to_signed, mul}`
- add `result::{ok, err, is_ok, is_err, option_ok, option_err, unwrap_or, map, map_err, and_then}`
- add `stumpfu::{mul, to_church, to_scott, to_parigot}`
- add `num::convert::{Encoding, IntoSignedNum}`
- impl `IntoSignedNum` for `i32`

Version 2.0.0
=============

Thanks
-------
@billpmurphy for the idea to make `reduction::beta` IO-free, splitting conversions (and
thus allowing all encodings to be compiled together), adding `term::is_supercombinator`,
`option::{map, unwrap_or, and_then}`, `church::{to_scott, to_parigot, to_stumpfu}`, `combinators::T`
and `scott::{is_zero, to_church}`, improving conversions into terms and adding
`impl<T> IntoChurch for Option<T> where T: IntoChurch`

Breaking changes
-------
- restructure and rename modules
- rework compilation features
- remove `impl Term` from Church data types
- remove `reduction::compare`
- remove `Term::{app, apply, eval}`
- rename `term::Error` to `term::TermError`
- rename `TermError` variant names
- rename combinators
- rename `*::numerals::plus` to `add`
- rename `*::numerals::mult` to `mul`
- rename `church::numerals::{lshift, rshift}` to `{shl, shr}`
- rename `Term::beta` to `Term::reduce`
- rename `church::lists::null` to `is_nil`
- rename `parser::Error` to `ParseError`
- rename `combinators::T` to `R`
- simplify `term::Error`
- unify test and bench names
- make `reduction::beta` IO-free
- turn `reduction::apply` into a method on `Term`
- make `ParseError::InvalidCharacter` 0-indexed
- split `Into<Term>` conversion into `IntoChurch`, `IntoScott` and `IntoParigot`

Changes
-------
- fix the empty case in `list::take_while`
- refactor benchmarks using macros
- refactor integration tests using macros
- improve documentation
- implement conversions to pair, list and option for all numeral types
- add Stump-Fu numeral encoding
- add binary numeral encoding
- add Church-, Scott- and Parigot-encoded list
- add tuple data type
- add macros for automated creation of conversion traits and implementations
- add an `encoding` feature and make it default
- add an undefined term `term::UD`
- add `tuple::{tuple, projection}`
- add `binary::{b0, b1, zero, is_zero, one, lsb, shl0, shl1, strip, succ, pred}`
- add `option::{map, unwrap_or, and_then}`
- add `term::is_supercombinator`
- add `stumpfu::{zero, is_zero, one, succ, pred, add}`
- add `parigot::{is_zero, one, mult, sub}`
- add `impl<T> IntoChurch for Option<T> where T: IntoChurch`
- add `num::scott::{is_zero, one, add, mul, pow, to_church}`
- add `num::church::{to_scott, to_parigot, to_stumpfu}`
- add `combinators::T` (Turing combinator)
- add `list::{church, scott, parigot}::{nil, is_nil, cons, head, tail}`
- ensure all functions match their definition in documentation

Version 1.4.0
=============

Thanks
-------
@billpmurphy for creating `church::option`, adding `option::{none, some, is_none, is_some,
map_or}`, adding `church::lists::{init, zip, zip_with, take, take_while}` and simplifying
`church::lists::last`

Changes
-------
- add Scott encoding as a compilation feature
- add a Scott numerals module
- add `scott::{zero, succ, pred}`
- add Parigot encoding as a compilation feature
- add a Parigot numerals module
- add `parigot::{zero, succ, pred, plus}`
- add a Church option module
- add `church::option::{is_none, is_some, map_or}`
- add `church::pairs::swap`
- add `church::lists::{init, zip, zip_with, take_while}`
- simplify `church::lists::last`
- more fine-grained parser benchmarks
- add Church list benchmarks

Version 1.3.0
=============

Thanks
-------
@billpmurphy for adding `church::lists::last`

Changes
-------
- add `church::lists::last`
- change all instances of `try!()` to `?`
- replace 2 `clone()`s with `replace()`s (**big** performance wins)
- simplify doctest imports in booleans.rs
- simplify and improve doctests in combinators.rs, lists.rs, pairs.rs and numerals.rs
- reorganize unit tests in lists.rs
- remove lots of doctest boilerplate
- some code readability improvements
- more benchmarks

Version 1.2.0
=============

Thanks
-------
@billpmurphy for adding `church::numerals::{min, max, lshift, rshift, is_even, is_odd}` and
`church::pairs::uncurry`

Changes
-------
- add `church::numerals::{min, max, lshift, rshift, is_even, is_odd}` for Church numerals
- add `church::pairs::uncurry`
- add `abs!()` macro for multiple abstraction and use it internally
- simplify many `church::numerals` functions using `church::numerals::{one, pred}`
- move integration tests to a [tests](https://github.com/ljedrz/lambda_calculus/tree/master/tests) folder

Version 1.1.1
=============

Changes
-------
- remove one unnecessary mutability
- add maintenance badges

Version 1.1.0
=============

Changes
-------
- core tests no longer use Church-encoded data
- adhere to [C-REEXPORT](https://github.com/brson/rust-api-guidelines#c-reexport)
- improved parser performance
- improved readability of `reduction::compare`
- added benchmarks
- fixed two doc links
- minor code improvements

Version 1.0.0
=============

First stable release.
