summaryrefslogtreecommitdiffstats
path: root/vendor/im-rc
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/im-rc')
-rw-r--r--vendor/im-rc/.cargo-checksum.json1
-rw-r--r--vendor/im-rc/CHANGELOG.md419
-rw-r--r--vendor/im-rc/CODE_OF_CONDUCT.md73
-rw-r--r--vendor/im-rc/Cargo.toml113
-rw-r--r--vendor/im-rc/LICENCE.md355
-rw-r--r--vendor/im-rc/README.md28
-rw-r--r--vendor/im-rc/build.rs25
-rw-r--r--vendor/im-rc/debian/patches/disable-features.patch45
-rw-r--r--vendor/im-rc/debian/patches/disable-tests-proptest-derive.patch129
-rw-r--r--vendor/im-rc/debian/patches/replace-metrohash-with-keccak.patch80
-rw-r--r--vendor/im-rc/debian/patches/series3
-rw-r--r--vendor/im-rc/proptest-regressions/hash/map.txt16
-rw-r--r--vendor/im-rc/proptest-regressions/hash/set.txt7
-rw-r--r--vendor/im-rc/proptest-regressions/ord/map20
-rw-r--r--vendor/im-rc/proptest-regressions/ord/map.txt8
-rw-r--r--vendor/im-rc/proptest-regressions/ord/set.txt7
-rw-r--r--vendor/im-rc/proptest-regressions/ser.txt10
-rw-r--r--vendor/im-rc/proptest-regressions/sort.txt7
-rw-r--r--vendor/im-rc/proptest-regressions/tests/ordset.txt7
-rw-r--r--vendor/im-rc/proptest-regressions/tests/vector.txt9
-rw-r--r--vendor/im-rc/proptest-regressions/vector/mod.txt16
-rw-r--r--vendor/im-rc/src/arbitrary.rs98
-rw-r--r--vendor/im-rc/src/config.rs20
-rw-r--r--vendor/im-rc/src/fakepool.rs208
-rw-r--r--vendor/im-rc/src/hash/map.rs2379
-rw-r--r--vendor/im-rc/src/hash/mod.rs8
-rw-r--r--vendor/im-rc/src/hash/set.rs1134
-rw-r--r--vendor/im-rc/src/iter.rs42
-rw-r--r--vendor/im-rc/src/lib.rs507
-rw-r--r--vendor/im-rc/src/nodes/btree.rs1368
-rw-r--r--vendor/im-rc/src/nodes/hamt.rs726
-rw-r--r--vendor/im-rc/src/nodes/mod.rs16
-rw-r--r--vendor/im-rc/src/nodes/rrb.rs1101
-rw-r--r--vendor/im-rc/src/ord/map.rs2649
-rw-r--r--vendor/im-rc/src/ord/mod.rs8
-rw-r--r--vendor/im-rc/src/ord/set.rs1243
-rw-r--r--vendor/im-rc/src/ord/test-fixtures/issue_124.txt3492
-rw-r--r--vendor/im-rc/src/proptest.rs164
-rw-r--r--vendor/im-rc/src/quickcheck.rs43
-rw-r--r--vendor/im-rc/src/ser.rs293
-rw-r--r--vendor/im-rc/src/sort.rs203
-rw-r--r--vendor/im-rc/src/sync.rs69
-rw-r--r--vendor/im-rc/src/test.rs115
-rw-r--r--vendor/im-rc/src/tests/hashset.rs84
-rw-r--r--vendor/im-rc/src/tests/mod.rs24
-rw-r--r--vendor/im-rc/src/tests/ordset.rs83
-rw-r--r--vendor/im-rc/src/tests/vector.rs230
-rw-r--r--vendor/im-rc/src/util.rs142
-rw-r--r--vendor/im-rc/src/vector/focus.rs909
-rw-r--r--vendor/im-rc/src/vector/mod.rs2745
-rw-r--r--vendor/im-rc/src/vector/pool.rs74
-rw-r--r--vendor/im-rc/src/vector/rayon.rs209
52 files changed, 21764 insertions, 0 deletions
diff --git a/vendor/im-rc/.cargo-checksum.json b/vendor/im-rc/.cargo-checksum.json
new file mode 100644
index 0000000..8856ef6
--- /dev/null
+++ b/vendor/im-rc/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{},"package":"af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe"} \ No newline at end of file
diff --git a/vendor/im-rc/CHANGELOG.md b/vendor/im-rc/CHANGELOG.md
new file mode 100644
index 0000000..edcf429
--- /dev/null
+++ b/vendor/im-rc/CHANGELOG.md
@@ -0,0 +1,419 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project
+adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+## [15.1.0] - 2022-04-29
+
+### Added
+
+- `HashSet` now implements `From<Vector<A>>` and `From<&Vector<A>> where A: Clone`.
+
+### Fixed
+
+- Fixed a long standing crash bug in `OrdMap`/`OrdSet`. (#154, #143, #152, #124)
+- The `union` method on maps/sets will now prefer to mutate the larger set (which leads to less
+ work) rather than the first set. (#163)
+- Ensure `TreeFocus` only implements `Send`/`Sync` when the underlying type does. (#157, #158)
+- There was an issue where nodes in very large `OrdMap`s could overflow when removing an element
+ and cause a panic, which has now been fixed. (#141)
+- Assorted doc cleanup. (#150, #173, #186, #194)
+
+## [15.0.0] - 2020-05-15
+
+### Changed
+
+- Map iterators now return `(&K, &V)` and `(&K, &mut V)` respectively, to be consistent with
+ `std::collections`'s API. `DiffIter` for `OrdMap` has also changed in the same manner. (#121)
+
+### Removed
+
+- The `pool` feature flag has been removed from the `im` version of the crate, as `refpool` no
+ longer supports threadsafe pools.
+- `HashSet::iter_mut()` has been removed, because if you modify the hashed values in a hash set,
+ you break the hash set.
+
+### Added
+
+- The `pool` feature flag was missing from the `im-rc` version of the crate, which is the version
+ where it's actually useful. It's been added now.
+- `DiffIter` now has a `Debug` implementation.
+- There is now a `Vector::is_inline()` method to determine whether a `Vector` is currently
+ inlined. (#129)
+
+### Fixed
+
+- A smarter implementation of the sorting algorithm for `Vector` has improved the performance of
+ `Vector::sort` by approximately 2x. (#126)
+
+## [14.3.0] - 2020-03-03
+
+### Changed
+
+- `proptest` strategies have been moved to `im::proptest`. The previous locations of the
+ strategies (`im::vector::proptest` etc) are still available, but have been deprecated.
+
+### Added
+
+- `OrdSet` and `OrdMap` now have `get_prev` and `get_next` methods (with equivalent `get_prev_mut`
+ and `get_next_mut` methods for `OrdMap`) which will return the closest key match to the
+ requested key in the specified direction if the key isn't in the set. (#95)
+- The `retain` method, inexplicably missing from `HashMap` but not `HashSet`, has been added.
+ (#120)
+- The `get_mut` method on `OrdMap` was, equally inexplicably, private. It has now been made
+ public.
+
+## [14.2.0] - 2020-01-17
+
+### Added
+
+- Both map types now have the `get_key_value()` method, corresponding to the equivalent
+ [additions](https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.get_key_value)
+ to the standard library.
+- The `ptr_eq` method has been added to all data types, allowing you to test whether two values
+ refer to the same content in memory, by testing for pointer equality. (#117)
+- `HashMap` had lost its `Arbitrary` implementation for the `quickcheck` feature flag. It's now
+ been restored. (#118)
+- Implementations for `Arbitrary` from the [`arbitrary`](https://crates.io/crates/arbitrary/)
+ crate have been added behind the `arbitrary` feature flag.
+
+### Fixed
+
+- Fixed a bug when reversing a consuming iterator over a `Vector` by replacing the consuming
+ iterator with a much simpler and slightly more efficient version. (#116)
+
+## [14.1.0] - 2019-12-16
+
+### Added
+
+- If you enable the `pool` feature flag, im now supports constructing data types using
+ [`refpool`](https://crates.io/crates/refpool) to speed up chunk allocation. The performance
+ boost will vary between use cases and operating systems, but generally at least a 10% speedup
+ can be expected when constructing a data type from an iterator, and the more complex an
+ operation is, the more likely it is to benefit from being able to quickly reallocate chunks.
+ Note that in order to use this feature, you have to construct your data types using the
+ `with_pool(&pool)` constructor, it's not enough just to enable the feature flag.
+
+## [14.0.0] - 2019-11-19
+
+### Changed
+
+- As `sized-chunks` now requires a slightly more recent version of `rustc` to compile,
+ specifically version 1.36.0, so does `im`. This is a breaking change, but will of course only
+ affect your code if you're using an older `rustc`.
+
+### Fixed
+
+- Fixed a quadratic time worst case scenario in the quicksort implementation for `Vector`. (#101)
+- Fixed an edge case bug when splitting and joining large `Vector`s. (#105, #107)
+
+## [13.0.0] - 2019-05-18
+
+The minimum supported Rust version is now 1.34.0.
+
+### Changed
+
+- `im::iter::unfold` now gives you the owned state value rather than an immutable reference to it,
+ which makes it a little more useful.
+
+### Removed
+
+- The deprecated `singleton` constructors have been removed. Please use `unit` instead.
+- The deprecated methods `Vector::chunks` and `Vector::chunks_mut` have been removed in favour of
+ `Vector::leaves` and `Vector::leaves_mut` respectively. (#50)
+- The deprecated reference to [`sized-chunks`](https://crates.io/crates/sized-chunks) has been
+ removed. If you need it, please use the `sized-chunks` crate directly.
+- `im::iter::unfold_mut` has been removed, as there's no meaningful difference between it and
+ rust-std 1.34.0's `std::iter::from_fn` with a captured state variable.
+
+### Fixed
+
+- `Vector` now uses
+ [`sized_chunks::InlineArray`](https://docs.rs/sized-chunks/0.3.0/sized_chunks/inline_array/struct.InlineArray.html)
+ instead of an `Empty` enum case to avoid allocation at very small sizes, letting you store a
+ handful of elements on the stack before needing to grow into a full chunk. This has a beneficial
+ effect on performance as well, as there's no pointer into the heap to dereference, making it
+ faster than `std::vec::Vec` in this configuration.
+- Some complexity timings have been added and corrected. (#87)
+- `OrdSet::is_subset(&self, other)` now returns immediately when `self` is larger than `other` and
+ thus could not possibly be a subset of it. (#87)
+
+## [12.3.4] - 2019-04-08
+
+### Changed
+
+- `Clone` constraints have been further relaxed on maps and sets, so that you can now lookup and
+ iterate over them without requiring a `Clone` constraint (though you do still need `Clone` to
+ actually insert data into them to lookup or iterate over). (#81)
+
+### Fixed
+
+- Enforces the latest bugfix release of sized-chunks. (#78)
+- Another edge case bugfix to `Vector`'s size table handling. (#79)
+
+## [12.3.3] - 2019-03-11
+
+### Fixed
+
+- A number of issues were fixed where `Vector`'s size table would get out of sync with the node
+ structure if exercised too much and cause erroneous behaviour. (#72, #74)
+- Comprehensive generative tests were added to test all data structures through more unexpected
+ code paths.
+
+## [12.3.2] - 2019-03-05
+
+### Changed
+
+- `Clone` constraints on all data structures, as well as relevant constraints on maps and sets,
+ have been relaxed where possible, so that you can now construct empty instances and call most
+ query methods without requiring values implement `Clone` etc. (#63)
+
+### Fixed
+
+- Constructing an empty `Vector` will not allocate any heap memory, instead deferring allocation
+ until you perform an operation that would increase its length. (#65)
+- Some bugs arising when using `Vector::append` repeatedly were fixed. (#67, #70)
+
+## [12.3.1] - 2019-02-19
+
+### Changed
+
+- Unsafe chunks have been separated out into the `sized-chunks` crate, which is now a dependency
+ of `im`.
+
+## [12.3.0] - 2019-01-15
+
+### Added
+
+- `singleton` methods have been deprecated and renamed to `unit`.
+- `Vector::chunks` and `Vector::chunks_mut` have been deprecated and renamed to `leaves` and
+ `leaves_mut` to avoid confusion with `Vec::chunks`. (#50)
+
+### Fixed
+
+- Fixed an issue where the `HashMap` draining iterator might access uninitialised memory leading
+ to undefined behaviour. (#60)
+- Fixed multiple issues in `Vector::split_off` and `Vector::append` that would cause lookup errors
+ and unexpectedly unbalanced trees. (#55).
+
+## [12.2.0] - 2018-10-12
+
+### Added
+
+- `OrdMap` and `OrdSet` now have a `range()` method which makes an iterator over a bounded subset
+ of the values. The improved iterator implementation is also considerably more efficient than the
+ previous (about an order of magnitude faster for nontrivial data sets). `iter()` has been
+ updated to take advantage of this, and is now just an alias for `range(..)`. (#27)
+- `FocusMut` now has an `unmut` method to turn it into an immutable `Focus`, releasing its
+ exclusive hold on the underlying `Vector`.
+- `Focus` now implements `Clone`.
+
+## [12.1.0] - 2018-09-25
+
+### Added
+
+- Maps and sets now have the `clear` method just like `Vector`. (#46)
+
+### Changed
+
+- Single chunk `Vector`s are no longer allocated directly on the stack, meaning that they're now
+ comparable in performance to `std::vec::Vec` rather than slightly faster, but they also won't
+ eat up your stack space quite as quickly, and they'll clone without copying and share structure
+ with clones as you'd expect.
+
+## [12.0.0] - 2018-08-30
+
+Starting with this release, the `arc` flag is gone, in favour of publishing `im` as two separate
+crates: `im` (using `Arc`) and `im-rc` (using `Rc`). They're identical (and built from the same
+code), except that `im` is thread safe and `im-rc` is a little bit more performant.
+
+This is a major release as a consequence, but there should be no breaking code changes other than
+the new default choice of reference counter.
+
+### Added
+
+- The `Chunk` datatype that's used to build `Vector` and `OrdMap` has been exposed and made
+ generally usable. It's somewhere between a
+ [`GenericArray`](https://crates.io/crates/generic-array) and a ring buffer, offers O(1)\* push
+ in either direction, and is generally hyperoptimised for its purpose of serving as nodes for
+ Bagwell tries, but it's also a powered up version of
+ [`GenericArray`](https://crates.io/crates/generic-array) that might be useful to others, hence
+ the public API.
+- `Vector` now has `Focus` and `FocusMut` APIs for caching index lookups, yielding huge
+ performance gains when performing multiple adjacent index lookups. `Vector::iter` has been
+ reimplemented using this API, and is now much simpler and about twice as fast as a result, and
+ `Vector::iter_mut` now runs nearly an order of magnitude faster. Likewise, `Vector::sort` and
+ `Vector::retain` are now using `FocusMut` and run considerably faster as a result.
+- `Focus` and `FocusMut` can also be used as stand ins for subslices through the `narrow` and
+ `split_at` methods. You can also iterate over foci, making this the most efficient way to
+ iterate over a subset of a `Vector`.
+- `Vector` now implements [Rayon](https://crates.io/crates/rayon)'s parallel iterators behind the
+ `rayon` feature flag.
+
+### Changed
+
+- As `std::ops::RangeBounds` is now stabilised in Rust 1.28, the `Vector::slice` method is now
+ unconditionally available on the stable channel.
+- Union/difference/intersection/is_submap methods on `HashMap` and `OrdMap` that take functions
+ now take `FnMut` instead of `Fn`. This should not affect any existing code. (#34)
+- `Vector::split_off` can now take an index equal to the length of the vector, yielding an empty
+ vector as the split result. (#33)
+- `Vector::set` now returns the replaced value.
+
+### Fixed
+
+- `Vector` is now represented as a single inline chunk until it grows larger than the chunk size,
+ making it even faster than `Vec` at small sizes, though `clone` could now be slower if the clone
+ is expensive (it's still absurdly fast for `A: Copy`).
+
+## [11.0.1] - 2018-07-23
+
+### Fixed
+
+- Various performance improvements, amounting to a 5-10% speedup for both kinds of map/set.
+- Fixed an edge case bug in `sort::quicksort`.
+
+## [11.0.0] - 2018-07-10
+
+### Changed
+
+This is a major release with many breaking changes, and is intended to stabilise the API more than
+to denote that the rewrite is now production ready. You should expect future releases with
+significant performance improvements as well as additional APIs, but there should be no further
+major release with breaking changes in the immediate future, barring very serious unforeseen issues.
+
+Specifically, you should expect imminent minor releases with performance improvements for `Vector`
+and `OrdMap`, for which I have a number of known optimisations that remain unimplemented.
+
+#### No More `Arc`
+
+All data structures have been reworked to take values of `A: Clone` instead of `Arc<A>`, meaning
+that there's less performance overhead (as well as mental overhead) when using values that clone
+cheaply. The performance gain when values are `A: Copy` is a factor of two or more. It's expected
+that users should wrap values in `Arc` themselves when using values which are expensive to clone.
+
+Data structures still use reference counters internally to reference nodes, but values are stored
+directly in the nodes with no further indirection. This is also good for cache locality.
+
+Data structures now use `Rc` instead of `Arc` by default to do reference counting. If you need a
+thread safe version that implements `Send` and `Sync`, you can enable the `arc` feature on the
+package to compile with `Arc` instead.
+
+#### `std::collections` Compatible API
+
+The API has been reworked to align more closely with `std::collections`, favouring mutable
+operations by default, so that operations that were previously suffixed with `_mut` are now the
+standard operations, and immutable operations which return a modified copy have been given different
+names altogether. In short, all your code using previous versions of this library will no longer
+work, and if it was relying heavily on immutable operations, it's recommended that you rewrite it to
+be mutable by preference, but you should generally be able to make it work again by using the new
+method names for the immutable operations.
+
+Here is a list of the most notable changed method names for maps and sets:
+
+| Previous immutable | Current immutable | Previous mutable | Current mutable |
+| ------------------ | ----------------- | ---------------- | --------------- |
+| `insert` | `update` | `insert_mut` | `insert` |
+| `remove` | `without` | `remove_mut` | `remove` |
+| `pop` | `extract` | `pop_mut` | `remove` |
+
+You should expect to be able to rewrite code using `std::collections::HashMap` and
+`std::collections::BTreeMap` with minimal or no changes using `im::HashMap` and `im::OrdMap`
+respectively.
+
+`Vector` has been completely rewritten and has an API that aligns closely with
+`std::collections::VecDeque`, with very few immutable equivalents. It's expected that you should use
+`Vector::clone()` to take a snapshot when you need it rather than cause an implicit clone for each
+operation. (It's still O(1) and practically instant.)
+
+I'm considering adding back some of the immutable operations if I can come up with good names for
+them, but for now, just `clone` it if you need it.
+
+#### RRB Vector
+
+`Vector` is now implemented as an
+[RRB tree](https://infoscience.epfl.ch/record/213452/files/rrbvector.pdf) with
+[smart head/tail chunking](http://gallium.inria.fr/~rainey/chunked_seq.pdf), obsoleting the previous
+[Hickey trie](https://hypirion.com/musings/understanding-persistent-vector-pt-1) implementation.
+
+RRB trees have generally similar performance characteristics to the Hickey trie, with the added
+benefit of having O(log n) splitting and concatenation.
+
+| Operation | RRB tree | Hickey trie | Vec | VecDeque |
+| --------------- | -------- | ----------- | ------ | -------- |
+| Push front | O(1)\* | O(log n) | O(n) | O(1)\* |
+| Push back | O(1)\* | O(log n) | O(1)\* | O(1)\* |
+| Pop front | O(1)\* | O(log n) | O(n) | O(1)\* |
+| Pop back | O(1)\* | O(log n) | O(1) | O(1)\* |
+| Lookup by index | O(log n) | O(log n) | O(1) | O(1) |
+| Split | O(log n) | O(log n) | O(n) | O(n) |
+| Join | O(log n) | O(n) | O(n) | O(n) |
+
+(Please note that the timings above are for the `im` version of the Hickey trie, based on the
+[Immutable.js](https://facebook.github.io/immutable-js/) implementation, which performs better than
+the original Clojure version on splits and push/pop front, but worse on push/pop back).
+
+The RRB tree is the most generally efficient list like data structure currently known, to my
+knowledge, but obviously it does not and cannot perform as well as a simple `Vec` on certain
+operations. It makes up for that by having no operations you need to worry about the performance
+complexity of: nothing you can do to an RRB tree is going to be more expensive than just iterating
+over it. For larger data sets, being able to concatenate (and, by extension, insert and remove at
+arbitrary locations) several orders of magnitude faster than `Vec` could also be considered a
+selling point.
+
+#### No More `CatList` And `ConsList`
+
+`CatList` has been superseded by `Vector`, and `ConsList` was generally not very useful except in
+the more peculiar edge cases where memory consumption matters more than performance, and keeping it
+in line with current API changes wasn't practical.
+
+#### No More Funny Words
+
+Though it breaks my heart, words like `cons`, `snoc`, `car`, `cdr` and `uncons` are no longer used
+in the `im` API, to facilitiate closer alignment with `std::collections`. Even the `head`/`tail`
+pair is gone, though `head` and `last` remain as aliases for `front` and `back`.
+
+## [10.2.0] - 2018-04-15
+
+### Added
+
+- Map/set methods which accept references to keys will now also take any value that's borrowable
+ to the key's type, ie. it will take a reference to a type `Borrowable` where the key implements
+ `Borrow<Borrowable>`. This is particularly handy for types such as `String` because you can now
+ pass `&str` to key lookups instead of `&String`. So, instead of the incredibly cumbersome
+ `map.get(&"foo".to_string())` you can just do `map.get("foo")` when looking up a mapping for a
+ string literal.
+
+## [10.1.0] - 2018-04-12
+
+### Added
+
+- `Vector`, `OrdMap` and `HashMap` now implement `Index` and `IndexMut`, allowing for syntax like
+ `map[key] = value`.
+- Added `cons`, `snoc`, `uncons` and `unsnoc` aliases where they were missing.
+- Everything now implements `Sum` and `Extend` where possible.
+
+### Changed
+
+- Generalised `OrdMap`/`OrdSet`'s internal nodes so `OrdSet` now only needs to store pointers to
+ its values, not pairs of pointers to value and `Unit`. This has caused `OrdMap/Set`'s type
+ constraints to tighten somewhat - in particular, iteration over maps/sets whose keys don't
+ implement `Ord` is no longer possible, but as you would only have been able to create empty
+ instances of these, no sensible code should break because of this.
+- `HashMap`/`HashSet` now also cannot be iterated over unless they implement `Hash + Eq`, with the
+ same note as above.
+- Constraints on single operations that take closures on `HashMap` and `OrdMap` have been relaxed
+ from `Fn` to `FnOnce`. (Fixes #7.)
+
+### Fixed
+
+- Hashes are now stored in `HashMap`s along with their associated values, removing the need to
+ recompute the hash when a value is reordered inside the tree.
+
+## [10.0.0] - 2018-03-25
+
+### Added
+
+This is the first release to be considered reasonably stable. No changelog has been kept until now.
diff --git a/vendor/im-rc/CODE_OF_CONDUCT.md b/vendor/im-rc/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..02a0869
--- /dev/null
+++ b/vendor/im-rc/CODE_OF_CONDUCT.md
@@ -0,0 +1,73 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+education, socio-economic status, nationality, personal appearance, race,
+religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at admin@immutable.rs. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
diff --git a/vendor/im-rc/Cargo.toml b/vendor/im-rc/Cargo.toml
new file mode 100644
index 0000000..46aa115
--- /dev/null
+++ b/vendor/im-rc/Cargo.toml
@@ -0,0 +1,113 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2018"
+rust-version = "1.46.0"
+name = "im-rc"
+version = "15.1.0"
+authors = ["Bodil Stokke <bodil@bodil.org>"]
+build = "./build.rs"
+description = "Immutable collection datatypes (the fast but not thread safe version)"
+homepage = "http://immutable.rs/"
+documentation = "http://immutable.rs/"
+readme = "../../README.md"
+keywords = [
+ "immutable",
+ "persistent",
+ "hamt",
+ "b-tree",
+ "rrb-tree",
+]
+categories = ["data-structures"]
+license = "MPL-2.0+"
+repository = "https://github.com/bodil/im-rs"
+
+[package.metadata.docs.rs]
+all-features = true
+
+[lib]
+path = "./src/lib.rs"
+
+#[dependencies.arbitrary]
+#version = "1.1"
+#optional = true
+
+[dependencies.bitmaps]
+version = "2"
+
+[dependencies.proptest]
+version = "1"
+optional = true
+
+[dependencies.quickcheck]
+version = "1"
+optional = true
+
+[dependencies.rand_core]
+version = "0.6"
+
+[dependencies.rand_xoshiro]
+version = "0.6"
+
+[dependencies.rayon]
+version = "1"
+optional = true
+
+#[dependencies.refpool]
+#version = "0.4"
+#optional = true
+
+[dependencies.serde]
+version = "1"
+optional = true
+
+[dependencies.sized-chunks]
+version = "0.6.4"
+
+[dependencies.typenum]
+version = "1.12"
+
+[dev-dependencies.tiny-keccak]
+version = "2.0"
+features = ["keccak"]
+
+[dev-dependencies.pretty_assertions]
+version = "1"
+
+[dev-dependencies.proptest]
+version = "1"
+
+[dev-dependencies.rand]
+version = "0.8"
+features = ["small_rng"]
+
+[dev-dependencies.rayon]
+version = "1"
+
+[dev-dependencies.serde]
+version = "1"
+
+[dev-dependencies.serde_json]
+version = "1"
+
+[build-dependencies.version_check]
+version = "0.9"
+
+[features]
+debug = []
+#pool = [
+# "refpool",
+# "sized-chunks/refpool",
+#]
+
+[badges.travis-ci]
+repository = "bodil/im-rs"
diff --git a/vendor/im-rc/LICENCE.md b/vendor/im-rc/LICENCE.md
new file mode 100644
index 0000000..cd44203
--- /dev/null
+++ b/vendor/im-rc/LICENCE.md
@@ -0,0 +1,355 @@
+Mozilla Public License Version 2.0
+==================================
+
+### 1. Definitions
+
+**1.1. “Contributor”**
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+**1.2. “Contributor Version”**
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+**1.3. “Contribution”**
+ means Covered Software of a particular Contributor.
+
+**1.4. “Covered Software”**
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+**1.5. “Incompatible With Secondary Licenses”**
+ means
+
+* **(a)** that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+* **(b)** that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+**1.6. “Executable Form”**
+ means any form of the work other than Source Code Form.
+
+**1.7. “Larger Work”**
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+**1.8. “License”**
+ means this document.
+
+**1.9. “Licensable”**
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+**1.10. “Modifications”**
+ means any of the following:
+
+* **(a)** any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+* **(b)** any new file in Source Code Form that contains any Covered
+ Software.
+
+**1.11. “Patent Claims” of a Contributor**
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+**1.12. “Secondary License”**
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+**1.13. “Source Code Form”**
+ means the form of the work preferred for making modifications.
+
+**1.14. “You” (or “Your”)**
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, “You” includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, “control” means **(a)** the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or **(b)** ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+
+### 2. License Grants and Conditions
+
+#### 2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+* **(a)** under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+* **(b)** under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+#### 2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+#### 2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+* **(a)** for any code that a Contributor has removed from Covered Software;
+ or
+* **(b)** for infringements caused by: **(i)** Your and any other third party's
+ modifications of Covered Software, or **(ii)** the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+* **(c)** under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+#### 2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+#### 2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+#### 2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+#### 2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+
+### 3. Responsibilities
+
+#### 3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+#### 3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+* **(a)** such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+* **(b)** You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+#### 3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+#### 3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+#### 3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+
+### 4. Inability to Comply Due to Statute or Regulation
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: **(a)** comply with
+the terms of this License to the maximum extent possible; and **(b)**
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+
+### 5. Termination
+
+**5.1.** The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated **(a)** provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and **(b)** on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+**5.2.** If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+**5.3.** In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+
+### 6. Disclaimer of Warranty
+
+> Covered Software is provided under this License on an “as is”
+> basis, without warranty of any kind, either expressed, implied, or
+> statutory, including, without limitation, warranties that the
+> Covered Software is free of defects, merchantable, fit for a
+> particular purpose or non-infringing. The entire risk as to the
+> quality and performance of the Covered Software is with You.
+> Should any Covered Software prove defective in any respect, You
+> (not any Contributor) assume the cost of any necessary servicing,
+> repair, or correction. This disclaimer of warranty constitutes an
+> essential part of this License. No use of any Covered Software is
+> authorized under this License except under this disclaimer.
+
+### 7. Limitation of Liability
+
+> Under no circumstances and under no legal theory, whether tort
+> (including negligence), contract, or otherwise, shall any
+> Contributor, or anyone who distributes Covered Software as
+> permitted above, be liable to You for any direct, indirect,
+> special, incidental, or consequential damages of any character
+> including, without limitation, damages for lost profits, loss of
+> goodwill, work stoppage, computer failure or malfunction, or any
+> and all other commercial damages or losses, even if such party
+> shall have been informed of the possibility of such damages. This
+> limitation of liability shall not apply to liability for death or
+> personal injury resulting from such party's negligence to the
+> extent applicable law prohibits such limitation. Some
+> jurisdictions do not allow the exclusion or limitation of
+> incidental or consequential damages, so this exclusion and
+> limitation may not apply to You.
+
+
+### 8. Litigation
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+
+### 9. Miscellaneous
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+
+### 10. Versions of the License
+
+#### 10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+#### 10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+#### 10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+#### 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+## Exhibit A - Source Code Form License Notice
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+## Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/vendor/im-rc/README.md b/vendor/im-rc/README.md
new file mode 100644
index 0000000..d95c071
--- /dev/null
+++ b/vendor/im-rc/README.md
@@ -0,0 +1,28 @@
+# im-rs
+
+[![Crate Status](https://img.shields.io/crates/v/im.svg)](https://crates.io/crates/im)
+
+Blazing fast immutable collection datatypes for Rust.
+
+Comes in two versions: [`im`](https://crates.io/crates/im) (thread safe) and
+[`im-rc`](https://crates.io/crates/im-rc) (fast but not thread safe).
+
+## Documentation
+
+* [API docs](https://docs.rs/im/)
+
+## Licence
+
+Copyright 2017 Bodil Stokke
+
+This software is subject to the terms of the Mozilla Public
+License, v. 2.0. If a copy of the MPL was not distributed with this
+file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+## Code of Conduct
+
+Please note that this project is released with a [Contributor Code of
+Conduct][coc]. By participating in this project you agree to abide by its
+terms.
+
+[coc]: https://github.com/bodil/im-rs/blob/master/CODE_OF_CONDUCT.md
diff --git a/vendor/im-rc/build.rs b/vendor/im-rc/build.rs
new file mode 100644
index 0000000..02d8da3
--- /dev/null
+++ b/vendor/im-rc/build.rs
@@ -0,0 +1,25 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use std::env;
+
+fn main() {
+ println!("cargo:rerun-if-changed=build.rs");
+ if let Some(channel) = version_check::Channel::read() {
+ if channel.supports_features() {
+ println!("cargo:rustc-cfg=has_specialisation");
+ }
+ }
+ let pkgname = env::var("CARGO_PKG_NAME").expect("Cargo didn't set the CARGO_PKG_NAME env var!");
+ let test_rc = env::var("IM_TEST_RC").is_ok();
+ match pkgname.as_str() {
+ "im" => {
+ if !test_rc {
+ println!("cargo:rustc-cfg=threadsafe")
+ }
+ }
+ "im-rc" => {}
+ _ => panic!("unexpected package name!"),
+ }
+}
diff --git a/vendor/im-rc/debian/patches/disable-features.patch b/vendor/im-rc/debian/patches/disable-features.patch
new file mode 100644
index 0000000..3fcaa28
--- /dev/null
+++ b/vendor/im-rc/debian/patches/disable-features.patch
@@ -0,0 +1,45 @@
+Index: im-rc/Cargo.toml
+===================================================================
+--- im-rc.orig/Cargo.toml
++++ im-rc/Cargo.toml
+@@ -37,9 +37,9 @@ all-features = true
+ [lib]
+ path = "./src/lib.rs"
+
+-[dependencies.arbitrary]
+-version = "1.1"
+-optional = true
++#[dependencies.arbitrary]
++#version = "1.1"
++#optional = true
+
+ [dependencies.bitmaps]
+ version = "2"
+@@ -62,9 +62,9 @@ version = "0.6"
+ version = "1"
+ optional = true
+
+-[dependencies.refpool]
+-version = "0.4"
+-optional = true
++#[dependencies.refpool]
++#version = "0.4"
++#optional = true
+
+ [dependencies.serde]
+ version = "1"
+@@ -106,10 +106,10 @@ version = "0.9"
+
+ [features]
+ debug = []
+-pool = [
+- "refpool",
+- "sized-chunks/refpool",
+-]
++#pool = [
++# "refpool",
++# "sized-chunks/refpool",
++#]
+
+ [badges.travis-ci]
+ repository = "bodil/im-rs"
diff --git a/vendor/im-rc/debian/patches/disable-tests-proptest-derive.patch b/vendor/im-rc/debian/patches/disable-tests-proptest-derive.patch
new file mode 100644
index 0000000..07826db
--- /dev/null
+++ b/vendor/im-rc/debian/patches/disable-tests-proptest-derive.patch
@@ -0,0 +1,129 @@
+Index: im-rc/Cargo.toml
+===================================================================
+--- im-rc.orig/Cargo.toml
++++ im-rc/Cargo.toml
+@@ -86,9 +86,6 @@ version = "1"
+ [dev-dependencies.proptest]
+ version = "1"
+
+-[dev-dependencies.proptest-derive]
+-version = "0.3"
+-
+ [dev-dependencies.rand]
+ version = "0.8"
+ features = ["small_rng"]
+Index: im-rc/src/tests/hashset.rs
+===================================================================
+--- im-rc.orig/src/tests/hashset.rs
++++ im-rc/src/tests/hashset.rs
+@@ -7,15 +7,14 @@ use std::hash::Hash;
+ use crate::HashSet;
+
+ use proptest::proptest;
+-use proptest_derive::Arbitrary;
++//use proptest_derive::Arbitrary;
+
+-#[derive(Arbitrary, Debug)]
++#[derive(Debug)]
+ enum Action<A> {
+ Insert(A),
+ Remove(A),
+ }
+
+-#[derive(Arbitrary)]
+ struct Actions<A>(Vec<Action<A>>)
+ where
+ A: Hash + Eq + Clone;
+@@ -50,7 +49,7 @@ where
+ }
+ }
+
+-proptest! {
++/*proptest! {
+ #[test]
+ fn comprehensive(actions: Actions<u8>) {
+ let mut set = HashSet::new();
+@@ -82,4 +81,4 @@ proptest! {
+ assert_eq!(HashSet::from(nat.clone()), set);
+ }
+ }
+-}
++}*/
+Index: im-rc/src/tests/ordset.rs
+===================================================================
+--- im-rc.orig/src/tests/ordset.rs
++++ im-rc/src/tests/ordset.rs
+@@ -6,15 +6,13 @@ use std::fmt::{Debug, Error, Formatter,
+ use crate::OrdSet;
+
+ use proptest::proptest;
+-use proptest_derive::Arbitrary;
+
+-#[derive(Arbitrary, Debug)]
++#[derive(Debug)]
+ enum Action<A> {
+ Insert(A),
+ Remove(A),
+ }
+
+-#[derive(Arbitrary)]
+ struct Actions<A>(Vec<Action<A>>)
+ where
+ A: Ord + Clone;
+@@ -49,7 +47,7 @@ where
+ }
+ }
+
+-proptest! {
++/*proptest! {
+ #[test]
+ fn comprehensive(actions: Actions<u8>) {
+ let mut set = OrdSet::new();
+@@ -82,4 +80,4 @@ proptest! {
+ assert!(nat.iter().eq(set.iter()));
+ }
+ }
+-}
++}*/
+Index: im-rc/src/tests/vector.rs
+===================================================================
+--- im-rc.orig/src/tests/vector.rs
++++ im-rc/src/tests/vector.rs
+@@ -5,9 +5,9 @@ use std::fmt::{Debug, Error, Formatter,
+ use crate::Vector;
+
+ use proptest::proptest;
+-use proptest_derive::Arbitrary;
++//use proptest_derive::Arbitrary;
+
+-#[derive(Arbitrary, Debug)]
++#[derive(Debug)]
+ enum Action<A> {
+ PushFront(A),
+ PushBack(A),
+@@ -21,7 +21,6 @@ enum Action<A> {
+ SplitRight(usize),
+ }
+
+-#[derive(Arbitrary)]
+ struct Actions<A>(Vec<Action<A>>)
+ where
+ A: Clone;
+@@ -117,7 +116,7 @@ fn cap_index(len: usize, index: usize) -
+ }
+ }
+
+-proptest! {
++/*proptest! {
+ #[test]
+ fn comprehensive(actions: Actions<u8>) {
+ let mut vec = Vector::new();
+@@ -215,7 +214,7 @@ proptest! {
+ assert_eq!(nat.iter().cloned().collect::<Vector<_>>(), vec);
+ }
+ }
+-}
++}*/
+
+ #[test]
+ fn test_inserts() {
diff --git a/vendor/im-rc/debian/patches/replace-metrohash-with-keccak.patch b/vendor/im-rc/debian/patches/replace-metrohash-with-keccak.patch
new file mode 100644
index 0000000..333fbdc
--- /dev/null
+++ b/vendor/im-rc/debian/patches/replace-metrohash-with-keccak.patch
@@ -0,0 +1,80 @@
+Replace metrohash with keccak, this is only used in one test
+and one test doesn't justify adding a new crate to Debian.
+
+Index: im-rc/Cargo.toml
+===================================================================
+--- im-rc.orig/Cargo.toml
++++ im-rc/Cargo.toml
+@@ -76,8 +76,9 @@ version = "0.6.4"
+ [dependencies.typenum]
+ version = "1.12"
+
+-[dev-dependencies.metrohash]
+-version = "1"
++[dev-dependencies.tiny-keccak]
++version = "2.0"
++features = ["keccak"]
+
+ [dev-dependencies.pretty_assertions]
+ version = "1"
+Index: im-rc/src/test.rs
+===================================================================
+--- im-rc.orig/src/test.rs
++++ im-rc/src/test.rs
+@@ -2,8 +2,9 @@
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+-use metrohash::MetroHash64;
++use tiny_keccak::Keccak;
+ use std::hash::{BuildHasher, Hasher};
++use tiny_keccak::Hasher as tiny_keccak_Hasher;
+ use std::marker::PhantomData;
+ use typenum::{Unsigned, U64};
+
+@@ -64,6 +65,34 @@ impl<N: Unsigned> Default for LolHasher<
+ }
+ }
+
++pub(crate) struct KeccakHasher {
++ k : Keccak,
++}
++
++impl KeccakHasher {
++ fn with_seed(seed: u64) -> KeccakHasher {
++ let mut k = Keccak::v256();
++ let sb = seed.to_le_bytes();
++ k.update(&sb);
++ KeccakHasher { k }
++
++ }
++}
++
++impl Hasher for KeccakHasher {
++ fn write(&mut self, bytes: &[u8]) {
++ self.k.update(bytes);
++ }
++
++ fn finish(&self) -> u64 {
++ let mut rb: [u8; 8] = [0;8];
++ let k = self.k.clone();
++ k.finalize(& mut rb);
++ return u64::from_le_bytes(rb);
++ }
++}
++
++
+ pub(crate) struct MetroHashBuilder {
+ seed: u64,
+ }
+@@ -79,8 +108,8 @@ impl MetroHashBuilder {
+ }
+
+ impl BuildHasher for MetroHashBuilder {
+- type Hasher = MetroHash64;
++ type Hasher = KeccakHasher;
+ fn build_hasher(&self) -> Self::Hasher {
+- MetroHash64::with_seed(self.seed)
++ KeccakHasher::with_seed(self.seed)
+ }
+ }
diff --git a/vendor/im-rc/debian/patches/series b/vendor/im-rc/debian/patches/series
new file mode 100644
index 0000000..54e19bc
--- /dev/null
+++ b/vendor/im-rc/debian/patches/series
@@ -0,0 +1,3 @@
+disable-features.patch
+replace-metrohash-with-keccak.patch
+disable-tests-proptest-derive.patch
diff --git a/vendor/im-rc/proptest-regressions/hash/map.txt b/vendor/im-rc/proptest-regressions/hash/map.txt
new file mode 100644
index 0000000..698800a
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/hash/map.txt
@@ -0,0 +1,16 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+xs 3591451162 2655640551 804983804 3307909230 # shrinks to ref m = {-13697: 30985, 1338: 29274, -14139: -4092, 673: -19662, -19198: 333, 9155: -4794, -24816: -12851, 14658: -17795, 23662: -25253, -4783: -12972, -31711: -1639, -26495: 16710, -7087: -26434, 18175: -4121, 5045: 8040, -23549: 17012, 6304: -7492, -23305: -28186, 606: 8452, -15872: 2415, 17913: 2306, -20500: 28581}
+xs 1457767450 3825624317 1539332905 3279740856 # shrinks to ref m = {7136: -9742, -7547: 13954, -15860: 17017, -31620: -15850, 25480: -13526, 9943: -13939, 1142: 22444, 20378: -26706, -10165: -14641}
+xs 2468731224 2159341902 336190467 4018852179 # shrinks to ref m = {22114: -20101, -30886: -4356, 29938: 40, 6256: -29990, 8450: -21821, 30253: 901, -10781: -24620, 22431: 593}
+xs 1344206258 166909451 3875523340 3155104601 # shrinks to ref m = {25488: 22186, -4852: 28282, -5097: 4497, 29501: 8087, -29096: -18313, 22286: -17383, 30624: 25063, -2270: -1319, 31014: -28777, 23935: 1507}
+xs 2403854785 21349881 2962261870 427550728 # shrinks to ref pairs = [(-17914, 0), (16838, 0)]
+xs 1508395022 1122347352 4113209817 3965614759 # shrinks to ref m = {0: 0, 1: 0}
+xs 1627474128 2843908894 3937915137 1370561421 # shrinks to ref input = {0: 0}, index_rand = 0
+xs 1863744963 3828268266 3976454353 1279901501 # shrinks to ref m = {1033: ",¦⾘f\u{b}C\u{bae94}}$n\"\u{fc28d}\u{feff}\u{b}-", 2568: "\u{8db77}ꖽ\r\u{7af7f}�7\u{a7bf3}\u{393b9}\u{0}G\u{8}\'%5E\u{cd0dc}?\u{ba311}%\u{ee814}Ѩ\\\u{80aa1}", 3527: "\u{41005}\u{41ff0}$`,L&%\u{1b}~\u{36ada}", 3577: "\u{feff}5\u{109dd9}:\u{8}\u{3}𬃹\u{3c2b6}\\\"5𡂏\'\u{feff}%\u{b8c12}?", 4544: "0*8🕴�\u{33669}\r\"\u{92011}𮡱<\u{0}<\u{1}$\u{1},\u{f1234}{G\u{1b}J\u{ceaa4}\\", 4560: "🕴\r\tѨ@\u{edbda}\u{1b}t�\u{b}\u{2}�ò\u{80090}.\'\u{34690}g%Ѩ\u{0}=\u{1}", 7113: "*", 7944: "¨\u{b6d08}$🕴&{H\rUi\u{feff}\u{0}.¥ô{_*\u{d73fc}:Ѩf`2.*\u{c9c6c}", 8738: "%𬊢*:Ä\u{90}\u{b}\u{48d7b}\"\u{4}"}
+xs 1567907912 1646837549 2298759549 1787615177 # shrinks to ref pairs = [(-28601, 0), (2569, 0), (-3384, 0), (5639, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (-30583, 0), (0, 0), (-154, 0), (-27, 0), (105, 0), (-29, 0), (9, 0), (9, 0), (-508, 0), (-478, 0), (-4095, 0), (-2017, 0), (-130, 0), (27145, 0), (2345, 0), (3241, 0), (458, 0), (-6211, 0), (361, 0), (-4772, 0), (-7717, 0), (4265, 0), (-1144, 0)]
+xs 2574157460 1821361166 2171243272 102290569 # shrinks to ref pairs = [(0, 0), (7, 0), (7, 0), (2055, 0), (0, 0), (-9530, 0), (0, 0), (6, 0), (6, 0), (0, 0), (6, 0), (0, 0), (0, 0), (0, 0), (0, 0), (-11133, 0), (-161, 0), (-2, 0), (-2051, 0), (-3111, 0), (-2092, 0), (0, 0), (24131, 0), (-5278, 0), (6, 0), (70, 0), (0, 0), (6, 0), (6, 0), (-31, 0), (-3492, 0), (-2373, 0), (8902, 0), (-2438, 0), (3014, 0), (7206, 0), (6854, 0), (15161, 0), (-699, 0)]
diff --git a/vendor/im-rc/proptest-regressions/hash/set.txt b/vendor/im-rc/proptest-regressions/hash/set.txt
new file mode 100644
index 0000000..a107156
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/hash/set.txt
@@ -0,0 +1,7 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+xs 4213962225 2884706512 1606470227 2259275645 # shrinks to ref s = {"\\\u{4}\u{b}\u{c7afb}Q$x/\u{1a4f0}\u{1}\u{399ac}$.\u{0}=J>\"\u{2}=\t\t*q乣\'?6\u{ca350}\u{a20b5}", "\u{b50f2}$", "\u{de54f}/¥\u{1b}{*\"¥*:\\\u{e77d2}*s`?\u{3}/\u{9daa7}\t\u{1b}\":\'\u{7cf05}G🕴j", "\u{a2848}\u{bf244}.$=d\u{51d0f}¥\u{98d35}\u{3457c}<`𖡒{\"k�\t.$u\u{0}.", "!`", "\u{4}\u{9c2d9}r\u{d33a9}¥쇛\u{cd875}\u{7f}\\\u{37b37}`\u{b}\ruR\r\t\u{8aaa0}\\&`\u{b}\u{feff}\u{b868c}\u{a976e}\u{0}\\X\u{514dd}&k", "\u{feff}🕴M", "\u{b162a}S\u{6}\"\r\u{4b435}🕴 \\\u{b16df}\'\u{3468e}\\", "÷/\\\u{4dfaf}\u{7f}*\u{47f16}\"�aZ\r(Tj\u{1b}记\t;¥*<\u{1b}E\u{8d037}"}
diff --git a/vendor/im-rc/proptest-regressions/ord/map b/vendor/im-rc/proptest-regressions/ord/map
new file mode 100644
index 0000000..ce47e6b
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/ord/map
@@ -0,0 +1,20 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+xs 1087347487 1450735596 3800950698 1648897824 # shrinks to ref m = {29894: -24214, -22768: -29852, -25204: 19090, -22710: 4694, -27608: 14656, -27740: 29393, 7285: -78, -3041: 77, 20980: 467, 13472: 3518, 2845: -9597, 6987: -29072, -30486: 827, -1022: 15821, 22068: -24552, 6293: -21073, -7161: 10155, 3791: -27929, 6361: 15318, 3190: 30164, 31756: 4331, 11824: 30151, -14319: -451, -17781: -5693, -5991: 372, -27192: -2983, 23456: 21711, -19546: 28578, -9753: 30988, 21193: 22302, 432: 24303, -15110: 26679, -11612: -6722, 12373: -31848, -20837: -16031, 25861: -12660, -23775: 32410, -6760: 25269, 21702: -26852, -17649: 27279, -12789: -28758, -26032: 6316, -16837: -16182, 31817: -24478, -3564: -20084, -5315: 23517, 11955: -29343, 9175: -4003, 20615: -19515, -3453: 24768, -28231: 3065, 10336: -24811, -8978: 17861, 23428: 19571, -450: 14904, -5293: -12205, -15735: -13395, 12747: -25893, 29368: 14652, 16863: -31998, 29612: 2394, 3212: 4512, -2804: 16628, -9070: 2599, -8946: -6150, 22872: -15322, -12672: 22236, 8415: -22569, 18541: -20698, 12395: -11080, -3888: -6244, -4893: 21952, -3595: 16707, 11722: -9301, 23547: 8317, -10052: -5551, -8428: -1168, -6805: 1438, 6185: 27026, 9265: 14429, -7016: -19640, 4739: 28713, 27505: -9101, -21379: 11843, 10141: 26568, -27662: -7672, -5384: -15814, -31927: 23347, 28068: -13380, -3075: 11627, -28778: 26949, 821: 22814, 11572: 16591, -10426: 5726, -14986: 6492, -4472: -12187, -22049: -18715, 3822: -26724, -13821: 24964, 14780: 23541, -26068: -17472, 6419: -16387, -21443: -32036, -27285: -11138, -12544: -22185, -25942: -22158, 8799: 22607, 22203: 23175, -29997: 9170, 18341: -19711, -25162: -29851, 29377: -4845, -4337: -3624, -30764: 13318, 2000: 6862, 13510: 4642, 25068: -1590, 16270: -1390, -23439: 16616, -13611: 30094, 10084: -30492, -6677: 12289, 28032: -21767, 10105: 8774, 627: 24722, 27190: 3954, -26665: -7354, 27566: -8037, 15625: -9453, -30151: -25954, -28349: 30379, -6142: 691, -9262: 24633, 27808: -5306, 11490: -10950, 22022: -705, 7283: -7208, 29941: 6208, -4204: -2121, -9279: 17669, -4498: -4582, -4833: 29055, -22069: 27589, 32004: -31982, 4036: 11622, -5971: 6511, 7362: -31402, 2132: 16965, -17605: 3529, 16899: -16958, 20305: -26766, 18755: 21882, 13064: -29474, 1391: -25296, 9071: -8029, -20305: 30895, 167: 21243, 23450: -32278, -22095: 13405, 12963: 18120, 24666: 28046, 14320: 8050, 30437: -12581, 17277: 15852, -19808: -27963, -23409: 24638, 29401: 15328, -21257: -3018, 28299: 29000, 18823: -8987, 15409: 9114, -2476: -12749, 5807: -25088, -17559: 19530, -3994: 32042, -23994: 11576, 17613: -11312, 24203: 30135, 14421: 29461, -8181: 17641, 6171: -20014, 31027: 1105, 20177: 11742, 28023: 10685, -5413: 22256, -29512: -27827, 26068: -31380, 10750: 9166, -19988: 26137, 6165: -12868, -9662: 15887, 12809: -12054, 25972: 23426, -3522: 11010, -13516: 10518, -20198: 8172, -20051: -21390, 17149: 27954, -25908: -3999, 22600: -21800, -15240: -21275, -12894: -31550, 11168: 6165, 1471: -30312, 25562: 31867, -3575: -5407, 16896: -21901, -31594: -2825, 24966: -2987, 31931: 19139, -671: 16835, -13289: 32113, -7420: -21883, -26225: -29508, 14029: -23627, 13600: 7738, 19823: 22879, -7278: -31931, -18518: -15028, -24285: 15271, 30158: -6041, -7778: -10728, 18967: -9084, 12216: 15282, 7667: -29473, -29079: 5065, 28475: 262, 9873: 455, 14700: 2632, -6257: 15024, 2641: -23165, 25766: -21115, 30853: -8411, 24163: -4764, -30666: 17364, -14056: 31344, -16470: -21166, 7863: -28957, 28281: -15377, 4107: -8950, -9388: -32765, 24227: -9133, -10558: 13655, 23295: 9762, -3019: -27437, 11095: 29763, 10609: 12051, -19079: 16494, -638: -5842, 4362: 27932, 2639: -25626, -3030: -14761, 21408: -18773, -21262: -4491, -5008: 1094, -11589: -2784, 15655: 29651, -19013: -9552, 7540: -28066, 18000: 17054, 29752: 18144, 28226: 27155, -12924: 7241, 22083: 13808, -18448: -3080, 29456: 16400, 53: -12710, -1221: 30244, -16504: 24240, 5545: -27714, -20630: -18870, -21090: 28104, 4959: 12418, -15608: 1794, -23432: -22218}
+xs 2470012874 1108569466 2705233914 2105395150 # shrinks to ref m = {-26536: -10140, -31941: 2328, -23547: -9253, -28157: -17639, -2098: -25615, 9417: -4376, 5027: 16722, 17121: -24663, 8128: -25969, 25933: 18490, -25489: 10837, -13402: 29678, 31055: 14092, -3811: 19345, 3565: -15536, 8160: 25591, 21133: -5677, 31382: -12602, -4552: -6140, 23595: 6118, -5496: 2443, 25445: -32364, 1737: -5168, -9077: -15214, 7942: -27346, 503: 29459, 30229: 31798, -21623: -984, -20767: 1391, -20732: -5138, 179: -2480, -30700: 32256, 23991: -29242, 5811: -2677, 8242: -19246, 14001: 121, 23994: 15968, 16850: 22675, 27403: 20078, 28998: 29713, -18285: -28709, 15265: -345, -2024: -7961, -26394: -16075, -15563: -14632, 3611: -4743, -16600: 8421, 9494: 30533, -26355: -7995, -31604: 15030, -28372: -30678, -1460: 4493, 12812: 6867, 3327: 5994, -27683: -25261, -6712: 14346, 20460: 1089, 10960: 1352, 24869: -29446, -8174: 30195, 24471: -27707, 26252: 15759, -17935: 12699, -19327: 31902, 10672: -17255, -3178: -31772, 14367: 13488, 9093: 13209, -20473: -9178, -31120: 3147, -5795: -3982, -24184: 19687, -8033: 16211, -12944: 8417, -9993: 4190, 2100: 30585, -1397: -27306, 68: -17544, 12442: -4284, 7519: -12190, 22795: -29312, -21157: -16782, -32441: -15527, 3210: -4247, 32108: 9123, 24488: 25516, 11162: -10170, -19251: -2295, -28559: -4773, 31985: 172, -227: 30045, -2104: 26418, -3076: 15669, 14672: 12100, 7576: -13667, -5021: -32276, 21621: 29212, 13537: -19166, -2389: 8930, -4556: -31064, -10630: 3433, 29934: 12298, 6640: -32416, 29552: -6676, 2449: 9495, -20587: -24712, -12359: 29691, -26177: -31729, 4421: -9542, -9965: 7463, 28677: 26334, -27845: -6260, 13285: 11380, 32752: -20965, 15706: -17233, 29886: 13339, 17438: -28315, 26609: 30547, 15151: -15429, -2919: -19952, 16934: -32480, 26615: 24385, 233: -32369, -10268: -10139, 29343: -30102, -15885: 30182, 15822: 25778, -26549: -2360, 2001: -4014, -12019: -1196, 731: 29634, -29995: -22547, -15831: -27743, 1976: -14216, 24671: 21678, -10275: -5156, 28289: 17246, 12893: -32150, -16308: 7767, 5729: 11546, 18882: -31578, -4231: 18279, -25379: -31185, -1139: -16861, -18054: -8385, -31606: -23236, 21235: 7426, -6400: -7360, -8606: -2630, -22484: -11090, 15370: -5085, 5679: -17878, -28308: -24539, 9009: -24480, -16109: -19862, -20544: -20765, -6411: -28066, 11890: 21190, 4579: -7721, -22198: -22517, 338: -4143, 12184: -11969, -15946: -24141, -23654: 2485, 9886: -26974, 11733: 28587, -8243: -20115, 13309: 31556, -14397: -19926, 29872: 19550, -4716: -14669, 16769: 14751, 8353: 18931, -22070: -5371, 24224: -26199, 24823: -30739, 9421: -13020, 19874: -2767, -10193: 2881, 6660: 1643, -31321: -16602, -12356: -8592, 7484: 15900, 4220: 7816, 2781: -7331, 17673: 7955, 21734: -2072, -4406: -26944, -2747: 17863, 4584: -2492, 31654: 15772, -10883: 4363, -3737: 3686, -18179: 30440, 18460: 23217, -3702: 15120, 14407: -18596, 7749: -11497, -27197: 12065, 15409: 18406, 1457: 4533, 24941: 24486, 12520: -29147, 9179: 31948, -14078: -21063, -22741: -21277, 29691: 24484, 13093: 30490, 11422: -28999, 19850: 28538, 58: -1946, 26401: -32289, 16997: -26844, -23467: -28453, 24138: -6868, -14289: 2223, -3164: -12604, -24071: -11711, 6645: -19591, 17685: 9616, -29576: 31095, 15812: -19219, -30119: 20657, -9465: -20600, 5077: 19208, -10326: 3699, 27078: -4075, -7152: 28943, 14558: -22676, -10615: 31120, 29487: 29114, -6096: -1001, 5941: -21634, -30352: 30888, 582: -23140, 16391: 7248, 25557: -14944, 21501: 18193, 11316: 11352, 18183: 17500, -18516: 2584, -2107: -32422, -8402: 12344, -17372: 11869, -15723: 2627, -1765: 19581, 2975: 1, -5867: 23341, 25489: -2444, 9809: 21415, 29497: -18101, -25328: 28247, 9621: -3108, 28275: 8915, 6846: 3451, 28008: 18058, 6195: 10677, 12779: 1341, 13248: 30900, -18786: 27113, -26425: 9293, 16195: 8935, -2461: -16811, -31431: 4635, -9480: 779, -22487: 19715, -15600: -8938, 29782: -1315, 8079: -27635, 3322: 10561, -23910: -4240, -10716: 3872, 12155: -11450, -23322: -27745, 3206: 9309, -23080: 1961, 6761: -31058, 28940: -20745, -29586: -5915, -9310: -8874, 23578: -31849, -24336: 2811, -31640: 13432, 17145: 4078, -10857: 25423, -28879: 7602, 8971: -12084, -19239: 2917, -32289: 12788, 10482: -26779, 7196: 18090, 17174: -28319, -16874: -29949, -10772: 15992, -1774: 239, 5296: -15898, -8433: 14050, -12827: 28010, 29685: -21923, -4742: 18358, -9399: 13522, -3136: 23448, 9803: -30280, 4633: 9138, 22129: -3054, -24759: -3027, 13549: -10895, 770: 13115, -22180: -30951, 26425: 26303, 15351: -14655, -2361: 9031, 21063: -15719, 26334: -23261, 1253: 4242, 21284: -31915, -16220: 4816, 957: -25495, -454: 18872, 8183: 8829, -21137: -20303, -6282: 12896, -23187: 23, -32053: 21416, -924: -16666, -30888: 11634, 31358: 22911, -6028: -984, -28864: 9371, 28554: 18962, 13368: -9926, 25395: 11310, -22859: -15920, 24079: 24924, -20238: -29669, -2746: -24651, -21422: 21027, 30773: 9672, -8756: -14597, -11425: 30250, -8475: 3559, 14902: 23939, 32064: 4283, 15572: 18467, -8531: -31074, 26651: -5381, 27619: -17005, -29712: 2868, 16457: 20436, -11057: -2269, 3024: -15357, 15023: -26768, 14212: -26881, -19185: -18690, -4924: 7128, 23174: -20610, -9472: -16907, 17569: -23072, 20118: -14428, 9805: 26597, 6994: -8522, 2040: -32366, 25162: -31175, -1386: 16672, -22403: 26995, 7584: 27458, -17532: -141, 18644: 3005, 24808: 28562, 9341: -5445, -25768: 32689, 16892: 17059, -30689: -12568, 28747: -19363, -2091: 1259, -11643: -20020}
+xs 1943497849 4012822781 687301666 4052323690 # shrinks to ref input = {-14552: -9546, -24687: 4553, -5948: -11033, -30216: 31225, -1329: 18654, 25756: 28243, 26320: 32308, 14380: 20303, 30195: -29219, 12769: -13515, 4261: -10098, -15032: 27827, 22373: -30648, -18543: -27064, 20765: -17004, -7193: 29946, 17191: -11212, -9550: 6145, 30413: -3896, 25650: 15492, 6991: -3005, -27117: -18341, -31108: -14720, 2037: -9230, 21209: -17697, -17478: -15083, -7092: -21790, -18620: -19170, 7611: -13546, -10267: -19624, -32677: 26187, 23727: 29533, -3698: -10243, 5300: -3822, 346: -5404, -22233: 16053, 18668: 22996, 2804: 14570, -7140: -914, 29328: 531, 22194: 580, -29271: 32284, -30855: -25589, -24039: 22663, -17584: -7090, 30655: -22419, 6962: 3019, -11388: -29702, 7470: 10191, 12733: -8953, 31781: 29536, -4713: 28624, 29225: 2850, 10639: -17353, 28644: -28651, 27509: 26751, -21653: -3068, -23302: 16505, 23875: -4223, -12294: 8408, 22871: -26300, -11807: -10674, 11617: -20802, -12917: -3942, 12525: 8275, -28360: 25924, -11694: -17660, -8376: -23674, 28022: -11052, 1701: 16466, -10152: 27738, 25396: 3306, 27309: -15176, -24958: 25332, 13257: -9440, 28652: -31476, 28824: -25210, 19544: -26806, -16312: -554, -29314: -25624, -6344: -27482, 12638: 11012, 29993: -5753, -7052: -5445, 6885: -32534, -2710: 15172, 25838: -29888, -4162: 25600, 8274: 3660, 14914: -11250, 18077: 21149, 30865: 29780, 7652: -29810, -27575: -22324, 27190: 13088, -28712: -24931, 32575: 14212, 16100: 2414, 22459: -12558, 12914: 12488, -5756: 26535, -11609: 21588, -23178: 22887, -6623: 10056, 11425: 5119, -24807: 1930, 20747: -2695, 22174: 28280, 26661: -7627, -22429: 26131, 30256: -13483, -23654: -6600, 23857: 20134, -6396: 26307, 27673: -19775, 21325: -20165, 18149: -5624, -16291: 20822, 30797: -19910, -16498: -12698, -28455: -13778, -19937: 16733, 22899: 23440, 20491: -29335, 6724: -14015, 20327: 29236, -13404: 17062, 21857: 21139, -11068: -11817, -24465: -19689, 13258: -20349, -8846: 24655, -14100: -5192, 18797: -4050, 15238: -20885, 21853: -14590, -21265: -5581, 7767: 16287, -29108: -18338, 15365: -10543, -28008: 20715, -27679: 9383, 28946: -32523, -6815: -11660, 25311: -30043, -24259: -32354, -26480: -29813, -4922: -31962, -23235: -14838, -28240: -16289, -20429: -10753, -31466: 4099, 17742: 9919, 22328: -29633, 11484: 5947, -30743: -3454, 27329: -28404, -1440: 16220, -21058: -15381, -7339: 775, 23003: 3428, -29181: -11177, -7918: 18487, 26135: -17235, 31493: -32374, 8674: -29831, 23135: 3319, 22008: 26647, 14087: 926, 9495: 32645, -28424: 4358, -28839: -25000, 12270: 1203, -3843: 24513, 28974: 3537, -11154: 20241, -308: 15509, -1063: 1938, 22352: 16339, 22065: -4794, 25625: 30704, -29994: 25473, -32588: 8066, -19799: -28784, -16369: -7522, 12819: -26116, -10: -12210, 23530: -8239, -8702: 15218, -29559: -6059, 17386: 8272, 9791: 11158, 31268: -23502, 839: -12740, -20953: 30929, -6498: -6179, 18058: 26452, 17715: 21182, -444: 26708, -12166: -10624, -17286: -11707, -5285: 28283, 26686: 28422, -27560: 24488, -9092: -21679, -341: 5249, -1777: -19160, -8798: -18074, 5664: -26770, 8831: 21172, -15630: 10171, 10815: -23739, 10322: -14746, 3683: -28968, -968: -11470, 4300: -21106, 17329: -3943, 919: 15039, 11736: 24420, 18566: 8425, -6499: 17007, 1038: -20933, -1760: 2435, 32364: 17255, -23412: -10508, -20606: -2288, -12261: -24932, 23266: -16759, 29366: -24835, -4536: -26835, 11130: 15321, 9689: -25898, 10497: -8, 8379: -17866, 32503: 1391, -7464: -7476, -10905: 21006, 28934: 27973, -2489: 22253, 18422: -3749, -16897: -26476, 26037: 24177, 25372: -5235, -17793: 5394, -31916: 8290, 2514: 17926, -12681: 10612, -31402: 4216, -21993: 5489, -333: -29732, -7208: 12324, -2259: 7182, -14269: 19700, 7113: -6447, 312: 21681, 16777: -5191, 19799: -22785, -16984: 20498, 13781: -19721, -15005: -27421, -5197: 16418, -26014: 14386, -21116: -29472, 22218: -3249, -12769: 13282, -962: 27871, 323: -26453, -9145: 28365, 20899: 5521, 2983: -28582, 27272: 17304, 14965: 6793, 1119: -8804, 11980: 24389, -27467: 31369, -6059: 22193, 11148: -13064, 28685: 13279, 9266: 23559, 491: 31840, -24358: 20417, -1039: 32656, -8354: 27428, -6823: 13026, 7306: -28986, -29124: -12391, 11358: 19868, 21852: 31747, -354: 17738, -6380: -31076, 6993: -3593, 7749: -26991, -5736: 26845, -23757: -25868, -23018: 21291, -29482: -13037, -28028: -17152, -11500: -2400, 14240: 27368, 8517: -7890, 3318: 26016, 8702: -21694, -15698: -18674, -29992: -16745, 17497: 3921, 17256: 23908, 12994: 16354, -12133: -5976, -9636: -19253, 13662: 26694, -5291: -27961, -19711: -2634, 24676: 200, -21683: -20419, -10755: -20201, 5389: -24265, -18644: 25881, 24013: 26905, -15710: -40, -1078: 24024, 29202: 25073, 7358: 5121, -23181: -31628, 10282: -26184, -20910: -2762, 31789: -11576, -15966: 18578, -14285: 3170, 1448: -13499, -10080: 23097, 9012: -30126, -15463: -12150, 20289: 31453, -23544: -15457, 14694: -5005, 25006: -25213, 20402: -18375, 29679: 20672, -4570: -7111, 22495: -6454, 28869: 31665, 14191: 13852, 16134: 32353, 4529: 8494, 19093: 6864, -794: 18776, 17957: -11241, 25597: -20134, 18037: -1679, 27835: 3288, 22315: -10272, 13032: 9697, -20215: 3797, -12773: -983, 25848: -4873, 19596: 9706, 8030: -28925, 30246: 12946, 7467: -25254, -10731: 6363, 18631: 8976, 1414: -13096, 1779: 15953, -3595: 21321, 339: -8066, -7639: 14039, 20195: 12164, 7156: -11669, 16411: -8927, 13534: -14503, 13577: 17546, -27772: -32545, -6421: -3173, -12316: 16200, -31884: 603, 12395: 3034, 22659: 25898, 30481: -23170, -16623: 20360, -20279: 30762, 3968: -13181, -2313: -4445, -13314: 13183, 17186: -472, -25465: -11926, -12985: 12936, -17260: 21153, 14971: 366, 5035: 29873, 29: 19702, -29547: -10586, -10368: 11518, -13759: -4543, -29208: -4931, 1605: -15282, 22500: 24270, -25324: -150, -24578: -5930, -25949: 21945, -10053: 2314, 19195: 24191, -6760: 32697, -8885: 28695, 12676: -18931, -24963: 5956, -11667: -32632, 3496: -7015, -3422: 24361, 17031: -19643, -21362: 28410, 11868: -24693, 26928: -25916, -8771: -10298, -19434: 29046, 16057: -21815, -28508: -1488, 17240: -23998, 3146: 4003, -8669: 1658, -2885: 3442, 19212: -25066, 8584: -30453, -19749: 25649, 12925: 1864, -7982: -17592, -18312: -6020, 26066: -12698, 10168: 2258, 23411: -27324, 20913: 2058, -17161: -2704, -28674: -8941, 19334: -154, 29314: -18570, -4291: 13987, 27890: -10595, -6139: -19690, -2185: 29099, -19246: -21481, 18345: -7746, 8792: 32374, -12093: -11963, 27898: 28419, -2679: 31973, -6053: -9814, 28750: -1279, 5512: -22468, 24559: 13801, 29152: 10421, -8834: 21875, -11673: 15773, 28602: -9755, -5742: 6786, 13086: 15119, -10716: 23940, -31277: 6551, -12006: 16878, 31399: 15139, -3499: -14162, -7428: -10133, 31533: -4236, -20111: 23374, -13506: -28699, 31291: 27230, -32598: -7092, -5972: 31899, 15397: -8419, 15791: -2952, 24123: 9853, -32197: -7823, 12564: -18593, 16139: 21230, -23524: -28360, 6509: 20623, -8275: 31514, -6607: -5333, 5101: 31408, 23166: 21657, -12672: 8924, 1406: -11027, -24417: -3430, 27934: -17823, -7960: -29901, -20662: 24784, 9478: -22265, -3096: -26803, -5897: 23795, 29566: 26527, -19057: -10328, -22202: 18967, 11290: 32741, 14225: 4804, -31177: 15798, -23514: -7563, 21445: 15844, 14156: 8570, -23968: -24474, 12089: 5498, -14198: -26135, 12664: -23411, 11111: 27354, 15998: 11423, 2891: 21555, -3889: 17061, 32491: -4625, 110: -9137, -20559: -6986, -28721: 3288, 6697: -23898, 8774: -6890, -24838: 20366, 31820: 27280, 14127: 10447, 605: -23336, -28271: -9387, -1486: -28143, 1623: 19882, 30022: -7494, 16398: 31225, -20320: -23582, -23295: -17336, -14291: -775, 3270: 20106, 11662: 16973, 29041: 3377, 7387: -16397, 18767: 32565, 5022: 19191, 16397: -31024, -16106: 13405, -31898: -23690, -25746: 17046, -8847: -29236, 28656: 21644, -11311: -25314, 4515: -19390, -15847: -1245, -5025: 24474, 24302: 28820, -31534: 24028, -14548: -21272, 20722: -27070, -24083: 29927, -27812: 19042, -18194: 5028, -29732: -8181, 20316: 16946, 3176: -32144, -30223: -25654, 202: 22052, -20234: 6669, 18732: 15730, 7127: -27128, -2948: -22493, -21733: 27859, 25166: -31535, -27174: 28732, -14476: 5256, 20346: -27358, 6308: 18033, -10411: 12780, -5469: -28028, 4884: -15738, -12442: -3065, 24311: -21682, 18679: -10632, -13091: 25595, -18882: 31353, 23626: 20687, -17201: 13186, 4270: 16793, -22089: 5358, 4374: -23552, -13011: 5661, -14593: 1052, -10586: -18438, 9093: -3136, -19492: -30355, -5066: 24396, -9852: 13836, 8770: 30757, -18672: -13421, 16224: -10802, 21800: 12639, -213: 28223, 22311: -6756, 7182: 31529, 19224: 16315, 20067: -19940, 10720: -12330, 8384: 14353, 27730: -24075, -18309: 4570, 5808: -32765, 14330: -24746, -19632: -3605, 4228: 25887, 28783: -30008, 16483: -20439, 16655: 26861, -10047: -14259, 30091: 29732, 29182: -13397, -26897: 14659, -17202: 16830, -15265: -16433, 18554: 18464, 3269: -15505, -11054: -20924, -5253: 3749, 14888: -553, 15310: 29010, 3194: 31220, -13770: 21130, 4236: -15365, 13546: -11695, 32688: -16898, 24524: -8344, -2968: 25207, 1449: 26456, 29046: -5209, 12133: -27981, -27130: -21148, -3586: -24606}, index_rand = 6181253659715007859
+xs 3094145122 1848048556 41621330 1587738279 # shrinks to ref input = {25109: 17547, 13167: -24835, 32450: -27886, 28704: 27530, -29237: -31051, 17202: -31179, -22358: 15751, -17715: -2518, 82: -27363, -26280: -12489, -10711: 1113, 28197: -29265, -12233: 15499, 1578: 18570, -10956: 7886, 957: -15131, -26652: -19109, -1698: 7038, -3697: -2352, -18762: 4688, 2143: -17488, -30936: -28216, 26547: 20891, 20001: -10566, 20162: 12139, -15042: 4332, 23226: 835, -1720: 26602, -9048: -19721, -29320: -13680, 30000: -7286, -3693: -16312, -30022: -21864, 29541: 16785, 4006: -20908, -29599: 14040, -17690: 24907, -3766: 16608, 22217: -29766, -29552: -3913, -4046: -20703, -26412: 21205, -15898: 17844, -4553: 32030, 30908: 18124, -1065: 27619, 1642: -19186, 31516: 28398, -22847: 5892, -31043: 21198, -20284: 25965, -27740: 4090, -750: 29603, 29546: -7601, 19831: 16923, -27337: 27061, -5052: -22512, 19028: 22656, -6128: -20716, -5324: -2624, 7273: 5987, 26259: 28589, -5682: 24455, 19425: -13458, -8687: 1837, -29081: -5536, -5126: 19859, -23172: -26061, -17454: -9093, -14495: -19415, 124: 27981, -214: -15589, 17580: 24995, -22303: 227, -2043: -17283, 13309: -29027, -22094: -31943, -1826: 12330, -26959: 19945, 22155: 4915, 16: 1005, -6802: -8951, -29879: 4766, 21350: 7196, -4292: -29428, -17591: 7350, -23475: 20767, 23372: 13739, -16316: -30392, 17391: 5141, -10827: 27764, -11304: 7731, -4247: -21446, 8251: -19738, -568: 8414, 14787: 5321, 2403: -17445, -19412: -16874, 16247: -30651, 11946: -29414, -7725: -10389, -2002: -20578, -12689: -21992, 15800: -451, 32435: 1683, 16805: 11493, -8068: 32206, 27386: 26184, -14311: 21859, 7208: 19308, -13115: 24029, 32222: 19098, -3951: 20703, 10184: 5095, -3235: 29199, 7358: 3163, -9539: 23015, 17802: -31374, -12478: 18169, 21253: 2717, -4126: 30376, 31545: 13768, 14466: 10983, 26903: -7058, -8377: 21868, -15947: 21121, 31358: -30749, -22714: 23423, 17855: 9349, 7118: -3573, 20807: 30872, -19809: 19037, 3084: 622, -13442: -19023, -9314: 14811, 19551: 9175, 13945: -24551, -9482: 14832, 4058: -11363, -29175: 3097, 26866: -6501, -19528: 16419, 13884: -10693, -30894: 18387, 2434: -11471, -29588: 8302, 9537: 26353, 11223: -4669, 32503: -8454, -17566: -12769, 2898: 31182, -19042: 2208, 18941: -22060, -22700: -31888, -11067: -21667, -23130: -13776, 29835: 5369, -15197: -21652, -31889: 23653, 19121: -20925, -4888: 11878, -23301: -32625, -12188: 18858, 7983: -19066, 30772: 18792, 18565: -29423, -30448: -28531, -29781: -27670, -23123: 24404, -8686: -5154, 1956: 28781, -7050: -19514, -21874: -15534, 27434: 2933, 11568: 8591, 8645: -32175, -24288: -32065, 23708: -16804, -102: -20155, -21298: -10486, -5606: 25010, -6095: -10305, -19200: -11318, -2702: -31591, 10484: -30488, 12966: 18734, 19351: -29225, -10379: 28706, -13211: 13219, -30684: -30410, 12809: 3245, -9528: -14612, -13917: 30016, 15751: 14348, -16078: -20918, 21568: 22488, 18004: 30534, -19602: 18121, 13959: 22532, -9411: 17916, -13153: -12283, -16441: 24688, -31877: -25633, -10943: 21681, -12241: 25973, 18048: -16131, -32576: 16074, -23799: 30191, -27572: -4842, -9917: 17632, 28907: 26864, 1029: -8790, -15458: 5122, 617: 31966, 5083: 20195, 26118: -27966, -31719: 261, -30897: 26416, -28104: 25353, -25183: 10371, -25051: -9876, -8676: -2203, -25965: -25244, 14552: -27117, -6195: -9440, 6733: -15895, -16548: 22340, 7795: -7156, -5548: -8170, 1975: 11313, 26002: 13579, -1090: 16028, 3119: -22116, -26790: 3213, -12524: -21450, 19788: -30362, -11778: 7254, -24041: 18664, 10038: 10500, 12731: 10291, 19886: 8630, -13579: 4280, -10199: 16578, -10637: 18165, -3835: 6271, 14929: 24076, 27938: -31473, -14770: 5512, 15441: -3706, -17185: 2295, 15932: 20222, 13258: -18255, 24353: -11049, 24897: -6737, 365: -23551, 23329: 30521, -31648: -13380, -1552: -25692, -5206: -1325, -27419: 31094, -51: -28413, 12361: -29699, 5402: 26930, -27529: 7188, -12050: -7233, -7996: 20657, -18903: -31229, 2184: -27864, -22198: 8189, -14333: -3151, -8819: 32208, -25427: -1465, -13361: 23768, 25140: -13818, -18482: 5019, -9847: -31791, -17654: -16678, -18171: -25938, 24839: -22327, -10299: 17415, -517: -9938, 11604: 19413, -20522: 25880, -16853: 12843, -19711: 6243, -2217: 17848, 31544: -23358, 32481: -20104, 916: -13297, 21632: 27432, -20301: -905, -28748: -18375, -18946: -26872, -27139: 23619, -28341: -2690, -14751: 3261, -31340: -5866, 14129: -1873, -17466: -19221, -27794: -25683, -16132: -26856, -6446: 21798, -26329: -20765, -19511: 31669, -25708: -5275, 10217: 797, -9016: -17110, 7696: 13723, 6083: -19072, 31100: 8435, 8017: 10175, -23973: -199, 25418: 21954, -5106: 15703, -29119: -14678, -23448: -14905, -1334: 27615, -25389: 21402, 5764: -14910, -25059: -20274, 32586: -21603, 27022: 24446, 30370: -23901, -31423: 31764, -21135: -21011, -6284: 14914, -20672: -4657, 3691: 9397, 1305: -26046, -29806: 1663, 11409: -9037, -25440: 12737, -16350: -30111, -15664: 4544, 29290: -19087, -10773: -15820, -1299: 31105, -9945: -24879, 25445: -1393, 17568: -11207, 2868: 11240, -14478: -5443, -29749: 22046, 30402: 18906, -14676: 28148, -12434: 19407, -8904: -31377, 32723: 19548, 26961: -12468, -20695: 24529, -11186: -16253, 17983: -16005, -22681: 29406, -32124: -28864, 4551: -32279, 16423: 21410, -29467: 30297, -32316: -11084, 19168: 13447, 31777: -17253, -20788: 30789, 10397: 26717, -16290: 10403, 3436: -20939, 24973: 21047, -23977: 19143, -21115: 16465, -32140: -27035, 29494: 19758, -31925: 16559, 25544: 14705, 16117: 2902, 16076: 1994, 1259: -4130, 11871: -31322, 31923: -12428, 6485: 16367, -15055: 17454, -32536: -23142, 19287: -30036, 19046: -6360, 30467: -20193, -1352: 19442, -24389: -32203, -25508: 28905, 13432: -28476, 15794: -2020, 7907: 12590, 19319: -31856, -10096: -8759, 9365: 24849, -11559: 25438, 23762: 21598, -7248: 22542, -16926: 12934, -24708: 4222, 2179: 3309, 1855: -8693, 10786: 29825, 18783: 25809, -5169: 5570, -8235: -4664, -20234: 26252, 18273: -26922, -4496: 19147, 4458: -20329, -18952: -31435, 22439: -27690, -3304: -7512, -17425: 6385, 2885: -18520, 2478: -17666, -16036: 22920, -8658: -18048, -7204: -25509, 28983: 4786, -9146: 16439, -26893: -27056, -31037: 17541, 643: 17042, 27085: 11808, 26037: 20956, 4234: 1346, -14815: -6582, 25700: -8577, -10298: -23247, 5728: 10020, -25496: 10378, -27275: 28186, 24689: -21421, 32092: -15135, 17254: -370, 13808: 18349, 19084: -163, 16447: -25693, -22306: 26140, -1695: 3490, 32119: -6821, 25084: 21803, 10922: -26376, 27134: 21743, 30570: 8146, -12987: 6435, -20456: -22516, -31704: 12485, -23916: 4096, -26088: 20130, -19159: -28657, -3808: -29934, 21346: 18600, -17642: 22758, -9589: 9627, -12541: -16450, 3120: -31143, -5758: -4025, -14764: 22952, 26792: -16315, 12268: -8062, -31344: 20767, -10729: 652, 32354: 30556, 10533: 27076, 18563: 31611, -15395: -16343, -7271: 28710, 28693: -28840, 19304: -31194, 4838: -28332, -15421: 18530, 24139: -28363, -31872: 15347, 17464: -17470, 30063: -21708, -6516: -17705, 14553: 20142, 29460: -4329, -9381: -14281, 3286: 26530, -25478: 18858, 8614: 12250, 3087: 21051, -32628: 24370, -15651: -18351, 8024: 4382, 15805: -11203, -1077: 8609, 32285: -11583, -27614: 7211, -10535: 22639, -20099: 16870, 21230: 28095, 612: -23352, -5544: -26504, -25887: 2679, 14181: -26845, -31967: -7583, 26010: -15169, -6467: 12825, 24107: 4381, 3800: -2605, 2010: -21114, -1414: 6971, -12659: -21065, 20831: 9711, 20073: -8964, -24951: -3223, -6740: -32200, -8304: -23492, 27109: -8227, -17744: -25257, -28537: 18637, -18411: -15041, -25173: 928, -25903: -13895, -21831: -3009, -25678: 1895, 30480: 17166, -25850: 16586, 12531: -10102, 19095: -6338, -26672: -9944, 11671: 1505, -13311: 12087, 8454: 19381, -12936: -31002, -17139: 19189, 11596: 20259, -25535: 3542, 20951: -18777, -6500: -18332, 30742: -277, 31676: -30490, -27517: -19880, -25374: 32088, 21483: -10823, -16979: -18696, 14561: 13047, -13368: -16548, 4720: -14672, -29316: -19115, 1395: 9605, -10992: -10275, -21747: 8507, -4734: -6057, -30595: 16035, -24700: 22816, -2210: 19173, 7671: 24589, 27460: 5788, -10899: -21848, -26840: -3095, -28802: -2572, -3431: -5783, -21943: -31626, -22611: 26127, 3213: 396, -15957: 17787, -11959: 17422, 1613: 22455, 32292: -9957, -23718: -32341, 2795: 4614, -15162: 2211, 26391: 18246, 885: -15549, -29735: 26493, -17763: -9509, 832: 15026, -23215: 22609, 28230: 20969, -32629: 28951, 10402: -11520, 26729: 11732, 14065: -4855, -12988: 5456, -24309: -15464, -20942: -11584, -18355: 1571, 16650: -13337, -7873: -13362, 11313: -19130, 20194: -6007, -9755: -26600, -25013: 21165, -14900: 26513, 17728: 17821, -28277: -25003, -14757: 5100, 13577: -9806, -22115: 27298, 14668: -23429, -25174: -28161, 2367: 4067, -23795: 27843, -3780: 5571, 30910: -13600, 11355: -21254, -7086: 2278, -13419: 3221, 22732: 21622, 24582: 15497, -4771: -18262, -705: -24363, -6490: 13550, -3098: -31941, -20378: -12040, 25336: -18191, 21299: 822, -30797: -23895, -17162: 18699, 228: -17254, -12250: -21242, 4730: -2067, 8150: -16241, 15707: -29248, 6042: 32137, -26556: 15175, 14154: -28226, 9935: -23158, -29846: -22516, 9461: -29500, 11475: -19325, 31974: 2561, 1330: 8660, -1271: -17382, 3482: -8519, -25956: 15786, 25713: 3023, -394: -27817, 19478: 32434, -12289: 12678, -2608: 9330, -26485: -7465, -27840: 12092, -31666: 3630, 15748: -11979, 30892: 30006, -21505: -30879, 10340: 14885, 11619: 5575, -7216: -30397, -15140: -11637, 16761: -16433, -21925: 12562, 28429: 18057, -12739: -25584, 13377: -24419, -3752: 22641, 21444: -30136, -27669: 23044, 521: 28473, 9286: 5030, 29721: -14329, 10899: 8578, 9145: 15065, -30537: -15209, -21221: -5525, -16581: -17871, 27355: 23268, 56: 17851, -2659: 22647, -1630: 31617, -30759: -18270, -28584: -4801, 1875: 10171, -8604: -27218, -16634: -19036, -17802: -16413, 13379: -6140, 23704: 6880, 8765: -1719, -21255: -6806, -19546: 23388, -22379: -4391, -17126: -18724, -21340: -9110, 18182: -10221, -2471: 2014, 13850: 25597, 18153: -5252, 13325: -21738, -27130: 19737, 8324: -57, 16162: 17766, 30735: -1934, -13008: 18027, -14177: -26344, -3410: -15352, -22373: 13456, 23820: 30037, -16682: -8556, 2771: 32686, 7700: 2288, -15586: 23950, -23520: -30119, 24085: -27227, 28343: -27847, 11661: 11000, -2690: 6058, -30191: 21458, -10655: -20377, -18377: 8672, 15970: 29352, 13854: -28243, -12566: 12732, -11424: -5467, -13021: 19087, 4285: -20833, 4850: 15552, -28485: -26386, 8290: 259, -11749: 19444, 26075: -905, 30605: -1488, 6438: 27983, 9535: 25448, 10668: -26317, 9228: 2787, -9342: 6996, 3077: 2077, 14575: -17406, -13263: -28914, -16497: -8505, 17807: 29989, 17642: 27683, -7320: 22167, -28413: 23955, -29262: 1610, -7611: 20341, 13742: -22167, 1948: -3978, -26335: -18254, 7765: 4432, 22110: -27003, -3021: -16057, 15606: -23087, 8263: -28114, -28389: 28514, -24292: -3802, 593: -22012, -11632: 18700, -8493: -17690, -24000: 29402, -30405: 18870, 2054: -12353, 6302: 13902, 14627: 20456, -20713: -6796, 59: -27945, 15401: 3763, -31282: 2136, -30080: -21448, 596: 31173, -3777: 10969, -27062: -12955, 10983: -10220, 23508: 7525, 18741: -17043, -2752: -3564, 1045: 29156, -23741: -18438, -20412: -20083, 31569: 5108, -19554: 24719, -31716: -26184, 3254: 30063, -23755: -474, -10974: 24808, 32587: 24856, 13274: -13294, -23140: -5331, -1612: -8780, -12950: 16875, -7602: -1367, -8407: 24480, -18043: -18814, 5557: -14426, 23239: -32629, 12839: 10100, -23881: -9397, 9000: 1367, -16739: 24959, 27731: -23120, 1404: 16785, 26722: 2067, 13575: 21126, -4894: 14658, 13344: -7459, -3522: 8125, 10021: -14961, -10653: -5225, -23802: 25545, -6938: -12602, 3949: -14698, 29660: 11675, -2952: -7008, -30398: 12733, 24591: -27470, -8108: -1693, 8378: 6293, 19409: 107, -24293: 13979, -26643: 24382, -8928: 14933, -15145: -3845, -22551: 10211, 425: -15224, 16478: 7707, 2338: 16763, -23791: 31613, -8916: 7382, -5384: -31297, 10300: -1373, -27891: 1916, 2999: -30008, 1165: 24301, -397: -18055, -4201: -8619, -23959: -1718, 16219: -26007, -15100: -24529, -32527: -12160, 19770: -292, -10008: 22619, -26772: 3604, 236: 105, -7879: 31666, 19242: 10567, -6348: 14664, 5832: 13312, 1492: 10163, 8927: 21565, -26318: -18183, -10174: -25158, 9807: -26056, 26076: 17814, -15366: -19761, 2621: 12814, 30193: -31344, 4206: -18921, 7126: 22715, 16128: -10023, 25936: -31820}, index_rand = 5224467844040644997
+xs 361304641 2604218693 3136857884 1914902562 # shrinks to ref input = {-19354: 24819, -16292: -12090, -14434: -17000, 7065: 3299, -18458: 22292, 19194: 12574, 1: 18507, 32098: 548, 3309: 3711, 30631: 31499, -9540: -31601, 29472: 15053, 28278: 16574, 10805: -6409, 1937: -29445, -27617: -19598, 14618: -13991, -31216: -14546, -8002: -19976, 24690: -11392, 19023: 6532, -4475: -15383, -3276: 3043, -22021: -831, 7566: 28669, 7414: 7538, 3289: 1498, 32294: 11245, 27957: -24717, 394: -5551, -25550: 7578, -10781: 17801, -15265: 22301, -22600: -27228, 18049: 28811, -5680: -4765, 6393: -26312, -3763: 19239, 12387: -7834, -17270: 15102, -849: -18294, -11185: -8909, 5848: 28816, 4822: -1284, 9283: 17434, 5749: 13204, 11282: 18054, -30054: -1590, -5733: -8222, 27256: -17099, 25828: 27982, -26680: -20087, -31170: -3715, -27215: 20014, -3297: -27491, -4237: -9165, -3803: 6289, -13220: -7922, -31962: 28987, 15542: 18604, -17133: -25302, 13426: -25405, 2685: 15869, 5642: -8384, -8618: -21494, 696: -6333, 30169: 22735, -31498: -2698, -16350: -30346, 23455: -30868, 24880: 8411, 12752: -26951, 807: 5479, -31915: -6948, -6797: 32084, -27450: -5011, 12562: -16186, 16308: 9586, 8802: -8309, 22958: 1367, 5967: -7809, 7342: 9794, -21809: -30257, 22051: -8714, 11489: 27098, 9636: -24412, -22926: 4643, 16522: 3404, -13679: 20161, -20645: -4604, -27194: 2276, -1203: -23043, 15177: -16488, 17368: 19938, 18129: 13518, 29506: 13683, 30487: 29314, 22806: 20773, -1727: -29216, 8206: -19496, 7127: -23074, -2964: 1656, -8043: -15180, 31783: -24797, -14997: -8251, -9625: -985, -3485: -1572, 3259: 1018, 4124: 31363, -6871: 11567, -15128: -13650, -30770: 9112, -2638: 21963, -19057: 16043, 20685: 214, 17778: 6821, 27947: 8329, -13235: -3670, -15954: -21158, 12517: 13054, 23898: 16751, 16216: -18722, 15237: -7624, -31732: 21365, 30822: -28157, -17438: -30023, -26596: 3301, -13414: 5061, 17372: -8376, 30362: 28469, -20309: 143, 24393: 10508, -6411: 32337, -18972: 19110, 30365: 10104, -5140: 19909, 11898: 18406, -14442: -15467, -32552: 22492, -11355: 5350, -8307: -18294, 17475: 7093, 22597: 1992, 20469: 30777, -32614: -6165, 32573: 8339, 1514: 25969, 10701: -20617, -3021: -12256, 6587: 18950, -25402: 12031, -9936: 16285, -29946: 22912, -14064: -10944, 671: 13716, 5073: 7865, 5197: -26128, 19416: 9507, -30681: 8287, -21677: 28198, 3770: -21258, 14103: -8796, 21840: 6932, -14302: -3120, 18835: -21353, -19863: -30682, 30904: -24579, 23767: -2876, 14140: -7923, 23444: -8002, 20015: 24236, -8959: -10261, 19803: 10542, 13739: 29511, -28569: -14754, -3714: -30519, -14450: 8383, -11394: -30165, -32079: -13880, 13248: -30479, 11781: 9474, -10436: -2853, 6759: 27954, 25845: 29391, -31738: -26454, 30132: -23278, -18345: -23422, -25979: 16664, 9607: 29137, 8336: 22464, 20324: -23583, 15078: 31805, -28529: -17128, -12412: 9041, 5972: -27525, 10224: -32042, -6332: 7448, 26995: 20876, -12473: -28199, -23999: -23159, -18299: 21242, -14408: -31328, -29246: -10044, -10164: -28095, -27052: -5400, 10173: -25267, 23822: -17900, -23953: -13219, 28791: -8090, -21909: 21407, 17530: 26269, 29655: 29973, -16374: -16957, 13982: -24366, 11639: -20136, -18021: -4470, -28776: -14271, -19637: 20591, 17096: -6224, 19899: -7035, 10911: -124, 5706: -16549, 2364: -24950, -10944: 31678, 31723: 11433, 6413: 4440, 32675: 19466, 27096: -13819, -10806: 6633, -4937: 28751, -27140: -13550, -12557: 13547, 8629: 3152, 3413: 2565, -25866: 10729, -15566: -15218, -3621: -23194, 7527: -27521, -24127: -29997, 12909: -25868, 31772: 4680, 31014: 29821, 18678: -16508, 30298: 9039, 14505: -3668, 22669: -10595, 26152: -16178, 24944: -8114, 16694: -19338, -14047: 24498, -30270: 26317, -16665: -26461, -30656: 20249, 25517: -20809, -23571: 1882, 23007: 17866, -25659: 8076, -23717: -5810, 6904: 2115, 11784: -31335, 30197: 18033, 12572: -30508, 17268: -18072, 10674: -22655, 29365: 24132, -17185: 10599, 8749: -31736, -3334: 32668, 21915: -2453, 17556: -26978, -9373: 26250, 22616: 30289, 2165: 15435, 10766: 1818, 13715: -20952, 2935: -9271, 25227: 15051, 13045: 23934, 13260: 30812, 10690: -10114, 824: 8266, -14298: -13127, 11000: -14100, -18008: 21650, -8299: 6540, 3128: -12265, -7224: -8911, 19209: 14023, -8038: 24840, -26622: -26079, 14895: 22828, 31625: 20961, -2636: 19675, -17021: -28086, -5946: 15939, -32313: -153, -14012: 30196, 31144: 31395, 7996: 24091, 28923: -29327, -9247: 15709, -26391: -9285, -14883: 27089, -15544: -12422, 1374: 28261, -22870: -12032, 26286: -20763, 4080: 2040, -14599: 9484, 32660: -3226, -22977: 5487, 18067: 3363, -6489: -21852, -10804: -13137, 27933: 20036, 15275: -12004, -13892: -676, 16130: 22039, -24538: 21841, 24641: -3642, 21784: -26054, -20651: -27826, 5295: 32093, -24305: -3414, -18446: 10556, 4517: 526, 24294: 10881, 24194: 26364, -13901: 18395, -12783: -27360, -713: -29957, 8644: 14950, -6324: 9260, 9506: -30362, -29129: 6181, -3784: 18178, -28466: -21361, -18659: 3987, -10595: -19837, 7499: 30194, -12558: 7406, 28463: 12837, 27107: -2298, -6932: 4389, -32374: 25500, 23110: -23112, 8747: -22926, 4097: -2613, 3462: 30698, 3398: 31612, 30467: 23139, -1641: -3740, 3293: -19082, -20228: 31473, 20793: -17194, 17724: -25522, 8074: 32013, 23712: 19733, 31907: 8354, 12744: 28197, -24606: -11268, 23637: 3704, -3436: -24423, -2739: 10852, -4260: 18850, 12969: 6263, -26425: -6431, -28020: 25049, 31644: -1993, -20327: -6272, 22470: 17788, -28205: 31716, -21534: 32498, -4889: 19628, -825: 16644, -30248: -31584, -26932: -3743, -28597: 27796, 10641: 29403, 18736: 11379, 17445: 4741, 15954: -22253, 28955: 3994, -18758: -20179, -16666: -22951, -23409: 7546, 28441: 28286, -6600: 29204, 245: 5060, 21723: -31646, 13693: -28832, 17526: 19157, -3421: -30798, -12920: 25702, -13396: 4699, 25125: -17956, -378: 30900, -29352: 13943, 21551: -27295, -31207: 316, -5104: -20171, 10981: -14599, 13127: 7748, 12536: 20062, 15315: -493, 10111: 24216, 3207: -31216, 18499: -20515, 4815: 26753, 24865: -18658, 28562: -27549, -14256: -3818, 22292: 9007, 9550: -22562, -18174: -5902, 18354: -4282, -14416: 6361, -20722: -24289, 31715: 29227, 29704: 15935, -5533: -8673, 10845: -30941, 14160: 12144, 1992: 1318, -11404: 28138, -5428: 18711, -1624: 3223, -20437: 19171, -13983: -15469, 29721: -11600, -32689: 14340, -12675: 7713, -21501: 21229, -3729: 27686, 13580: -5131, -17708: 16700, 20809: 25221, -28564: -3272, 29509: 26850, -9889: -9564, 938: 25880, -17223: 18566, -20452: -799, -4292: -17811, -19061: -11617, 25764: -11388, -3347: -14170, 29220: -7185, -21149: -4187, -8341: -13996, -9012: -22916, 5303: -18306, 14513: 21706, -4815: 9868, 4316: 3968, 28688: -1524, -19338: 14733, -13386: -14098, 18253: 3130, -1221: -5690, 5093: 24217, -12424: -8733, 25791: 31206, 6697: 29204, 31192: 12158, 31407: 749, 17618: -3504, -3199: -3206, -11293: -20357, -16165: -3563, -27497: -25700, -27297: -3825, -23521: -23715, 4652: -29245, -17313: 10246, 22202: 28783, 12621: 7793, -25616: -9539, -8209: 11244, 2018: -23988, -29161: 7278, -17743: 748, 6678: -15931, -31969: -10178, 11253: -18267, 9135: -23204, -31002: 27729, 22133: 28453, -31372: 16243, 29200: -18504, 27344: -7996}, index_rand = 12865908526723545602
+xs 2514330554 4021224636 4249159765 809946243 # shrinks to ref input = {22983: 25567, -21524: 12652, -31419: -14369, 24781: -3215, -6098: -3626, -4344: 6615, 11513: -5995, -32129: -25765, 19648: -32475, 5272: 26666, 6416: 22836, 27222: -3403, -4042: 3636, 13253: -27848, 27331: -4442, 666: -14459, 13044: -27108, 2407: -18269, -11769: -23455, 6186: 23587, 3702: 7914, 29676: -21600, 12424: 12219, 27941: -5207, 15122: -12497, -11158: -27362, -8282: 26473, 3415: 26408, 12831: 17512, 5795: 28896, 21721: -11462, 20429: 9497, -12438: 9683, -3959: -13001, -25293: -23380, 5700: 24227, -21071: 9692, -18808: -24549, -27808: -4112, 14687: -13091, -14445: 10864, 8680: 29230, 28793: 2289, 572: 22804, -12907: -22882, 19549: 29926, -24247: -3077, -96: 16251, 8929: 32524, 18444: -31578, 24622: 19896, -20594: 13891, -22943: 19132, 31425: -2940, -12580: 30389, -526: 2891, -10880: -20465, -20861: -9108, -1990: -1706, -14673: -3333, -12415: 12446, 1711: -3619, 2889: 26166, 5135: -9934, 9761: 7314, -13727: -30121, 23167: -14068, 7972: -16912, 792: -2110, -23816: -11162, -14613: -11944, 2276: 16327, -1710: -513, 14501: 12803, -14424: 12359, 8166: 23242, 7132: -5033, 2661: 18395, -29564: -10169, -24378: -28753, -6535: -12561, 8864: 16922, 5509: 24075, 6948: -31451, 9166: -16562, -15552: -22739, -23577: -11089, -23262: 15724, 7935: -226, -15831: 22789, 19431: 12267, -32692: 13439, 8190: -27259, 5177: 21511, -25935: -29614, -23804: -9779, -5144: -13329, 13090: -1785, -24277: 11514, 23943: -7920, -5978: -7247, -10397: -26707, 25026: -2168, 16104: 8686, 1807: -29851, -24649: -22813, -19629: 11095, 22893: -20902, -23916: 17574, 1476: -25217, -24340: -19076, 28100: 15570, -22175: 22320, -6586: 6492, -18649: 11816, 16251: -21463, 17368: 3798, -20189: 3235, 16961: -6580, -8404: 20372, 16047: -15304, 29490: -3055, -24776: 15119, 27563: 16145, -22311: -2158, -15739: -32392, 2484: 14964, 21250: 7246, -9967: -28930, 31387: 5103, 14859: -2042, 16259: 31622, 29267: 26762, 6688: -2894, -25600: -27724, -22795: -11228, 2779: -25135, 3592: -29746, 2684: 25084, -14032: -6792, 16004: -29800, 10914: 6250, -15582: -26248, 21285: 13207, 22458: 2337, -13517: 14340, -29653: -16328, -9174: 8207, 6822: -22380, -13230: -5805, -24662: -20758, 23527: 6218, 21957: -1144, -29983: -14789, -25776: -10625, 29489: -29112, -634: -1687, 16362: -5095, 24103: 17173, -28568: 4122, -27366: -2615, -3220: 25064, 990: -31755, -14609: 23575, 31478: -24182, -15842: 9193, 7823: -20861, 32558: 23623, 28629: 20621, -27884: 26432, -14903: -17295, -20813: -25646, -14902: -25559, -13309: -1218, -12300: -17285, 31853: -3859, 1399: -7893, -26296: -29878, 19179: 13265, 15479: 17728, -25448: -8456, 13588: 27559, -24783: -7128, -32103: 29322, -1758: -3572, 13728: 31962, -17236: 5243, -21230: 27588, 20742: -27977, -20661: 4578, 9198: -15494, 5045: 25517, 29565: 31629, 20558: -6873, 24626: -30679, -7805: -9759, -3591: -19001, 28566: 18547, -13063: -28236, -19655: -4068, -9420: -16081, 25403: 23876, -17448: 2581, -26642: 1171, -24759: -17468, 20219: 24202, -30341: 13934, 27839: -18353, -545: -28904, 381: 6631, -14539: 19857, -2539: 19520, 31691: -3655, 1385: -507, 30959: -12761, -16041: 8706, 21997: -15520, -11702: 28136, -19969: -15001, -575: -19615, 15183: 2436, 5198: -26540, -18493: 24520, -17505: -5183, -2493: -30253, -25067: -4479, -1283: -3796, 31471: 3428, 25734: 30828, -12627: -6061, 11155: -26067, -26923: 20405, -24052: 21789, -435: -23207, 30135: -13145, -15985: 11367, 16307: 15640, 28752: -18459, 22594: 7750, 22206: -269, 12789: 803, 5691: -26452, 31114: 1532, -15192: -30273, 23101: 3141, 6407: 15910, -1158: -18687, -25606: 29881, 17713: 19127, -1122: -12940, -6489: -9054, 15743: 3691, 21427: -22498, 10898: 19136, -15369: 8230, 30219: 3776, 1353: 27070, 31264: 29339, 31831: -20760, -9233: -18316, 24841: -26176, -12699: 3016, -22370: -9549, -6545: -22728, -8574: -14535, -31864: -12833, 768: 15313, -19955: -22453, -30880: 9396, 29543: 755, -9778: -32702, -22077: -25372, -2605: 16746, -30839: 29080, 32699: 16318, 2417: -12052, -31380: 12651, 24376: -19710, -32686: 761, 5677: 30160, 12035: 12228, 32125: -20315, -20314: 5439, 11493: -17794, -26680: 11610, -28132: -20467, 16900: -25287, 25461: -31865, 24573: -32602, 9200: -1505, 27518: -25693, 12990: -27271, -9397: -803, 14105: 1387, 2651: 8640, 17112: 30678, -969: 19205, 19710: 31993, 1893: 5361, -17816: 24812, 2765: 16979, 1966: -21769, -26954: -1952, 29816: -1928, 26782: -29372, 18567: -22726, -10111: 5989, 14917: 22916, -14570: -2257, 1263: -4715, 18190: 30641, 11528: 12151, 4035: 20675, 20933: 20327, 20055: -30733, -14881: 6272, -26276: -44, 10879: -30096, -9294: -16413, 2817: 13299, 643: 15982, -7677: 4313, -20647: 31903, 3668: 29744, -895: 14661, -17897: -17401, -11844: -19818, -10186: 29763, -32372: 29925, -28816: 10622, 31355: 10910, -17637: -27328, 9535: -27794, 12855: 2934, -3109: 3109, -6427: -16454, -15442: 8398, -23169: 31026, 12834: -25030, 10930: -16079, -12447: 9572, 398: -5332, -11374: 27256, -12183: 32336, -14535: 14519, 12753: -3875, 8795: -11151, -3712: -16993, -26508: 14252, 20375: -14368, -13681: -745, -30307: -5112, 13277: 25773, -7944: -31433, -28425: -12788, 20210: 15294, 17797: -5799, -19999: -7498, 31427: -21005, 11063: 16683, -12187: -11576, 25180: 1372, 12244: -7444, 27900: 20262, 28587: 7083, 18724: 8161, -20180: 25818, 15692: -31648, -28303: 17209, -720: 21874, -16321: 31013, -454: 5366, 31803: 29349, 13754: 24292, 21162: -20849, -23732: -27863, 25477: -6654, -26061: -12152, 20032: -20593, -12006: 28036, 6291: -26468, 14737: 5272, 32728: 5626, -1731: -29345, 24503: 19404, -24868: -21379, -6468: -22831, 22287: 10296, 2631: -26020, 14590: 19330, -9565: 26433, -15283: 5147, 6630: 31769, -17396: -21499, -25553: -10823, 13619: -10207, 23182: -25363, -23069: -32662, 19477: 15524, -1868: 5359, 7929: 27049, -12723: 9380, -16172: -20285, -10286: -10075, -9506: 31490, -25795: 13824, -17148: -32529, -21164: -9272, 20979: 9504, -18600: -2080, 27700: -20006, 9823: 31533, -6997: -19415, 28861: 17091, 26758: -15191, 24983: -24729, -28254: -1130, 25914: -26157, -24819: 405, 20339: 9923, 30368: 1691, -21613: -748, 1453: -19462, 3731: 13394, -32452: 3223, 24913: -6930, -21912: 19356, -24594: 21413, -4422: -29373, -15940: -23075, 27267: 7024, 2732: -24160, -28400: 18241, -24538: 1422, -426: 12283, -10915: -11143, -22114: 31517, 28357: 14424, 19009: 15527, -11167: -4468, 22854: -18910, -23106: 19639, 10382: 23860, 6220: -23926, -26385: -10089, -7503: -5631, 22781: -1889, 16878: -26298, 18982: 21243, 31681: 22201, -7993: 27285, -7299: 25550, 610: 16890, 8167: 21304, -16920: -617, -22339: 30620, 11333: -26987, -26992: -20496, -7985: -22986, 10141: -7469, 372: -21212, 17081: -17544, -11618: -922, 27971: 8305, -28364: -29445, 15932: 3403, 20712: -21072, 14139: 24028, -1589: -1905, 32372: -17183, -21555: 12537, 31409: 17560, 3035: -19927, -5300: 22560, -4845: 21856, 15699: -25855, 7642: 27579, 30284: -15949, -30974: -30226, 15786: 8546, -5179: 30950, 5765: 5052, 1410: -23757, -2705: -31393, 4012: 30468, -1359: -31879, -24808: 31414, 7542: 20843, -26533: -25712, 16975: 8303, -3145: -28727, 30626: -4547, 7331: -22347, -229: -15652, 26743: 8164, -28242: -12747, -13570: 28103, -31635: -32305, 25882: -22303, 392: -21213, -3910: -419, -24637: -4685, 15423: -4564, 16842: -5323, 2530: -6191, -28954: -20857, 12709: -1223, -29605: -31941, -15037: 9147, -2441: -9869, -30549: -24089, -2045: -24975, -6257: 5642, 19458: -26673, -11026: -32379, 11073: -2714, -16340: 29939, 22558: -389, -282: -29137, -8915: 10668, 13276: -26492, -6567: 15209, 18167: 6255, 18833: 9305, 23382: 9685, 22344: -6270, -5200: -17657, -27124: -17742, -19079: -568, 31073: -16882, 28075: 23525, -27683: -6870, -4980: 20988, 15716: -12047, -17167: -27903, 14047: 1751, 18332: 17369, -4584: -13960, -19312: -7004, 24390: -26226, -31358: -20950, 2846: 8574, 23256: -28403, -12965: -970, -10968: 6290, 31485: 3696, -14595: -24510, 8331: -24508, 16660: -6434, -21947: -11573, -13276: 18857, -11196: 13858, 20146: 29787, 26780: 16229, 22109: -21982, 3218: 12243, 20958: -15577, -25637: -8935, -29695: -30458, -27502: -9512, 6608: -10482, 260: -12910, 7060: 3640, 20729: -5920, 9177: 17672, 23669: 9673, -4719: -23531, 12804: -12848, -29031: -3714, 17216: -27527, -23101: 8400, -6250: 26869, -26842: -26986, -21952: 31092, 14811: 3573, -6081: 2717, -10912: -16202, -24595: 20431, -11358: -22184, 21588: -21605, -6061: 3518, 18275: -24618, 24224: 28119, -32273: 6717, -25485: -19967, -21076: -16695, -16947: -17173, 6350: -31349, 21046: 2696, 16207: -13750, -6710: 6770, 24774: -11316, -26121: -7976, 24586: -1831, -28350: -32385, -28591: 6607, 19897: 5582, 10787: -15060, 10497: -6872, -10294: 17802, -8472: 16304, -25702: 1771, 24559: 25237, -22562: 12409, 5848: 32381, 6698: 29851, -29088: -2362, -25758: -7282, 13364: 9287, 9286: -21108, -5875: 7021, 10384: -19100, -14947: -31087, 9224: -30160, 10825: 11627, 15906: 24744, -2491: 14682, 25078: -8675, -1487: 9277, 20301: -16262, -16721: 3749, 12876: 2719, -17183: 4920, -7383: -20989, 587: -29137, 1359: -18302, -31714: 5165, -10671: 13375, -1014: 25286, -5237: 14127, -20162: -15366, -17597: -27172, -16427: 24301, 21080: 29359, -16296: 21156, -27123: 17636, -14475: -17380, 3677: 3071, -13795: -14542, 25583: 2939, -18388: 26695, -30563: -10031, -19535: 16570, 22004: 14784, 4240: 16012, -26396: -7757, 1009: -24215, 10291: 31948, 31730: 31672, -27181: 4692, -7558: 15578, 8628: 18466, 15093: -25146, 15115: -23111, -25498: 19694, -29510: -6893, 10810: -20013, -7953: 24646, 17484: -6921, -22020: 317, 6794: 31084, 3107: 30850, 31725: 21696, -27069: -15468, 20231: -10374, 13074: -27686, -5761: 4056, 6032: 974, -515: -19247, -21834: -21830, 12853: -24945, -12244: 15573, 22762: -30055, 21333: 27246, 17857: -18844, 7569: -30916, 2863: 30220, 24301: -32097, -26608: -8747, -32337: -4850, 27215: 16975, -28845: 5184, 29948: 16776, -8096: -19809, 28922: 1579, -22399: -10320, 23633: 9402, 25594: -10014, -19789: 21539, 7783: -5857, 6413: 28988, 18148: 24286, 16425: -21685, -2117: 24914, 22809: -2465, -4052: 29220, -17437: -20536, 1701: -13236, 3559: -26792, 13260: 28650, 24280: 28935, -31390: 4155, -27444: 448, -15557: -22317, -26261: 14775, 8621: -19065, 854: -24623, -13346: -13154, 28008: 7670, 8308: -26926, -15207: -30554, -4728: -30539, 19116: -14938, -31105: 13428, -17085: 28001, 640: 29984, -30694: -21836, 31336: 29388, -23090: 26134, -22064: -8217, 23023: 25281, 28377: 3055, -826: 32149, -10250: 30089, -21073: -18570, -18476: -26801, -26910: -26764, -23220: -30649, 11262: 14325, 3587: 12688, -20447: -11553, -14604: -1133, 3267: 12700, -30988: -604, 31066: -5487, 4192: 1516, -9863: 26649, -12142: 839, -5180: -23733, 4771: 18192, -30173: 21726, 5816: -6256, -332: -23918, 9971: 21833, 368: 10035, 7709: 315, 18131: 27655, -12214: -2422, 8036: -21700, -12127: 30496, -17331: 23521, -5948: -28752, 9996: -22175, -12256: -9599, 12127: -14043, 8773: 23434, -24251: 31338, -30890: 4170, 796: 22060, -9480: -23318, 30137: -12439, -11200: -14846, -20960: -6630, -11449: -12059, 1710: -25246, 27339: -29509, 23266: -11878, 11424: 13957, -31513: -6604, 29223: 6248, 18427: 26701, -12933: -29661, -22958: 17397, -20885: -7075, -12532: 11832, -11207: -31040, -25413: -32634, -24423: 1136, 27748: -23097, 6865: -20862, 18880: -20717, -10317: -13842, -13186: -15707, 26939: -25776, 28970: 10404, -5636: 14068, -20214: 17872, 24853: 30283, 9956: 8484, 9398: -6284, -16839: 21664, 22800: -14869, 6033: 9989, -4795: -32223, 7279: -20473, 1275: -11857, 22338: 29810, 27015: -1704, -19258: 30646, 29954: 8034, -25853: 14141, 3311: -18597, -23320: -20940, -29480: 24564, 10547: 5534, -242: -13465, 24209: -1327, 10490: -5572, 7640: -20006, -8432: 5032, -11149: -24754, -4663: -23686, -10592: -7167, -25371: 22450, 4522: 7837, 6151: 19181, -18379: -20567, -31877: -18894, 17881: 7374, 24203: -4232, -15566: 16796, 5510: -31735, 15169: -20736, -29601: -27463, 7747: -430, 25280: -6754, -15509: 2251, -3086: -2933, 5884: 27703, -11157: -24312, 14484: -912, -3230: -9668, 16082: -25169, -137: 14744, -2665: -8726, 32412: 31615, -7276: -27566, 6279: 1989, -25300: -15901, 2440: 7619, 31956: 264, -5369: 16171, 14418: 1610, 18599: 4848, 20977: -22077, -6321: -4946, -8343: -22193, 1775: -19058, 26761: -28761, -12920: 27027, 4448: -11253, 25002: 4314, -22369: 23526, -12022: -7474, 32105: -12895, 1455: -4159, 15674: -28876, 11387: 18072, -27516: -8671, -10452: 32061, -29518: 28392, 29722: -20187, 15094: -22775, -31173: 17747, 28936: -12104, -19139: -6836, 10489: -818, -19250: 2431, -24391: 29686, 5886: 4259, 11123: 7634, 14067: 14441}, index_rand = 8788646705830835008
+xs 1144700111 3351133221 1701312047 4140849688 # shrinks to ref input = {-995: -18367, -30184: -27030, 4338: -17464, -26495: 18470, -23875: 6714, 11043: 22383, -7998: 11935, 16847: 5368, -9936: 1676, 469: -14105, -25789: -439, 2949: -19822, -13219: -11532, -13024: 24096, 7755: -32141, 5267: 20461, 13213: 5297, -7746: 31930, -24638: 20376, 11502: 161, 28692: -9359, -5352: 788, 17858: 16574, -4832: 26375, 3089: 1666, -27646: -21448, -29415: 27692, 5699: -11459, 9914: -14535, 10779: 11740, -29883: 790, 1921: -17804, -2606: 26661, 355: 10341, -9220: -21783, 10130: 2847, -28778: -8331, -26138: 21104, 19481: -11787, 23407: -22704, -13780: 6006, 7248: 6188, 9583: -27582, -19931: 21871, 7757: 32217, 7030: 24321, 13903: -28335, -6040: -8746, -16956: 3084, -27320: 10074, -11931: 23573, -14684: -2347, 25890: 13771, 770: -22088, 3703: -21750, -20005: -1416, -7260: -3308, -13212: 5663, 11568: -1211, -31546: -12571, 1625: -28634, 29510: -27517, -14067: -32392, -6952: -15279, 32194: -28535, 22530: -9153, 23590: -10792, -24830: 4545, -1413: 4698, 13676: -29216, -22119: 20809, 11493: -23219, 30324: -19957, -19740: 9364, -28332: 23760, 7598: -15700, 5250: 5262, 8892: -11149, 512: 21208, -26713: -22645, 15901: -16244, -11774: 25184, -27782: 31736, 1932: 28625, -19899: -15534, -14500: 28168, -31943: -10376, 5096: -6393, -12529: -28083, 15871: -31782, 24491: 9705, -13197: -2280, 20267: 26985, -2805: -7895, -12439: -25986, -1013: 18461, 1975: 32395, 22412: 8807, 18620: -21921, 18836: -11655, 20099: 15576, -15176: -556, -16690: 10393, -20701: -25137, 16023: 6541, 6323: 30693, 22672: 4962, 6262: -6543, 16070: 8710, 16145: 28518, -1209: -18693, -28389: -24853, 17412: -24261, 3497: 10996, 9187: -19998, -32168: 10884, 3560: 7346, 22807: 23444, -23068: 18732, -26136: -17299, 4558: -4291, 16805: 25070, 23084: 30635, -25411: 22895, -2902: 31559, -7150: -27951, -20232: 1338, 6838: 27765, -31069: -28409, 11606: -29065, -13760: 30312, -2036: -14916, 25218: 18519, -10854: -7745, 27820: 15149, 102: 7496, 804: 9488, 30201: -8547, 32678: 20708, -25202: 31329, -5584: -22884, -5108: 30003, 25093: -865, 27335: 6724, -10328: 15249, 5215: -12859, 25426: -6436, 4131: 8277, -19570: 7708, 20395: 7626, 3155: 12890, 19644: 581, -19031: -9366, -7803: 24805, 6673: -15061, -10892: -20442, -28410: 17433, -18136: 18606, 16432: 31698, -9848: 7414, 10831: 4060, -19606: -19806, -26041: -14198, 7826: 18579, -12900: -19535, -21442: 30662, -9253: -13676, 4185: -25497, -32472: -11113, -20772: -21936, 30731: 247, -17401: -28973, -11698: -26755, -17077: -5017, 22536: -3777, 13939: 16609, -8959: -24782, 29183: 15322, 28738: -31932, 12914: -31447, 27024: 19561, -6230: -2767, -18069: 12291, -3808: -532, 8699: -30308, -13072: 26305, -24174: -1772, 5083: -26578, 32374: -29090, -32055: 12554, 8496: -6213, 3295: 7339, 13897: 31817, -32448: -28910, 16533: 26195, 16795: -8295, 23292: -32385, 15102: 2439, 9462: 19663, 24237: 21643, 5357: 20413, 2361: 5794, 25247: -17229, -4187: 5207, -21262: 19783, -24684: -4240, -24679: -18791, 2368: -8363, 12208: -20319, 23264: 16664, -13617: 1275, -19198: -25513, 5092: 16212, 15124: 28714, 21439: -1196, -4432: 30044, 9557: -4855, -22916: 1046, -26280: 25826, -27674: -20014, -13633: 27408, -10975: -4991, 26520: -9235, -6589: 27583, -31631: -21487, 31832: 8595, -18451: -12811, -10412: -24981, 17602: -10428, -25014: 15888, 21325: 14946, 7746: 2626, -29626: -22668, 29538: -5978, 21901: 5842, 13851: 31830, -11034: 29385, -3586: 7536, -6063: 32614, -11727: 16659, 29320: -1367, -21326: 9220, 3205: -1974, -4787: 12852, 30793: 2568, 25796: 9433, 19016: -13799, -9621: -14129, 20136: 20434, -18060: -13251, -634: 18285, 15435: 22675, 29971: 5174, 31997: -29557, 18450: 7875, 22519: -12860, -10973: -20277, -26809: 31348, 6220: 11504, -178: 22232, 9592: -1419, -13548: 27708, 6172: 20899, 27648: 15593, -12157: 24765, -3131: 27366, -1827: -2958, 18365: 18538, -17861: -8596, -25217: -20668, -4257: -9796, -27958: -17570, -11603: -23589, -17591: -21385, 23905: 22546, -6098: 13776, -26132: 18512, 8204: 14798, 29533: 4545, 62: 22711, -9020: -8280, 11140: -8181, 1781: 10516, -1334: 15284, -7224: 7160, -28987: 22020, -4891: 8434, -4403: 19578, -20394: 14965, 29827: -30255, -560: 29091, -23917: -11862, -13868: -21175, -10219: 16295, 2577: 3128, 9484: -11742, 8668: 21789, -25813: -8178, -21404: 29342, -21751: 13687, 18052: 7524, -19144: -30345, 24903: -25167, 30700: 1834, -28266: 27752, -30375: 954, -11219: -5836, 28011: 8806, 20451: -23577, 10616: -15512, 6848: 4786, -5701: -16618, 10552: -612, 14323: -30855, 25785: -3039, -423: -22087, 20028: 21248, -31919: 15338, -19884: 15952, -22678: -176}, index_rand = 4536586039788573449
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+xs 888006417 2608449019 3789353629 478040202 # shrinks to ref m = {0: 0}
diff --git a/vendor/im-rc/proptest-regressions/ord/map.txt b/vendor/im-rc/proptest-regressions/ord/map.txt
new file mode 100644
index 0000000..9111b32
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/ord/map.txt
@@ -0,0 +1,8 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+xs 888006417 2608449019 3789353629 478040202 # shrinks to ref m = {0: 0}
+cc 1cc795607ade8b03fded509b229a329cf489559bf1ffd51710469db6532ef3c3 # shrinks to ref orig = {13654: -29485, -24329: 12447, 28073: 17462, -11155: 3551, 11565: -26208, -15232: 7608, 29759: 20320, 438: -16354, 571: -10462, 7614: -10288, 23780: -23920, -6563: 29101, 26479: 3890, 26520: -11140, -17636: -22688, -9506: 1900, -30037: -31504, -26114: 12976, 22103: 27666, -16535: 28839, -16809: -30920, 20788: 18978, -20423: 26728, -31348: -22678, -9794: -21451, 16178: -20708, 31232: 29025, -30976: 4474, -29215: -26793, 852: -11649, -4772: -14366, -19460: -5289, -5325: 24856, 45: -20269, -23801: -29271, 27724: -17783, -23212: -18476, 30206: -16727, 435: -2093, 15924: 4857, -25633: 29368, -20962: -9007, -7339: 27158, -30115: -25527, 14804: -18380, -14522: 29035, 15562: 23077, -20118: 17616, 28098: 8432, -27495: 12350, 14609: -13814, -9145: 29859, -31933: 16305, 19469: -825, 2409: -19471, 20578: 22502, 7884: -12550, 11389: -14638, -21015: -16375, 9053: 16535, 4588: -7460, 9046: -8592, 9482: -10249, -30236: 32067, -5302: 27299, 30181: -6167, -29843: 7210, 16374: -32301, -25407: 20496, 2749: -11107, -5975: 27109, -27089: 2177, 8897: -31616, -29271: 2162, -31613: 20560, 31507: -14262, 21540: -25321, 24744: -7423, 26657: -26369, -12605: -22618, -27512: -21723, 291: -9951, -12495: -32742, 7539: 30444, -27269: -12562, 29899: 26866, -587: 20631, -31271: -32202, -15662: -21784, 28126: -31732, -9749: -6578, -13352: -5663, -5080: 21203, -31106: -8714, 29841: -16964, -11827: -13788, -24678: 4958, 6499: 17700, -5695: 1260, 12631: 29706, 21390: 794, 5009: -5889, -32578: -14971, -26389: -8078, 26546: 17151, -22373: 15689, 27572: 568, -5244: -1643, 23163: 11329, -28715: -15929, -25818: 12223, -4427: 28582, 26061: -32554, -14351: 5137, 3017: -15529, -23194: -19328, 30499: 5974, 16990: -31204, 28136: 23024, -13986: 5556, 12355: -10820, 2837: -15764, -8318: -22640, 19390: -32081, 5443: -11767, 14269: 4778, 12880: -8658, 23857: 15963, 29819: 14185, -28642: -14213, 1092: -1891, 3065: 7306, 5667: -16519, 13195: 30960, 30981: 3805, -18227: 17519, 26714: -10844, 1867: 3065, -21164: -23958, -27908: 23652, -3016: -25807, 21021: -24516, 601: 6650, 10464: -30444, -25383: 21397, 16149: -20990, -23678: 19268, 13651: -30926, -30193: 4015, -20550: -3813, 8984: 23024, 8529: 12538, 13423: 3073, 24037: -11619, -20993: -31582, -7056: -2892, -12795: 10504, -16197: 1330, -20748: -17973, -31199: 22341, 31286: -22643, 9674: -18049, -29206: -15460, -25215: -15832, 28334: 11339, 14680: 15220, -25943: 24920, 32275: -6093, 13259: 30579, -29041: -17489, 15886: 7941, 15683: 9359, -1635: 54, -30492: -21635, 10271: 18315, 13384: -5318, 31595: -23502, 14243: 5855, 10461: -11363, -3155: -29668, -5835: -8232, -28140: 19386, -761: 30096, -2515: 27267, -17737: -31871, 31096: -26754, -24336: 13642, -14011: -8588, -14996: 25507, 28759: 9825, -14214: 9160, -14712: -24558, 19038: -18469, -30816: -20086, 4334: -10671, -17006: 1184, -3730: 13058, 31026: -16485, 9580: -17771, -21186: 18345, -9664: -11262, -8480: 7648, 22920: -14965, -21022: -28133, -8744: -11234, -30252: -16231, -26305: 12363, -28149: -24604, -26462: 3796, 3057: -18784, 16634: 13983, 6987: -20371, 7469: 11214, 1205: -21956, -29086: 28404, 12269: 16334, 32493: -11094, 18386: -27104, -25066: -26762, -8850: 27225, -21958: -12209, -13409: -10100, -14283: -27726, -339: -26813, -25875: -8615, -9605: 8712, 10133: 21989, 9858: -12796, -19094: 32285, 32169: -26413, 2531: 30679, 15476: -23974, 14526: 26173, 32030: -8035, -32658: -23894, 32452: 31750, 8858: 3008, -22939: -30641, -570: 27228, -21127: -27648, 24710: 19973, 1390: 4422, 26123: 30745, -1229: -11664, -14679: 21300, -23645: -21514, -19979: -21143, 187: 26447, 1962: 103, -22968: 29896, 15464: 15061, 21532: 12811, -22803: -28425, 13579: -3285, -20628: -1077, -1080: 1008, 15835: -683, 29901: -2994, 8479: -3328, 21105: -27495, -3175: 19378, -30585: -24530, 17220: -24097, 30652: -32638, -21764: -4829, 24103: 19016, -21401: -27015, -31558: 18025, 30591: 11391, -22504: -23421, 5082: 27279, -2537: 27017, -12136: -749, 1815: -31786, -9416: -175, -12810: 30806, -9899: -2793, -32007: 30752, 20930: 30725, -28783: 8969, 29565: 2902, 18834: 2903, 31282: 30845, -10893: 28071, -20454: 1174, 27915: 5772, 29383: -1684, -5885: -19780, -9746: 17492, 8958: -7053, -1675: 24931, -20548: 29629, 10029: 19670, 372: 251, -22290: 1847, -22754: -8267, 15349: 14893, 6565: -16252, 5100: 31913, -21771: 247, 3407: -27092, 31264: 8619, -31498: 30586, -26457: -15280, 13900: -6472, 20237: 23494, -9435: -20123, 6560: 684, 6684: 13629, -19962: 31911, 7387: 22300, -16475: -211, 18073: -14359, 9010: -16589, -8927: 28464, -20438: -14947, 29302: -13068, 5174: -12114, -2684: 8886, 22145: -17371, -11264: -13950, -25938: -12728, -28145: -25911, -2871: -16462, -9775: -19757, 18920: 21013, 22571: 13793, -7253: 614, 1353: -19656, 22230: 14776, -25153: 4229, -26295: 15362, -25138: -16289, -26420: 21238, 32553: 2348, -17295: -15555, -18560: -30281, 25786: -5042, -10591: 10906, 17986: -1866, -32187: 14848, -8185: -18226, 28767: -25694, 15864: 740, -13565: -5281, 16351: -17855, 20798: 32488, 30621: 17130, -605: -12389, 11190: 6647, -5191: -7463, -17293: 21338, -1894: -29073, 10118: 15281, -24187: 12088, -13829: 32655, 19616: -29201, 32331: 26134, -22497: 12542, 2780: 29682, -8061: 20915, -15085: 21858, -2284: 1496, 12256: 14729, -12669: 8208, 12081: -20514, -19564: 21060, -5230: -3232, -47: 12452, -23297: 25490, 15469: 19166, -31330: -1486, 22627: 6048, 2274: 14307, -32613: -17602, 31993: -20703, 14408: -24288, -1425: 2191, -27528: 12719, -13137: -19771, -10087: -15533, 23123: 13133, -310: 28795, -17066: -28238, -323: -28130, 30008: -23016, 29855: 9227, -11934: -24563, -16278: -19539, 3943: -23354, 13038: 8483, -1376: -15228, 7177: -28754, 5920: -21813, 1028: -27574, -27086: -11996, -2451: 31603, -22198: 32494, 20534: 11352, -6499: 17474, -17125: -9124, 30067: 29674, -12170: -27056, 987: 10245, 20189: 7215, -17598: -31297, 20584: 32174, -27159: -25146, 15669: 14996, 22287: 32183, -17952: -27435, -20978: 29156, 17502: 23504, -2148: -3829, 14096: 8068, -25471: -11783, -10066: 25659, 14854: 17031, -16055: 30964, -24705: 9847, -21845: 27718, 30004: 14241, -2415: -3601, -23396: -26488, 27072: 4241, -25740: -23800, -32283: -6378, -20149: -2325, -29938: -25721, 26132: -5055, 4443: -8672, -4050: 19873, -936: -11208, -17559: 20749, 14497: 11691, 16966: 20137, -29672: 686, -11408: -10767, -2153: 29746, -31040: 2878, 2624: 10124, 7960: -27203, 17944: 18886, 5964: -30909, -6166: 25605, 13164: 10691, -27151: -18494, 6796: 10814, -9287: 8912, -27917: -2697, 21533: 22935, -27712: -24484, 8240: 27279, -10392: 24267, -5470: -32174, 18400: -29304, 6357: 9981, -10733: -30914, -20535: -266, -26868: -11399, -157: -13150, -7205: 6723, 23256: -6764, -786: 31308, -10664: 1606, -20685: -882, -24938: -1889, -7206: -3509, -25250: 31979, 30426: 128, 23897: -24001, -2859: -19488, -32217: 31472, 2593: 8890, 4407: 30506, 22878: 31925, -7560: -2864, -2411: -26849, 22106: -6447, 24278: 28527, 27516: -9012, 5476: -6024, 9147: 13764, 24213: -24869, -1759: -16068, -5603: -30129, 31029: -2919, -14714: 19182, -1590: 12635, -28358: 3872, -2090: -12305, -20911: -2417, 20313: 18181, -12831: -31538, 10130: 12759, -15468: 14679, 12923: 22142, 18271: -29174, -30962: 23155, 27775: -4512, -26395: -2421, -17588: 16263, 7453: 31385, 8023: 2389, -12214: 21076, 18059: 27701, -8734: 21859, 12513: -5333, 25322: -8656, 12712: 23597, 25917: -21636, -19326: -24361, 4360: -11045, -22272: 31718, -20938: -18069, 13566: -7383, -23839: -21705, -24263: 21476, -24653: 13628, -23521: 15327, -7348: -27475, -19318: -806, -8248: 14683, -29376: -8615, 24517: 4415, 19604: 19484, -32302: 22802, -24795: -13299, -12528: 32372, 13871: 5985, -8162: -19078, -22665: -32732, 9803: -4532, 27376: -14806, 15809: -23444, 16523: -6943, -25262: -4067, 12042: 6032, -13822: 21798, 11271: 16788, -6415: 783, 8921: -12257, -10523: 11184, 13024: 26551, -8164: -15301, 26059: 21139, -19775: -15038, 28467: 13920, 24798: 27943, 23346: 24954, 22060: -14719, 4525: -7210, -27468: -30621, 25871: -1553}
diff --git a/vendor/im-rc/proptest-regressions/ord/set.txt b/vendor/im-rc/proptest-regressions/ord/set.txt
new file mode 100644
index 0000000..9380d49
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/ord/set.txt
@@ -0,0 +1,7 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+cc d2977c225bfd8d461dea19c554cae04a48f9155854b53118264fb27b2dab49cb # shrinks to max = 1
diff --git a/vendor/im-rc/proptest-regressions/ser.txt b/vendor/im-rc/proptest-regressions/ser.txt
new file mode 100644
index 0000000..d5c25a3
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/ser.txt
@@ -0,0 +1,10 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+xs 3983395997 40281418 114824171 2339847213 # shrinks to ref v = {1285771567, -841112960, -2090277076, 1080385872, 900828884, 615148720, -333870035, -1551786909, -1167746969, -1453736382, -1747821313, 367596715, 1982056530, -1495713558}
+xs 2832291072 3367532499 2480853836 1445020057 # shrinks to ref v = {-1006265241: 1190299023, -874470135: -656918271, -747552887: -119701798, -446035143: 289470610, -38617499: -70412299, -28555422: 742423513, 549345238: -1218765301, 1006459863: 373426025, 1730586809: 1217890615, 1741069766: 1330906833}
+xs 497222929 1550339526 1868828736 2852494662 # shrinks to ref v = {-33, -32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, 0}
+xs 3367619631 4093181880 814513877 3641392342 # shrinks to ref v = {-33: 0, -32: 0, -31: 0, -30: 0, -29: 0, -28: 0, -27: 0, -26: 0, -25: 0, -24: 0, -23: 0, -22: 0, -21: 0, -20: 0, -19: 0, -18: 0, -17: 0, -16: 0, -15: 0, -14: 0, -13: 0, -12: 0, -11: 0, -10: 0, -9: 0, -8: 0, -7: 0, -6: 0, -5: 0, -4: 0, -3: 0, -2: 0, 0: 0}
diff --git a/vendor/im-rc/proptest-regressions/sort.txt b/vendor/im-rc/proptest-regressions/sort.txt
new file mode 100644
index 0000000..a6b62f5
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/sort.txt
@@ -0,0 +1,7 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+xs 1397459766 1987461941 1386942626 306293423 # shrinks to ref input = [0, 777418683, 1143505337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1422499358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1143505337, 0, -275943289, -1, 0, 0, 0, 777418684, 0, 777418684]
diff --git a/vendor/im-rc/proptest-regressions/tests/ordset.txt b/vendor/im-rc/proptest-regressions/tests/ordset.txt
new file mode 100644
index 0000000..9f4a7cb
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/tests/ordset.txt
@@ -0,0 +1,7 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+cc ad212dea44eb83bbfd86396a2e0f9460ecb93f6b1a2644bc700ffc317638a37a # shrinks to actions = let mut set = OrdSet::new(); set.insert(0); let expected = vec![0]; assert_eq!(OrdSet::from(expected), set);
diff --git a/vendor/im-rc/proptest-regressions/tests/vector.txt b/vendor/im-rc/proptest-regressions/tests/vector.txt
new file mode 100644
index 0000000..1fa3f52
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/tests/vector.txt
@@ -0,0 +1,9 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+cc a81c870198d194d869b85a541fca54b5a3f3ea4e84705bfdede6212ad7451789 # shrinks to actions = [PushFront(0), PushFront(0), PushFront(0), PushFront(0), PushFront(0), PushFront(0), SplitLeft(0), PushFront(0), PushFront(0), PushFront(0), Remove(0), PopFront, PushFront(0), PushFront(0), PushFront(0), PushFront(0), PushFront(0), PushFront(0), SplitLeft(1026178654884686841), PushFront(0), PushFront(0), SplitLeft(2673257349917114567), PushFront(0), PushFront(0), PushFront(0), PushFront(0), JoinLeft([0, 0, 0, 0, 0, 0, 0]), PushFront(0), PushFront(0), SplitRight(6380212717721778205), JoinLeft([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), PopFront, Insert(0, 0), PushFront(0), PushFront(0), SplitRight(12236220624414400388), Insert(0, 0), PushFront(0), JoinLeft([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), SplitLeft(13848748256934322935), JoinLeft([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), JoinLeft([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), JoinLeft([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), JoinRight([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), SplitLeft(13115524110820767241), Insert(0, 0), JoinRight([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), PushFront(0), PopFront, PopFront, Remove(0), Insert(0, 0), PopFront, JoinRight([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), PopFront, PushFront(0), PopFront, PushFront(0), PushFront(0), Remove(0), SplitLeft(9383655485369749481), JoinRight([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), PopBack, PushFront(0), Insert(455053961473158936, 0), SplitRight(676041696221001931), PushBack(0), PopFront, JoinRight([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), JoinRight([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), JoinRight([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), PushFront(0), PushFront(0), PushFront(0), JoinLeft([0])]
+cc bae4a6aa243531a345cb36883fda4aebc84848fffe12d051df4e24ff22af3689 # shrinks to actions = let mut vec = Vector::new(); let mut vec_new = Vector::from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); vec_new.append(vec); vec = vec_new; vec = vec.split_off(6); vec.pop_front(); vec.pop_front(); vec.push_front(0); vec.pop_front(); vec.push_front(0); vec.append(Vector::from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])); vec.split_off(141); let mut vec_new = Vector::from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); vec_new.append(vec); vec = vec_new; vec.insert(41, 0); vec.pop_front(); vec.pop_front(); vec = vec.split_off(5); vec.pop_front(); vec.append(Vector::from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])); vec.append(Vector::from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])); vec.push_front(0); vec.push_front(0); let mut vec_new = Vector::from([0]); vec_new.append(vec); vec = vec_new;
+cc 2c8368d1e6fe86c9b944a688cc167d961767ffb028ca724bb3c12e2716cbfbf9 # shrinks to actions = let mut vec = Vector::new(); let mut vec_new = Vector::from(vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); // size 70 vec_new.append(vec); vec = vec_new; // len = 70 vec.append(Vector::from(vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 59, 108, 189, 95, 24, 92, 116, 211, 64, 195, 2, 58, 198, 130, 44, 163, 180, 50, 176, 78, 24, 2, 180, 91, 132, 176, 205, 155, 65, 228, 182, 175, 100, 204, 222])); // size 61 // len = 131 vec.insert(8, 88); // len = 132 vec.push_back(252); // len = 133 vec.insert(1, 65); // len = 134 let mut vec_new = Vector::from(vec![57, 103, 160, 147, 241, 248, 112, 54, 152, 245, 195, 156, 245, 143, 175, 51, 27, 183, 236, 77, 126, 27, 160, 172, 73, 179]); // size 26 vec_new.append(vec); vec = vec_new; // len = 160 vec.insert(0, 112); // len = 161 let mut vec_new = Vector::from(vec![191, 78, 196, 239, 181, 187, 82, 160]); // size 8 vec_new.append(vec); vec = vec_new; // len = 169 vec.pop_front(); // len = 168 vec.pop_back(); // len = 167 vec.insert(153, 32); // len = 168 vec.split_off(10); // len = 10 vec.insert(6, 131); // len = 11 vec.pop_front(); // len = 10 vec.insert(4, 235); // len = 11 vec.remove(8) // len = 10 vec.insert(6, 48); // len = 11 vec.insert(3, 194); // len = 12 vec.push_back(31); // len = 13 vec.pop_front(); // len = 12 vec.push_front(96); // len = 13 vec.push_back(77); // len = 14 vec.append(Vector::from(vec![70, 240, 146, 141, 164, 160, 150, 102, 163, 137, 14, 197, 249, 2, 249, 52, 9, 203, 50, 161, 148, 209, 86, 161, 34, 32, 189, 39, 208, 106, 47, 100, 194, 160, 147, 69, 4, 249, 250, 77, 73, 181, 49, 228, 141, 195, 210, 102, 73, 75, 167, 106, 233, 141, 182, 243, 42, 102, 166, 184, 248, 127, 120, 88, 246, 204, 127, 214, 30, 201, 205, 115, 28, 204, 26, 17, 67, 228, 44, 158, 15, 79, 141, 86, 101, 148, 76, 44, 216, 65])); // size 90 // len = 104 let mut vec_new = Vector::from(vec![123, 94, 60, 147, 41, 173, 214, 101, 145, 201, 69, 78, 61, 38, 60, 170, 56, 33, 65, 151, 28, 93, 16, 187, 49, 103, 52, 133, 253, 244, 125, 66, 56, 190, 17, 235, 117, 101, 212, 129, 170, 112, 203, 78, 217, 49, 176, 252, 8, 153, 178, 205, 211, 165, 197, 32, 171, 224, 17, 127, 56, 45, 36, 248, 66, 126, 110, 109, 94, 116, 189, 185, 24, 215, 87, 239, 248, 98, 134, 0, 249, 147, 197, 237, 6, 150, 30, 51, 149, 12, 31, 93, 95, 158, 229]); // size 95 vec_new.append(vec); vec = vec_new; // len = 199 vec.append(Vector::from(vec![127, 142, 241, 16, 254, 11, 153, 252, 3, 104, 61, 225, 73, 56, 149, 247, 142, 67, 4, 24, 96, 169, 234, 215, 227, 30, 84, 45, 209])); // size 29 // len = 228 vec.append(Vector::from(vec![194, 101, 202, 247, 108, 248, 86, 224, 255, 187, 50, 123, 93, 110, 63, 83, 122, 101, 48, 38])); // size 20 // len = 248 vec.push_front(80); // len = 249 vec.append(Vector::from(vec![228, 25, 146, 89, 230, 224, 101])); // size 7 // len = 256 let mut vec_new = Vector::from(vec![89, 252, 187, 201, 31, 229, 16, 211, 172, 223, 209, 123, 120, 100, 91, 241, 223, 42, 71, 212, 42, 113, 211, 128, 54, 142]); // size 26 vec_new.append(vec); vec = vec_new; // len = 282 vec = vec.split_off(188); // len = 94 let expected = vec![233, 141, 182, 243, 42, 102, 166, 184, 248, 127, 120, 88, 246, 204, 127, 214, 30, 201, 205, 115, 28, 204, 26, 17, 67, 228, 44, 158, 15, 79, 141, 86, 101, 148, 76, 44, 216, 65, 127, 142, 241, 16, 254, 11, 153, 252, 3, 104, 61, 225, 73, 56, 149, 247, 142, 67, 4, 24, 96, 169, 234, 215, 227, 30, 84, 45, 209, 194, 101, 202, 247, 108, 248, 86, 224, 255, 187, 50, 123, 93, 110, 63, 83, 122, 101, 48, 38, 228, 25, 146, 89, 230, 224, 101]; assert_eq!(Vector::from(expected), vec);
diff --git a/vendor/im-rc/proptest-regressions/vector/mod.txt b/vendor/im-rc/proptest-regressions/vector/mod.txt
new file mode 100644
index 0000000..6ac6122
--- /dev/null
+++ b/vendor/im-rc/proptest-regressions/vector/mod.txt
@@ -0,0 +1,16 @@
+# Seeds for failure cases proptest has generated in the past. It is
+# automatically read and these particular cases re-run before any
+# novel cases are generated.
+#
+# It is recommended to check this file in to source control so that
+# everyone who runs the test benefits from these saved cases.
+xs 781088174 2402437932 46071810 3445483747 # shrinks to ref vec = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+xs 1236163365 497060525 1875560600 3785939576
+xs 2440477773 3871129562 3025797391 1057174199 # shrinks to ref vec1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ref vec2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+xs 3956050500 706730731 3245945489 2502775722 # shrinks to ref vec1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ref vec2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+cc cf2875f6f7c5648d87ffcab4ccac7f8a8f720c93ee377e89f8c86e542cc643bc
+cc 3f8ab4d20e0696c9811622b868e9e2e11df5e6195ffd427aa305e4c6b36937f0 # shrinks to ref input = [2074036082, -13825946, 1485618086, 938025892, 1634050283, 343602973, -606035941, 2086123502, 756455726, 1967901285, 417064296, 912931675, -48362083, -439614021, -192545534, 353571790, -1804858855, 908622705, 1183010347, -2019732894, 474300008, -1087280630, 1989024406, -1862412421, 1817688323, 1779903690, 645225408, 1290443907, 739077543, 1459983883, -19629421, 921340531, 1254057305, -1854941617, 339275035, 1177377681, -107461978, 1556951107, 1142459430, 418860714, -1711737411, 1787159709, -316274917, 1302348247, 181570291, -2076292901, -1093494155, 1763629984, -1195124258, 490574341, -681065204, 1238632378, 853854507, 42089611, 1831408714, -1041889085, -421564140, -1913933099, 926289166, 279182650, -2127045141, 1738196395, 2053843176, -2017898141, -399808861, 457054821, 1398259288, 560215405, 538259370, -1037968371, -737896076, 341049037, -1211866783, -1843247477, 602815427, -1981792594, -932949201, 1730346408, 173892487, -118710082, -993398654, -852952873, -1368077643, 321394671, 2093514113, 1831301356, 2104751555, -183869811, -1503190860, 1135803650, -25841157, 1218834281, -479227795, -1808365999, -1532913102, -1328086922, 1318622180, -1280127583, -802930281, -508955020, -1574788467, -1982208682, -563261649, -418424840, 2029013774, -1362803987, -638036545, -947262269, 1950557609, 1187410224, -1464584417, 1384726544, 413235774, 1436482752, 1395432848, 1656858203, 147231077, 1946166606, -701896304, 410570040, -1905606977, -1122557347, 2122591018, 567266348, -943154118, -1971951936, 590807013, 1967462062, 255252417, 2073823043, 1541319971, 1453203803, 1421341138, 132882974, -1352759657, 538478979, -140652930, -1307846641, -221794328, 584699783, 51954554, -1851000469, 400639112, -1849914695, -608123546, -1897558717, -938554976, -1021874582, -1619777886, 2098079695, -188166053, -654806278, -1089147663, 1364112441, -2080156329, 485140329, 1867162848, -1435377175, 1281905818, 464841556, 1285796301, 1233354604, 1251770836, 972787149, 194394838, -408637346, 297940676, -764140760, -535189066, -1222082930, 1999659587, -1466965620, -545915560, -33381613, -3391831, -1726247123, 1541843291, 618382071, 1692204756, -556631887, -1010281118, 547567742, 262071110, 1315561258, 1041276450, -200019451, 155953937, -1918010523, -2034646338, 179308692, -1851545907, 518204726, -1644852449, -930708052, -1533983680, 174298704, -1142603020, 400835696, -1032416568, -143748802, 89618872, 1498511740, -1964329731, 1985385121, 1338534044, 63395119, -2024486383, -1608930868, -2132981855, -1724578322, -1192711882, 1794405014, -1875127241, 220328451, -914341018, 1456640965, 1592862117, 1416491276, 457921478, 694438266, 1597638181, -1033179164, 1392568444, 1320710298, -1026116152, -1107223499, 2046373754, -802840884, 167120902, 2132541214, -1939037919, 376672960, -809965082, -629582607, -1849899910, -49034754, 814355126, 1904252470, -1995358474, -1535123866, 1964249876, 1541812798, 1216319781, 1448772690, -1676360707, -593183425, 367191330, -1015415169, -209835596, 973923323, -1379232452, -1678253796, -504812765, -2093303787, 1352940938, 1298454946, 1581876111, -1223031747, 2069730200, -1460608552, -1737622339, 1109644043, 2026556453, 1759367532, 1086741250, -167537825, 1616204085, -326437736, 955819637, 1295445215, 336028006, -1727534730, -968937744, -553518261, 1670053153, -1349953260, -2120024551, 1980134547, -1068452794, 1219491483, -390297250, -1475253674, 415787435, 1873218319, -964316540, 221387283, 1591083275, 1444258216, -1881949415, 776917485, -1456154045, -1552934014, 2084443571, -1120296261, -1579431939, -1519754301, -1709430045, -303381422, 129976350, 254373149, 1407938652, -334266500, 24715971, -1489003805, -344545827, -30707531, -1037864976, -1932107944, -1947334424, -450501819, -717436421, 555717916, 341387118, 369635675, 1599459501, -1778790486, -1104209594, -2118365426, -2054102940, -1118790563, 850092741, 2031700649, -2032648691, 209452659, 1033303173, -2138994429, 747531727, -1564008984, 479576488, -1210763963, -147017823, -78176051, -894576638, -1997663736, 414627089, -460407928, 242360038, -521406219, -1628996761, -744872182, -1441232914, 1846502295, -943262183, -1393886050, -2018639700, 145134549, 187913768, 69737401, -1313998467, 1510329953, -621473150, -982308299, 1043016699, -1651933122, -1244551793, -289264939, 1877434840, -885867921, -1455488637, 1208421381, -195139456, -507382900, -1417009162, -801223255, 913934347, 1483498591, 313323757, 684949109, -2138586829, -2071891390, -812202386, 1737302175, 1076518260, -526641190, -2049254033, 112548900, 323995436, -791419496, -1225118760, 642320913, 383365901, 1380650886, -339607804, 2033605956, 1103328389, -914762689, 1158292416, 1643458103, 139201662, -565020354, -1313785974, -863936467, 897894968, -1312998944, 1790634237, -752758530, 439608095, 1681084131, 233508147, 2013294518, 1823519587, 1660588466, 1812760899, 508524059, 1184818398, 213279538, -1222991812, -1978978464, 971476813, 1841261427, 2132433812, 1958231930, -117862732, 1650837593, 1029355018, 779022208, -1419168200, -340738059, -467041175, 329912954, 2132095988, -1585519098, 1323577018, -810116712, -1865039613, 1617692461, -1807759080, 344751862, 1450322400, -248458668, 237856838, 934330482, -649300467, -1895742412, -68722199, 288157201, -1819800236, 636713948, 1350627276, 86963139, 707515305, 1637864209, -951128924, 1833027683, -660390999, 727450477, -178917142, -1756743187, 153010136, 1146380330, 1149200284, -112449880, -1722382195, -1105256026, -562353456, 735928455, 1980254150, 166745367, 1589677843, 239612358, -1375912249, -232347030, -513829568, -715230968, -951636353, 35308988, 1058861976, -939881777, 389606025, -1455012972, 1789973526, 819109054, 2072323170, -1718042069, 415141655, 91908874, -375749327, 1622668705, 575657694, -1904593276, -67784013, -172853454, -484633603, -93271368, -1345817662, -1137764517, -1270761846, 726587010, 473120028, 178775245, -1701651765, 1526034877, -959144121, -183434587, -1617575041, 638251420, -1667918115, -829628671, 2035538892, 1670451796, 1392586407, -496019207, 903216680, 2100415815, -1980994623, -1052104848, 1457997902, 135859152, -108183568, -1097707977, -1374810787, 1180961208, -1307964614, -655644955, 1068486096, 581472280, 479947778, 136787664, -1476233191, -771095637, -1946363681, -21954842, -1629269370, 398541279, -1381636972, 456435952, 549611143, 1226758538, -665527736, 921771361, 1732495943, 857537416, -1311210307, 259851132, 54363142, -1872821125, -1558611717, -1561079726, -2050987563, 1820207889, 428187339, -1822780242, 676403468, -1654516077, 1731138284, -459002904, -2110845122, -621879519, 957958995, 1265282103, 243944836, -1271620168, 212486812, 1544089397, 1225721531, 1373272554, -1146075901, -31903557, -2122165744, 716785949, 773898185, -1697590745, 1139026087, -1128365692, -625874054, 1620393856, 2049458344, -638108114, 1006443422, 244013891, -959077606, 590687801, 1457741822, -836587639, 1164800185, 715176364, -1990226498, 1876286734, 1104112736, -1019905535, 1546003147, -1944204741, -1441042435, -1003488031, 1193976065, 454296507, 88091747, -1241971921, -372366427, -1131355056, -1993192868, 612679547, -1014555561, -2072304807, -181217339, -1230739815, 144971487, 636393978, -571012714, -1037687907, -1159249903, -656360123, -752128517, -616386904, 1621018842, 2120187290, 840041366, 1046715186, -213798416, 1220245598, -672389981, 963148331, -1445841173, -1758726199, 1919633920, -2120029560, -1217985998, 1161564327, -185318835, -1236360705, -956544035, -2144416202, -613210283, 1670320117, 828779231, 1146210465, 2096904410, -896703053, -1793409666, 484239052, 1374451134, -170334499, -1298101602, -1884559050, 120611217, 561196767, 825646390, -379512545, -1181612672, 1725080453, 894394587, -344082758, 736879648, 674694083, 1619268347, -496023195, -102002782, -842294653, 1841077684, -1510106855, 182713856, -202141272, -1506286097, -745352139, -1623254497, 1993580158, -1458213604, -1063096945, 1838489414, -1507167817, -1800227771, -1597408579, -786176532, 652248741, 369542434, 1568176235, 2131816918, 1675019550, -35228538, -626903300, 925830026, -2112784346, 417584189, -1057780140, 338713052, 825189157, -541098859, 795314319, 834369951, 1813578641, 1853897695, -508754162, 1131302557, 1842805572, -1386265126, -105109281, 1929191619, 365363316, 30848530, 1648738008, -5477858, -128018202, -1616404752, -706096224, -669233949, 1470778925, -818029978, -1123804154, -1801848224, -128380870, 1979870858, -2034279195, 24763756, 146178405, -87107679, -1276578948, -931079626, -19523975, -352157139, -2089700377, 878963733, -933252824, 177118516, 2007822342, 369516438, -223358742, 1555386773, 172477838, 696822368, 1734455136, -1691821089, -1710391517, -852385941, 985649133, -990853305, 2132107158, 1027224135, 1243623279, 1140262391, -680877276, -487308262, -2012563745, -158258209, -776719120, -280474401, -2089800633, 1110970379, 2042227416, 1822232534, 434874365, -1708107889, 564960608, 603651451, 670259206, 496003746, 1781379733, 263720034, 1348487686, -500344248, -47605549, 1083823409, -2112131381, 1360946561, 1032611909, 722713543, 631919140, -2020465896, -1425404176, -1057926350, 2016005948, 1500712949, -572195007, 1705736830, -607815961, -1110944216, 1521417863, -1845376244, 1600750078, 726936858, 1057595290, 621086544, -1389672811, 605472649, 1332661070, -906674643, -1110321279, -1411856682, -1152283803, 1551997284, -1920544851, -923902286, -1158501532, -183191214, -1440914774, 2039809837, 708032355, -783129450, 1757226306, -1934942490, -387201262, 954917910, 2047838574, 1011062626, 2013368665, -785120726, 2110535812, 1784304612, -1463847791, 1144411860, -245946308, -80365437, 1567197443, 1327272314, -140150720, 149507793, 1159202773, 1002514003, -1744390956, -1782985230, 1673971410, -777733567, -129088441, -79017303, 52585550, -334069958, 1154008540, -430846671, 1438426004, 1802651992, -1130101106, -1840626986, 436239024, -1031507775, 1338703766, -1672638532, -185408152, 2138867350, 1455179070, 495841734, 243789940, 119847865, 1584300320, -967618123, 450392156, -333159947, -658236010, 985332812, -828567444, -703879489, 810152232, 1362837274, 538318967, 1493290149, -795241024, -329956784, 1555841105, 1288467661, -712740577, -1555985260, -1096322447, -587003901, -1969396615, 1262483995, -745308685, 1415894777, -927442975, -1119406446, -841365439, 1590961822, -1137095817, -471430773, -1724561514, 1632082470, 1452194693, 1573724207, -1056390572, 1409850492, 1986869003, -1338889943, 1028065063, 852777652, -1970303190, -162211687, 191430130, 73303236, 1248707160, 1147073730, 1963985187, 85123011, 943234918, -589830911, 1615305226, 877377745, 413476354, -1485535096, 292861396, 587319220, -1093011335, -1323555037, -1357193160, 164263022, -972519902, 279224127, 711182294, -1995243735, -1793989650, 1352628071, -866818457, -77298747, 425992637, -1595732809, -700857521, 94834560, -351790881, -1648488658, -450350491, -2086521426, 125456589, 1699220019, 2068296684, -710274617, 646836800, 1804572376, 1258920542, -1787200449, -1903274259, 1206277195, 772958010, 303500230, -15790904, -1612308290, 1658129395, -395132767, -176780729, 701517154, -1141166097, -506094904, 419452540, -447817973, -1944275095, -587149278, 440910705, -1954163668, 284196487, 110272837, 1383525792, -1590873999, -2046627948, 1609135967, 1576362735, 1351579814, 1215558731, -1571835272, 1164889714, -1687222223, -308301954, 548400081, -1603661876, -1492992204, -1069693438, -146086196, 1654865162, -1744673963, -1916511304, 1156765219, 705280294, -1351994050, -1457658843, -1643654416, 1939831051, 592724212, -77904168, -841119817, -1916382996, 332785278, -523144810, -1937360372, -1783779649, -1296361371, -1334714400, -340608540, -557600043, -2121148923, 336729750, 70670973, 1700104880, 1211975311, -2065301796, 1350766899, 1008664094, 914213634, 1451337520, 72519135, 1621122800, -880167527, -1996260667, 1543405835, 19988, -1006109465, 1022821761, 1920504508, 1853584207, -1219874606, 818730373, -389483600, 1126720754, 1200031245, 90176802, 400890505, -632493449, 2126131937, 81577335, -831586672, -1557362007, 1624430684, -97733102, -874664357, 1859678361, -2058068798, 810835444, -797049033, 1588534622, 722602759, 587748230, -306983628, 2112257232, 222045709, 1806043771, -1995279884, 708369281, 1593214010, -594305532, -835696452, -261598470, 1700209807, 2132552449, 1134259195, -557873538, 666199347, -1370860865, -1291669929, -1982793775, -964359611, 1411523767, 874684473, 280843736, -772863939, -1760910534, 1834571177, -113850263, 964555207, 1700093129, -1291386198, -453641221, 1575423428, 1737962346, -1205243353, -1815954346, 69474747, 923104036, 1181772263, -1954223897, 1640227821, -2032732182, 741984480, 695783719, -1075712461, -451815548, 2088922812, -1074740902, 1530562045, 1991403690, 784239790, 840688915, -1065420476, -1783096063, 729574579, -721908166, -806317184, 804801148, 990212065, 166291018, -1286443454, -667451876, -308501055, -194874181, -1871320761, -1358248959, 2057411783, -1382427531, -710083396, 1875533947, -57075992, -1381920306, 511702421, 1053171309, -1989916206, 1155691146, 1768712079, -579366500, -1487994331, 1109105390, -448084072, -1316657967, 23535972, -610752518, 920167859, -685935559, -361038175, 614940771, -1835683232, -1464216722, 1567931048, -1994985293, -1575541261, -250001784, 1659320670, -1129013935, 1227172121, 1021763464, 1360636903, -1009013211, -658125530, -1375782121, 1240924938, 587120020, 251840472, 1919062628, 326163621, -1388285489, 1216631946, 95329632, -1263592868, 1431874243, 475640951, -1885419865, 138624677, -231681197, 1594004410, -114908843, -126965190, -897916266, -646374849, 2140471964, -42192764, -1136579062, -960331802, -1914310317, -161196491, -887650349, 1751087483, 1695100819, 910614545, 2031160212, 1827844249, 1184629796, -143447496, -1098200504, 189279679, 1324510949, -1446474674, 374348185, 814073640, 1059475157, 2106225596, -1353443328, 1489890147, -1710764596, -1784900998, -251447273, 2054477315, 1585596197, -961315036, -826391659, 910636006, 1693044605, 1064368829, 1494075395, 1316546601, -1915811198, -1968971680, 917565630, -911293726, 527747479, 1226513819, -1194618477, -1066559495, 615261865, 109378971, 1985712025, -2121477532, -710315708, 462546122, 244402885, -1169605677, -239741560, -1389817631, -2074550579, 426106154, -1406477206, -1611764701, 1220612586, -169469038, 1633206125, 703871587, 653033018, -1812149862, -143687434, 1563767746, -2029373357, 1133913077, -1365421112, 1830895650, -1241992896, -526096394, -1504042041, 2034202791, -116306895, -105403378, 1320613411, 914735204, -603131075, -1337211362, -709897527, -398529917, 864272188, 745999546, 65547189, 1861061706, 1212542882, 1333816648, -66085575, 746272134, -1975437052, 309057506, 1861395667, -1621979177, 1634029512, 1155954467, -967116681, -1160188235, 2144749944, 612130365, -1694063490, 1188913513, 1817673964, 1581379395, 850453154, -1821257251, 314169881, -586612280, 704538858, -550049394, -209614563, 662701873, -311754096, 1377384853, -2115678459, 838659047, 1425206620, 265309427, -1769712716, 794796500, 1776676236, 180574163, 1731804946, -1245564323, 124720676, 1536773954, -460052747, 1697871505, 1131379069, -230355481, -375495423, 649038466, -2053993612, 1646267153, 1066665731, 66317061, -357886827, -1529226434, -1720347572, 1374808084, -1683348431, -657294744, -1648480561, -142156380, 804824504, -393825521, 808709041, -666437984, -217705813, -2137435184, 1878510110, -1106819282, 801244361, -1643847311, -2000588465, 1420335452, -377832648, -1181104589, 710498099, 1776638075, 823288316, 1610711184, -1652544835, 132984139, -296219092, -114074886, -302097585, 1314050769, 1841154579, -1644619138, 528246600, -1276685666, -245772515, 507798437, -373604894, -1594177389, 53530042, 651204691, -2047265000, -311902066, 880688919, -1613610621, -400217694, 82248699, 642273308, -962271244, 762202930, 1377472172, -55275715, 1724616384, 487093745, -437663694, 168541739, -1812211398, -1672271840, 881873677, 1114714497, -904275714, 980093336, 540542544, 365158655, -916121916, -1187305107, 534011775, 782554968, 1163745042, 2035150524, -1512225129, -651081570, 362911732, -358329340, 1150492243, 182748386, 625114055, 882334292, 1098022965, 661677805, 1546581972, -514109477, 1643063823, -316855599, -442291463, 314094648, 1406436485, 767663595, 332893275, 1988709222, -1693267882, 474960718, -1711721184, 342144578, -1863678194, 2081877579, 2089996190, -471238875, -1097388511, 152530052, -993210765, -1805356187, -937869973, 112616890, -1650110162, -1948553974, 1610043089, -324810425, 1153590211, -2120221729, 1747016685, 1048445071, -200354549, -186862725, -815791749, -1319742901, -1672326416, 154887756, 600989314, 1621636945, -1511044851, -1989762847, 1244663259, -1972206082, -971692935, 159648606, 1886894019, 1256820220, -305051454, -1992313537, -1614655295, 2062970258, -732510151, -327269492, -972065271, 314883827, -804361736, -1802664745, -1393097923, 841119789, 1306073353, -1268939377, -1212140202, -5727530, -1219272851, -1944932538, -1284292025, 1613138533, -1566829015, -2124065514, -890344075, -1725254559, -340276035, 1888494158, 670809273, 490260198, -450901623, 1062109421, 1212084769, -1501158577, -1298993648, 1911739572, 1772401749, 1740321100, -114970408, 1894338453, -485024171, -997653831, -1343152304, -1902325295, 2020326338, -2021698673, -1714917529, -558328846, -1898519224, 1269234258, -1911896692, 1184951814, -724811169, -145504403, -593702511, 1898191072, -1480726052, 953055855, -1821482370, -1887272472, -546961180, -1304957288, -531926924, 823439575, 724449411, -1271201114, 927202475, -1535450500, -2147175631, -1112598415, 866322046, -1564446585, 29633599, -825456558, 150100279, -2101568583, 359203977, -1237656177, -1816457309, 1642157330, 1610350540, 765556957, 1631810071, -233161011, 1845036552, -1946832639, -720202126, 1238716982, -111929575, -61735137, 460862103, -964499783, -1719796295, 1431908922, -2021835794, 534546885, 606442281, 1595336494, 207703461, 1994438784, -896480284, 1985525729, -1708393804, 1394205953, -271754554, -563841883, -819961696, -1646837392, 343169754, -182200579, 1202996831, -1078270387, 1345234359, 393601534, -434470623, -1593472207, 1842910383, -1801179439, -1099448595, -823573945, -356217029, 1217853059, 420981607, 1454030672, 403134304, 867996715, 1600236310, -1419419307, -1419962415, 1305298669, 2020494006, -2109351160, 1650520625, -825913866, 1069743846, -1862232186, 606928841, 1158621547, 2104404684, -485894381, 1851371246, -50298200, -853066598, 985824221, 1004369806, 1102935179, 1510783885, 1656067979, 927075135, 1170380815, 1774084327, -481903018, 47851310, 44620135, 1330599795, 1350266355, -1554545431, 1064732618, 66409816, 65526106, 21165577, 427740885, 483723017, 35454706, -7354557, 1047226914, -945721408, 345991533, 1571094729, -1971201628, -1894897988, 1447332988, -1233870505, 603392934, 1072266402, 514282162, -1642540303, 1762619187, -832224359, 2077531767, -1517254591, -1712552797, -819974299, -1875907532, -1661342398, -990812716, -1240965349, 1607455043, -1377916738, -963550263, -1211027112, -1628311755, 1463570154, -1672122427, 894733706, 544168552, 606117200, -2026249981, -1974738484, -1158307622, -1365243007, -1562950578, 2079141243, -235622301, 614947263, 611227439, 85917271, -1177848821, -664696881, 1488438760, 1177956309, 59705022, 711345438, 923223046, 1203371455, -549647450, -35023964, -1505117893, 710465445, -1296368867, 1630729548, 1557945985, 844231014, 2005708325, -1290199164, 1304486157, -217612581, -1931913813, -970249370, 473025451, -200709418, 184538323, 1213312738, -2013039594, -1639401940, 525613809, 1245902519, 1706341080, 650706587, -1773352619, -1179651170, -575729581, -1730951972, -260659192, 1468639200, 1162190522, 1682825499, -878374032, 771849933, 240576651, 155325731, -960977566, -992840686, 2056114509, 1738055400, 294977645, 1264418031, -958333813, -1380453956, 499832797, 817392330, -1247263376, -777045122, -836124598, 899690640, 1527550217, 1305253225, 1044413882, 1814223024, 931157089, -1723631238, -817502582, -829951866, 2087626889, -1947546236, 971164418, 1939629075, 952567194, 1967395635, 1289866873, -1744342751, -13909708, -1681951265, -73308599, -1335323714, 337521938, 898485675, -961252002, -904441097, -829430518, 1647349729, 859110940, 1009996690, 1175364, -1731015109, -82089215, -1874190134, -1582759345, -595698798, -1796552845, 639185195, -2059403318, -637567169, -635726071, 1506201648, 971714982, -1001821939, 572478864, 186545027, -1574180302, -32768479, -576949254, 2052783601, -151628868, -2036643463, 1778894281, -1197478516, 1753628928, -946610274, 882925391, -1256849931, -222651507, -906735335, 1938435700, 345182693, 1104965399, -1649155143, 435000686, -1909422785, 1216166408, -1692256880, -888695288, -1768507878, -2063241053, 1828957201, -46194893, -489710286, -410395703, -2103572352, 988971566, -2101803910, -1895006133, -1195331642, -1252662530, 1707417472, -967229313, 1792762625, -1102087985, 387508985, 1231080158, 630489021, 880641861, 159427921, -516227521, -1630783764, 1115924174, 1425792795, -566104154, -1150501290, 1969777362, -1230136655, 684335591, -1027332760, 915071942, 838375480, 1507691727, 28096794, -1619278869, 1961812843, 1596475991, 1386509383, -1225479197, 1220206769, -1381497381, 1291039841, -803224587, -895608024, -1364075382, 958971519, 864821661, 243797844, 342931602, -164939684, -411568688, -618750496, -708408003, -1872778333, -1002871277, -584030075, -1666646320, -1808942452, -1981790540, -913956051, -60986585, -1792184994, -1238634575, 570040290, -1753449480, -1592475740, 749966826, -1880520928, -272864035, 1936731130, -773985737, -544732237, -1698904105, 2129148869, -2035046528, 829219482, 905659495, 1582796391, -192820708, -2001536680, 1701433266, 773507903, -766695198, 445972053, 1953498627, 2130699149, 1082788801, -818872630, -346828415, -1325716989, 1744486675, -1565767710, -1835163165, -867656874, 1335135691, 1793823082, -658815696, -689290922, -309120621, -1955820388, 93013624, 1486938108, -284530947, 1524825754, 1733900812, 1457593653, -1355871840, 648014650, 1755325084, -709076667, -764763066, 1739307655, 257954771, 2047109644, -156656991, 558478547, 1258135392, -656024989, 1024959894, -1512664685, -378250925, -1949903037, -139772205, 641075170, -1036173394, 881333798, -82300171, -974627005, 475862077, -1911663845, -1599081849, 23810813, 1957974322, 1503233714, -1722056665, -1378688795, 302037199, 826208596, -141706235, -1206737332, 669753363, 1982305051, -749055015, 1039516909, -498251521, 24230781, -866890024, 1905972132, 2121969063, 1568323848, 1982848987, -1672235500, -63968325, -325701882, 661605179, 1812026469, -399265824, 719541907, 1410608334, 1777006498, -1049031294, -1420572565, 1750207842, -329757753, -1457069586, 1420911533, 2141384494, 574688220, -535474851, 1817098927, 1745079322, -1397130927, 673154800, 1128049219, -9664779, -117030017, 1215158711, 609783724, -964683549, -354644958, 892408159, -1015147858, 1688871110, 786905015, -807927458, -1426313497, 738749954, 432699143, 2034921165, -1200485975, -1413453463, 1937157348, -362092578, 1356874957, -1709834974, 594752720, 946796298, 1854767205, -776650823, 213518265, -37832322, 377817837, -1549358859, 1865874275, -675793518, -853299874, 408852684, -2101382816, 2106904971, 641549702, 872639835, -1625781499, 1578043569, -1869099544, -1520434438, -5792783, -1501624842, 1591670846, -1679808201, 307611723, -1669856920, -1732370715, -1435788919, 1349286702, 1762122722, 444504859, 434118061, 1531872154, -1921635151, 461501365, 171995757, -787029246, 1450608733, -965916943, 2109390499, -968905926, -555935451, 197622877, -1273797603, -1146425472, 1025007550, -2044487715, -1766399309, 1444621382, -1366310202, -1920916880, -1555651494, -1535193099, -644504916, 1008757743, 2114227944, 2146670725, 1615083220, -375991599, 169656183, 347162435, 832769616, -1215247623, 714458165, -444110872, -310018744, 1499610027, 1464902845, -748242684, 863157776, 1156691939, -876228300, 1914798725, -716881422, -34404712, -1073518267, -1842831631, -1827986121, 1149347194, 1108742924, -1812776801, -1347072639, 703653852, -1664322579, -1516110764, 960302225, -2037192203, 152564419, 1172752504, -458652203, -416139558, 1395448680, -1562149933, 846592421, 1478024746, 1382685158, -1212006349, 62959140, -1052743695, 431591648, -1456232854, -144177870, -655319813, -1525278474, -872244779, -721521788, 45166108, 1095986725, -1077614150, -1456137894, 1438074383, -217036601, 958421168, -231776335, 1741860394, 242567606, -20690983, -804748349, -409173917, 22481376, 686480262, 2127592680, 89614444, 1684548825, -984033810, 244142203, -1819765814, -5864415, -1621233543, -1063410560, -986930256, -130908238, 508599121, 1318739213, 896055054, -90612498, -317988103, -264654415, -1329221037, 1470575530, 1164650924, -1071623508, -1437421278, 2135634422, -1240821586, 1076346272, -1266511203, 1250699414, -928392746, -1177069029, 1318782928, 843470750, -248021515, 1187937926, 1443419921, 878529241, -1118633192, 1947534301, 1494772836, 779692278, 253098856, 658362515, 84661694, 400271970, 1523996720, -1712995981, -267561915, 480800796, 1922989838, -460091455, -1832061899, -2047758766, -1864498316, 1124875090, 1574530078, 626652963, -1541103034, 674196527, 1569962865, -1372652113, 1385927992, 340709540, 171708628, 619839443, -348877606, 2027369285, -843916036, 1637078240, -814551079, 164779239, -485665085, -1588076105, 755263840, -115516048, -46400229, 1238897345, -395198949, -1800028195, 1773904467, 870834333, 1729827340, -661543153, 1964144948, -455531520, 1137110697, -281908104, -800939374, 1841735580, -1945155635, -1078994053, -1727806263, -2114522102, -694243633, 121866799, -2019364398, -1776580513, 266209479, 1672380585, -946581043, -815000738, -782944163, 2109990170, 514632370, -1636390124, -1146493658, 1808746770, 271495095, -1730754553, -2031292872, 1782264703, -1085845477, 45845271, -61199851, -1452794038, 766525656, 465624801, 564578530, -1536401328, -1350960158, -822844540, -1675533314, 1463564272, -858456464, 830256249, -1402020590, 1061822244, 2056427231, -818237356, 532810618, -135657641, -495351699, -1523926091, -1264935009, -864112343, -1121277765, -1387523599, 339045071, 696066596, 796576915, -368902456, 687860556, 1598519608, 455454634, -432810106, -1782184913, -1134133295, 1815259154, 248760036, 714170821, -66177395, -1543284772, -781067614, 1488997215, 1189488805, 74603448, 1015125628, -1352920507, -1585448216, -1565182640, 478156282, 1179041562, 1820827756, -1157795129, -1802276672, 209807979, -1309984341, 1129463870, -1886483323, 1281556385, 537249359, -1462568933, 1408903083, 2002922014, -1599364601, -1954412043, 364995218, 2130230766, -45339351, 1809174838, -597555785, -1694863938, 1590113653, -1515483817, -697800002, -856001429, 235165263, 507560979, 2127875549, -851572918, -1675427211, 1750307663, -614113733, -214111301, 1775363940, 1935997873, 821649232, 205051377, 1511250329, 298712720, -462817078, -1611814691, 1585121429, 612069516, -210320298, -925801814, -980440069, -2107723588, 117209888, 983127763, 1317541730, -717236993, -1876759792, -1316138379, -256985663, 1497690548, 1536687898, 266189925, 1992605358, 1062600270, -663324143, -975208133, 389924880, 1274310235, 170158308, -1384484254, -1831200218, 1898972867, -492853557, 61806028, 1273757991, -1160788979, -424235333, 437862120, -1059353567, 1853494041, 72071260, -1109873047, 167168738, 1520669889, 1180353142, -1481132995, -357402117, -369109703, 1291650654, -1600486499, -1082549661, -1749813781, 2105194217, 1032420477, 262986466, 194821755, 951729698, -275962403, 171767054, -674920470, 959584790, -679108067, -536711441, 887066445, -86563567, 1212841687, -421100963, -214630196, -1543529359, 937281409, -74279649, 963974934, -1990658056, 503440542, 2109210720, -232706253, 1009908221, -1854072025, -882006402, 712057373, -2109350230, 913223831, -161622508, -1964288122, 431926902, -401951225, -921597038, 711616884, 443179653, 806599158, -1633467433, -1651928717, -1227985736, -692216005, -2043662074, 1657634295, -279432510, 1688185410, 1329733075, 1925894026, -361652441, -2100044059, 614627571, -1988406558, -1093670315, -225607928, 1040892877, -551764273, 258020151, 1764708688, 1379025933, -1301742585, 193852539, -1049683994, 2096234346, 1441367841, -169123979, 1790047960, 1718395001, 1916251528, -823831239, 2028778371, -1263190013, 1773093197, 1464745833, 1557101023, 1171095454, -1305732503, -57688736, 534714168, 1336831841, 577399491, -1694162936, -688985713, -957445079, 1479776685, 1009735413, -1481884552, -2118003710, -107595726, 453231361, -1278085937, -1371933214, -1326750180, -1509814098, 104964229, -2124793331, -726494051, -1405813182, -569417804, 1350247623, -1893729588, -526892997, -523092364, -119332878, 690575897, 1356673196, 1240271248, 1336359033, -1424078190, 777312073, -698621368, -1265466655, -913875957, 414763056, -2024757661, 150811391, 1985421865, -276870421, -734979648, -1159784487, 1908805935, -1412188802, 3707295, -803678155, 1353282903, 1092966435, -519856726, 688511683, -1315285217, 1754532099, 731675915, 2036642622, -490675351, 702933419, 2054538165, -1605673030, 530137404, 631630234, -396828210, -457910645, 328936322, 1459368517, -626717242, -1493160930, -2024598588, 1185915275, 696036597, -761221335, -1456523719, 1046970154, -138840183, -1141389775, -1082707957, -1190849711, 1056337011, -522959331, 1010405190, -382694875, -1964500446, 1247583659, 1038167337, -1978296836, 1266009218, -1296473165, -1145916624, -899275827, 1193825143, 1413595896, -634764006, -878342348, 1542505892, 875211556, -166409244, 502753504, 1213055506, -603568940, 76615997, -1421135218, -213490441, -1168059769, -231967227, 1978211993, -1960258751, -1930974314, 360249920, -1919900572, -2062200627, -268952584, -1153432068, 627820224, -2130086132, -1868552892, -1909712430, 959778829, 1212057528, 258670222, -840166096, 1943036424, 116014457, -1384564186, 1184824951, 908074466, 1585254178, 98466435, -168240947, -863531830, -1427312059, 1284229190, 507098737, 941402140, -219402260, 1346622990, 1231522110, 507733839, -1610263475, 144940486, -1736219543, -1985784682, -1736477148, 603323115, -1129349621, 1089272848, 992075028, 36696481, -657430524, -1705217716, 327007641, 492791025, -1259407248, -1251063263, -111142734, 1450262749, -1220553021, 477158174, -70417219, -1694169983, -876747649, -523121266, 541922519, 1767514138, -149436036, 742074375, 467226103, -1645352866, 1463142293, -1079931863, -2079781743, 1248229926, 1321418176, 2048066386, -1608973805, 1544685842, -443485137, 690831677, 1640492515, 513242750, -1755983918, -672226322, 1549624163, 816639186, 646205565, -2142323173, -905952197, 703777055, -361653501, 44826984, -1379377990, 820248537, -1473766197, -2072259218, -388366794, -744795441, 873255125, -696641358, 433712478, 207213832, -1560365070, 2127711832, -1451704177, -1565862607, -893138308, 1456692780, 1348910332, -2121013998, 980276993, -1843061248, 604634047, -1232571302, -1165472835, 1156164852, -24630408, 1150613935, -203576330, 1286773721, 1977554936, -2039880063, -896639261, 381035347, -100644266, 219587978, 554988181, -393548497, -127309584, 909855725, -729457340, 1244918128, 337717193, 1722032001, 993989177, -898880404, 592326961, 1243729511, -465647747, -175536179, 777125268, -1471335967, -665574837, 1685142415, 1597001581, 840231777, -882099121, -316303168, 498831327, -662886359, -204322356, -41289200, 1585296337, 686025290, -169769641, 1003321996, -655288081, 1005986195, 814550702, 65769638, 2077078909, -1542497868, -2146482548, 379744626, -1963950020, -1557933593, 360176856, -121386100, -2078743455, 720428054, -119841489, 1154785840, 1515275690, -314559824, 1875610627, -1076311913, -1082989363, -181445483, -935200241, -61787913, 2135864170, 341352098, -159713250, -215695069, -397899140, -512684949, -12334642, -827156706, 740332051, -1763474847, 1204803845, -266555084, 895305683, 41473725, 1628813578, -112444784, -2111837439, -2108547200, -73161153, -702781657, 515297797, 1235614775, 10629611, -530023308, -548143140, 28726025, 449800942, 823846666, -714581681, 148920007, -54038626, -1051920081, -476868902, -1703879247, -938905943, -844892171, -1723049906, -933077256, -405211328, 66095241, -911785435, -1304378355, -1959897308, 952937046, 2123136523, 1205958787, 491498347, -1479208316, -1539225545, 1892839403, 2022346914, -268091380, -1868316126, -1040787542, -980745392, 1331153007, 386141789, 905136649, 1684659822, 162135379, 414483581, 701005460, 1480201692, -1378734756, -26663830, 2123027811, 2137781510, 1787376948, 1402927997, 527423640, 658729620, 1365138809, -18518360, -1230600230, 1013529188, 62224866, -477888403, -1253825556, 446687634, 941525323, 303729260, 1847788660, -1922037783, -477693880, 2017702746, -756743447, -244660715, 614705266, 255273660, -1393183902, 1670522150, -1560879023, 987843854, -166329927, 333448683, 804001381, 2067859291, -1199315134, -2078029009, 153842, 701127658, -1531549608, -1683478668, 1987577619, -1640582263, -2009199526, -412380532, 98749849, -1622982931, -149553096, 1542882428, -115820399, -1850379151, 4360834, -1533034354, -60836772, 655035911, -112587015, -1014416375, -734618575, 228765388, 356365259, -1720978146, 1710607987, -1789263947, 357197964, 410350068, -376736347, -501374844, -452867016, 1282014807, -11985927, 866210915, -1115431305, 1513930489, -1008652725, -551342155, 1941015218, 737178471, 1243940774, -1015983675, -53098971, 1175052126, -706117912, 517538224, -41378405, 1045433289, -1523129539, -1747847230, 638526342, 1915722861, -1698342417, -690431884, -955134729, -931915076, 328490030, -493518972, 984960214, -1886902365, 847353486, 798836730, -1054139840, -225804666, 407385152, -2147014033, -817638518, 1392445506, -961976157, -1421291746, -969326438, 1854942995, -484593744, -178727688, -1445470311, 1053803562, 1738927941, -1664962209, -899079492, 407751969, -1398488508, -973290192, 920431027, 1856922128, 2096160299, 1969255694, 203478216, -1338364749, -1652169167, -1533707229, -50510061, -1523764991, -691586996, -53824577, -737226924, -1426166019, 1281653039, -53358504, -1929518512, -529993360, -651674151, 1498810198, 1031393196, -1652135346, -51111247, 2091523585, 463536701, 1071500444, 540748347, -1795803951, -1915732026, -1661419024, 1029114990, -943529072, 1191387116, -548955746, -1234894541, 597527317, 276199807, 1534347243, -1314792800, 1431327081, 219153107, 972023687, 1901811873, 208388106, -125631310, -349149337, -1584150966, 1886912642, 910816749, -1929990238, -944824810, -1512832057, 763956042, -147358629, -803941828, 2051946990, -1094453475, -1929845707, 1147677932, 1509703282, -2023367159, 433193027, -1576664844, 467784813, 22707195, -1306487477, 1816452998, -1689783528, -1325463290, -1730861539, -1305484409, 921663692, 1095739859, -1693175328, -282877545, -2057324113, 692037929, 1371996733, 1523501989, 122700143, -1091200891, -1829463609, -535515134, -1275135525, 2082791475, -520777512, -1776275494, -720306156, 1033873346, 285927881, -231741121, 1128723274, -956072348, 1439571541, 400465914, -1709917383, 1521453111, 497485965, 1761977252, 957916923, 1519928337, -1868347828, 2058859760, -358080945, -735750927, -373871869, -1397041945, 766223779, 1953031959, -174605878, -550189113, -578254936, 2082017934, 2146629123, 652233524, 1695194840, 514322181, 306067373, 955171379, 1754955550, -648275577, -1536160045, 1152150347, 604002190, 751839298, -1689626970, 929055119, 13379357, -1571319025, -641498014, -215056514, 244571851, -1704294277, -1630617596, 281545329, 274608783, -1734503580, -748864779, 516015612, 1080659711, -2100788843, -1808091194, 1583937858, 999838812, -80396371, 1696942708, 972384977, 813845578, -1619818522, -827535035, 738564182, 1534735370, 1178084327, 1062099304, 649971853, -700047417, -1924569531, -1071445519, -1211292415, -1593959669, -612844096, -1489226422, 507356064, 2053936928, 1017591240, 1266532126, 1431797905, 1587222715, 412743829, -1337081654, -545271364, 145199956, -808302537, -1199919563, -633947214, 167847619, 1807643435, 1346678288, 1355332320, -1666549008, 1632904986, -1427036767, 1670652838, -1479994595, 2089300643, -1047712382, 1391799561, 75631797, 948338528, 1312184720, 1023391218, -1195405238, 1015022648, 235798234, 350656348, 1568644988, 1297496858, -449555341, -515678563, -1864857293, -975601193, -787245172, -1490952641, -1279827921, -1156382894, -646116073, 858316145, -769950195, -39710393, 88536925, -2001591585, 218665428, 917160146, -1814524748, -1137967214, -879059513, -1790020379, 324738303, 1766102514, 1542662684, -924069648, 849207790, -491346181, -536819925, -132727520, 1857712941, 16245144, -866306331, -1419882343, 107014671, 1621166321, -68371792, -2071733847, -1658684180, -440067934, -1950770570, 1094581455, 1213349283, 764120071, -1166648492, 1488933296, -1773499402, -1703199123, 591044452, -1960323109, -33062195, -1165353733, 1213061246, 1415146231, 503178368, -446015207, -1495681265, 1604961090, -293643754, -153737604, -1984907329, 1733363335, -224751819, 796487852, 291842267, -1523522304, -1999692197, 1585224455, -1947336254, 652171247, 2125622736, -1729122005, 1630500369, -1033340691, -1573825480, -1425784021, 643475951, 642365324, -410417441, -1117474800, -909065953, 1194559962, 219654505, 63902071, 1290842847, -152761154, -510349809, -1924129042, 876929856, -1542946447, -475627974, 639979112, -252277489, 1919595738, -1727027988, -927128707, 1089814321, -491152785, 1638330106, -171769176, -1916941547, 1184844161, -1432066173, -1846428288, 220569594, 2140975619, 1452208905, 545709105, 194454757, 1372868620, 976549084, -1111806262, 1888253043, 579383590, -122749484, 168602881, -843792615, 1156474714, 427561130, -491579788, -154084101, 281990897, -2145365970, -1736855559, -438031098, -461649071, -306375756, -1541604875, 457219811, -1582055094, 1071799174, 192394806, -1766023671, 29265591, 2016019049, -611312914, 1318164059, 182883028, 673515689, 183005279, 1973182098, -738598558, 1649146052, -1011477718, -674883198, -1440025384, 1485943453, -1540612093, 1751645316, -2023346810, 1172217580, -1979057075, -736452510, 2134957890, -1701950844, 899095091, 1714720890, -1332274654, 65951221, -810976604, 1157241557, -1165276632, -1542772984, 1812399258, -1829440226, 152305708, 1670513630, 305284046, 696737278, 1933663867, 861576708, 1839383951, -278897829, -79305507, 441656324, -2008503123, 1621004839, -870578638, -1730208427, 1957759346, 1103575856, 292047568, -1604654269, -1510607322, -994649786, 853450133, 763234175, 770708060, 207245487, -1652224543, -490118797, 809015561, 882514568, -389634273, -1607640505, -1569563654, -1682730374, -754592188, 809697056, -1630238741, -1059853554, 280545453, -1176206795, -1620359007, -540935421, 391335261, 2057639650, -498384398, 1717509668, -466886631, 2099709458, -1010958427, 237492257, -873659995, -863100008, -423916400, 889325355, -237567456, -1363946305, -1830059701, 1851239243, 1894589071, 2008064337, 987008987, -219902400, 1323847226, -779715482, -1308702154, -1072433298, -769712548, -2012197226, 353818730, 690469944, 1063129068, -699150855, -752626518, -1173024120, 782754308, -899165002, -2137234434, -891176536, -405501175, 1333656964, -1256821647, -1077501077, 901009235, 378761437, 599284084, 666828278, 55874734, 377787807, 1798946341, 1194014376, 1876826962, 1608228205, -1076408145, 1398475380, 301348623, -2054022313, 432707081, 708175639, 323240415, 60633891, -973452200, -1689748893, -2977077, 1113338446, 1416515366, 1349334298, 1360506403, -838025730, -1952999649, 892626520, 603370344, -1348924970, -1514831615, 1621780120, 1904091156, -376542737, -172218436, 2018768947, -907105355, -1188075675, 1648932414, -899254596, 1109814078, -1793918913, -1548947405, -603102396, 2133289174, 890080233, -2113689655, -1146758468, 1489026587, -743563222, -861689370, 884389758, 449661587, 1077338769, 1897813232, 328663778, -1130090121, 1275118235, 1366341604, -1532401782, -422522473, -349218791, 2140373727, 1873900768, 1876051608, 1766397489, -1767224732, 131722965, 982727640, -752126908, -805647151, 638454515, 1374318748, -1561916119, 561587896, -2064139410, -1281816449, 240506899, -513360137, 1282074327, 1296125714, 625818120, 1199136890, -506723482, 1891863429, -82757734, -1416947287, 1445796244, -413901900, 1937555621, 2107091689, 117504348, 508323586, -1186024288, 1899017606, -1440021746, 521842459, -545367972, -612927121, 1955002522, -1881853770, -552571106, 797659330, 1065526245, -612345780, -41590496, 674019778, -1001718101, -1160268420, -454980785, 854171887, -1245143394, -1791015528, 438117783, 307914154, 337432457, -1090078396, -876162814, -1289713183, 327803597, 1697976843, -558907482, -1321389478, 2044641609, -411540004, 1823501589, 864101340, -1834526660, 1373944591, -1470872387, -226948560, 1372901370, -343459744, -371903978, -1312661143, 2079977874, 742408150, -1499057941, 148641425, 930992199, 544815673, 721621148, -115765913, 973369083, 424415980, -1549216758, -618597574, 1958625024, 1409447570, -603057203, -1527975650, 2104993273, -1785576485, 1908566458, -1018595235, -1710853318, -2085488267, 1281240065, 2113803374, 13943608, -1602197456, 2118886771, 173527948, 1826580684, 1240872132, 1756539355, 2087896242, 922143479, -191504695, -647281978, -171958154, -1255476289, 294425289, 927598937, 21643811, 752692611, -1216529539, -1822079014, 727835201, -577227146, 1165470644, 1786365507, -1813710101, -427640263, -47602469, 53783715, 1730451702, -987636326, -466143974, -1589553810, -1546085501, -1579856642, -899045269, 1505340166, -1164671405, 1072451860, -270630959, 1127407499, -540868162, -619655340, -2126409526, 938216901, -919985099, -1495017247, -1669832294, -151931637, 1839544242, 322354554, 1162744525, 2020189868, -287543513, -483345027, 1446638495, 325228959, -81595817, 1256944124, -1335443082, 1174488134, 364886827, -432665666, -272256721, 400759525, 473083836, -76586090, 244784110, 1188380885, 47224998, -68517340, -237020813, 225843503, 809268006, 41025352, 246789768, 1562386753, 617286531, 1324190717, -1506349386, -816060755, -1047085903, -1256320331, -1689755530, -509368697, -1252406445, -493635213, -2068517664, 899953449, 1581255537, -1617441226, 566665114, -1418703509, -668728976, 1805297953, -1529964729, -834572918, 1689145568, 948831972, 1271117184, -1687381788, 869449980, 1442881835, 197891807, 1621361190, 763601265, 970005330, -816032339, -1241430961, 1117056540, -877805313, 1778383552, -159774267, 1240555093, 933104706, -361664214, -1811290450, 894792515, -1974847711, -1011138336, -572652545, -1707302102, 1140169109, -1335453049, -754708933, -1798188869, -1754444925, 1609153383, 1462870019, -741108495, -1724820016, -1169570857, -1084569577, 166777230, 479334092, 434596987, -1160735569, -1683063484, -1881199759, 1722044665, -1020537872, 1439400109, -370373873, 1753098600, 119497153, 1576101051, -2115202912, 435633137, 1306599882, 2144034428, -943895489, 1197688145, -1690081745, 1966957071, -348851055, -1361463887, -1888382666, -706634846, 972485267, -891440476, -1427508609, 941311775, -204585274, -1584501749, 886272286, 1571755314, 2043848673, 311817685, -408680502, -1862166670, 1635880377, 1527572249, -1278096467, 1377118958, 1262652294, -1091118984, 2086516397, 329263994, 1552769867, -1527200486, -288433628, -563095458, -1584940289, 1334024223, 84739785, -259323643, 1100044557, -1708124818, -1646970400, -1936117242, 2072709245, -1091407826, -1108277230, -373676421, -67633340, 657604325, 1041026038, -1028341463, 1679570632, 1239226158, 1795718869, -1488333441, 670992852, 1251054416, -1773451308, 1508564948, -1108870741, 1848096751, 1893161372, 2042195526, -362483196, -189831198, -285495841, 2043709061, 549374138, -111287294, 478916407, -643916159, 2142122101, 1137203221, 205551013, -1758558588, -1189008453, -451701807, 355995071, 330062930, 310199126, 224784831, 1892658682, -120385839, 1178968057, 1566699717, 798371275, -101779713, -941844963, -564997779, 2069034392, 1798122540, 85386757, -784717221, 788256701, -1179078391, 1135154351, 445136728, 1500872790, 1491120999, -1018865227, 199051662, 1631248559, 1766760035, -1782879050, 308670372, 97810757, 1899550948, -2115836087, -696785835, -1049465052, -1289485631, 444214640, 2073806889, -1021030787, 1894878195, -382280428, -1643933612, 844385613, 1415378315, 821275460, 2102153981, -1064533629, 1944293771, -1998418297, 1242240229, 1699066528, 2040562092, -637924728, -771300786, -169991445, 778433373, 840770087, 1838070208, 1752717773, 1618897921, 1875774154, -373420583, 414868140, -493259749, 494145806, 1231826404, -1989016460, 1203203125, -1135260036, 1977748055, -1283449017, 950247212, 555052392, -488604066, 98995573, 985206533, 607174138, 1924737373, -1737859837, 1869378340, -1977557385, -1858853390, -714707441, -84622775, 802100375, 1434368049, -92901442, 1296808709, 1044407033, -258855319, -1814197593, -1180528805, -1869160359, 2100941288, 812234670, 1274094733, -277835, 228226215, 232912929, -1647043102, 183688632, 1136157093, -268463502, -1739267292, -888602788, -1385421084, -731134281, -1986935102, 459189529, -2015786464, 1342661868, 1240237828, -1293099296, -1094483741, 734711780, -1319809365, 1216592081, 1827537819, -179100428, -329093053, -577009030, -164967258, -1454796743, 1971805902, -323992780, 411470479, -27745064, 1579764247, 770766563, 553750912, 647003888, 1967845144, 1545891632, -595124049, 332495090, 1036458285, 974929185, 784439635, -298652921, 573884910, -349289444, 2064444653, -1621191130, 1255429289, 1369286628, -1433326243, -36551775, -106999787, 451044656, -87845812, -1083898758, -1546608651, 959535292, 1139314193, 276523676, 1541728863, -141361712, 2012223166, 805615487, 1648293994, -1323439451, -186640956, 1373899813, 1796657697, -17274317, 1173436414, -2061081665, -104692029, 552834229, 427672444, -40957158, -598521306, 78868621, -1010455675, -1536817788, -1612736110, 1248796439, -248308003, 1572783690, -670686989, 673543969, 11031149, -1864475537, -1453479741, -1969593833, 273071032, 1189603735, -89223578, 735883119, -1514604429, 1725576379, 1994560422, 1775114857, 896871317, 243717529, 1105336340, -1479198180, 931758820, -1344797382, -777718000, -937648208, -1633310533, -1898865004, -885327079, -694800286, -1859490843, -1212249688, 1240546906, -748514324, -1394103798, 2073669105, -1980277407, -590188717, -1109104871, 1684070352, -2069414525, -1660187001, -2111825961, -201318458, -498248281, -1902567486, 1423117527, -1031737099, -983508297, -823424708, 2069553657, -335142975, -1326063098, 1486359973, -733643559, -786761187, 1697038670, -1091436486, -1928944452, -1695442241, -401154532, 1209432056, 1098530933, 1885489601, 1179541608, 331935293, 176913743, 3081219, -1434190816, -1505383146, 1803905797, -457572185, -1071534803, 11571048, 1131962527, -1771869382, 241183795, 37823486, 1217427161, 1987203666, -568735427, -306617172, 1161643530, 590564904, 1400167229, 1701097954, -952201977, -1129228133, 2095430190, -1000081087, -1923201529, -1761301594, 1927547539, -2123161595, -880460130, -1753228718, -1319847666, -90424752, -1833724758, -1161370626, 1746396178, 1152137535, 1297624921, 693033342, 1235425011, -808117992, -1844322023, 1203230081, 1792834707, -859528231, -1033081524, -572373380, 1990195773, -162570317, 1714745520, -1990949916, 1329926727, -776376214, -2114245141, 2135487702, -1416937561, 286296009, -304241500, 1576212335, 1259961504, -1889004976, -738773038, -1234269522, 1336373882, -382861588, -1933786274, 1993284879, -778592344, 1673217994, 734054451, 1265958727, 470887463, -1136611770, -797826828, -845643334, -464718680, 1264641961, -1214830467, 492726206, 251812049, 746694449, 1899336026, -51762697, -759125365, 1637988900, 673749776, 1473515398, -693266942, -1732826881, 157760323, -23029609, -2113927790, -1190920987, 1646600475, 310793168, -367260854, -1915046107, -1004175641, 1490227158, -1287766122, -1770297209, 2097838891, 1335129038, 408269560, 296936593, -1718727486, -487059993, -662017890, -1309116197, 426018789, 152263385, 719152480, -144526094, -126083625, -1731173609, -468284909, -554786558, 60877782, -1525879147, 1781464866, 151185691, 343636334, 1860584536, 1196616106, -1184296278, 620772008, 1769090949, -1944954026, 1901058524, 738333538, 754721325, -1476349118, 1745185259, 425188529, 1286989520, 402033204, 857854440, 145004339, -737493166, 2043189171, -858248635, 197383432, -358487916, -101346052, 828719427, 1163463215, 513712662, -86911793, -1238467517, 1703799957, -1003879642, -509271454, -1810329514, -2138156127, -950637028, 953540266, -785952983, 517116806, 1146919570, 1884706964, -2043708214, 233153451, 1858488921, 2081122223, 182807755, 1017136123, -1227998082, 569102866, 971760511, -1337926428, -967396970, 714451755, 936890372, 1657304674, 159246135, 1737453408, 889274779, 1093705692, 1902009733, -37633448, -1234081166, -473867125, 1219066117, 829674752, -44923731, -934855099, -878942314, -472397992, -1768482520, 1692918869, 1500983525, -1048871130, 349234751, -1950738688, 44237037, -958358960, -146976346, -2036028016, 1586327603, -167209353, 1899496947, 1738501276, 878188643, -426972254, -864406208, -1551660693, -2088937598, -2061053943, -1931753692, -1583219289, 176444714, 1743454252, -305535081, -1216351997, 1814870305, -237628264, 653602890, -616896896, -778803951, -959013264, -772004972, 1483984089, -793023314, -1254258183, -1070184181, -286779787, 556508486, -1765271586, -1510248020, 892731305, -1095823761, -1145760983, 1279293536, -1258762364, 1174533003, -434460605, -1643499501, -694465319, 1249839444, 1769811645, 469526682, -363913390, 1669258944, 1398157972, 642493446, 239282979, 1756119045, -880464279, 54315273, 862358681, 1151159196, -447772998, -238614009, 1624173119, -49335278, -1898197275, 421288608, 1263513648, -1952853509, -1204312840, 1007760506, -1631468313, 1662367972, -116668764, -537632551, -1094572564, -1262550033, 1104729134, -1779658610, 451398948, -512984257, 1579936149, 1168918838, 1844776551, 1424824056, 119232521, 838131160, 576387104, -1952740534, 2139630082, -1404800115, 440431011, -1020708846, -1476487036, -761323034, -1760043890, -586163271, -1066091016, 1491215679, -2028304454, -744471179, 1823203439, 1858757912, -2102915996, 1398459514, 886637164, 1839257546, -7107191, 1275403245, 1810290977, -542075957, 700835203, 1429066447, 676759135, -834382466, -953039724, -1749087564, 120317812, 17072646, -1942125795, 972240712, 148020674, -1591316233, -910449245, 1426073050, 1147534318, -936550476, -2081241319, -208748296, -960267372, -994110123, -613427933, -201595969, -205196827, 1647051338, 1800255508, -228058846, 70624346, -1842306369, 444655177, 1519873942, 198743973, 2123434816, -522298181, 1694721492, 1747571840, 852083982, 1546848600, -924944917, 356821868, 1709189508, 1668557110, -546818375, -1952199112, 989863762, 877136595, 992412062, 468931108, -463588557, -1022299235, -1046424340, 1420079433, 1548862723, 2137388235, 215317625, -271630187, -615775243, 190807702, -405769929, -1576130825, 1496142733, -1816684069, 135144401, -27072909, -981631974, -111025619, -692242667, -299529448, -1687847043, -392941988, 971233702, 600794222, -1051683690, -1122250514, 2111564991, -1602199506, -1701950254, 823121359, 1547122641, 1467659883, 133498611, 1065266807, 736412120, -1535887524, 449203580, 861102027, 1402576846, 328245414, 1153931228, 679875697, 1131167819, 596755769, 1338750611, -1730948388, -601796230, 670851701, 1563967767, 1992741842, 1659260503, 85445763, -533428286, 360259523, 1891477125, 1855743279, -652463979, 2088965943, 2079231939, -832482670, 1463180761, -801182039, -1160588152, 1630924181, 1733681719, 1859897246, -1218870190, -178910436, 2128076427, -1696546617, -692249829, -1995884661, 2107745556, 1827043533, 2038838233, -1448254580, -538119379, -372960911, -99879391, 1062853129, -1203762349, -1132583315, 623474890, 2118341926, -1549691210, -186827350, -594591207, -679962823, -68245454, -367434618, 426495, 586318770, -591370912, 2092805730, -100148441, 1709716404, 571477958, -185568072, 1046582057, -1047478805, 1831440204, 465849328, -350939875, 210582224, -1729745183, 75244795, -396883531, -243319899, -1969436122, 1314731936, -1918753892, -830896817, 684447648, -1544392575, 619529880, -330622431, -994511347, 2045003157, 1702070421, 490862419, 748577944, 291389637, -935634362, 1872525645, -1919864962, 1972665458, -35727230, -1716530400, 1168047645, -1064624250, 726532814, -1797857541, 394949659, 700463859, -379501333, -307664985, 1315401226, 1326569301, 1803528155, 2101958569, 1601695987, -1287374120, -1092751566, -1039584456, -2038173482, 1218511439, 1087579784, 588280399, 1309035880, -1852388772, -1257814555, -530773262, 1071041812, -1964545898, 1056903014, -1324831597, -859705221, 157302000, 481765849, 878480411, -1742504093, -1335975804, 1523860378, 731675379, 655850775, 1464113121, 1229879349, -251011086, 127432841, 280181141, 100193492, -109082009, 70498174, -1222911310, 779119011, -154051694, 1457747732, 937304362, -1018489071, -109525563, -885944448, -700534214, 929194314, -24302403, 19252334, 1605221340, 110622696, 1145782755, 1532085456, 692870428, -876682148, -1217491345, -1859580331, 1200856996, 156936207, -78999386, -202473350, 1957494031, 1217258624, -840951573, 446690427, -1554112269, -1474023399, 1159667145, -1373856588, -956707787, -300758204, -1079712574, -908623770, -552043928, -2125205393, -17902291, -1576782502, 1861074752, -1735575563, 570152198, 1043235675, 2114020604, 113362085, -675038828, -1701644914, 1294456644, 2002826066, 656766203, -1860683636, 1666227457, 1350539743, -1158617354, -764264913, 1232908095, -1043903274, -355073201, -934926572, 357353202, -1133796212, -118483349, 343744975, 1480665850, -235339094, -890930135, 703181016, 1593901304, -2116499641, -2136025892, 1886250291, -1421351409, 1995789030, 2011021743, -97709252, -529744802, -977079763, 1461719437, -263098075, -1631477150, 1732390911, -1473074318, -1386450233, -1527641596, -556198416, 1554454189, 913242433, -442030097, 750757981, -464848653, -560135963, 1463283303, -575727544, -2101442342, 1111285145, -1802737985, -1647880052, 310516965, 1321872843, 31232586, -1082359948, 1305288621, 101976628, -106800635, 905762446, 1405925544, -975354904, -1911913665, -1262258650, -2096778152, -397839680, 707372112, -2100946576, -1649095945, -1937463837, -1326087674, 780088137, -289955576, -1991644442, -1424190086, 791103730, 696238544, -1200068271, 176051935, -2085488814, -1522879659, -1386910667, -741143752, -1044807339, 1833100441, -1388385218, 243186997, -47865005, -1762318004, 789749490, 1371176934, -1263914852, -369045848, 481876275, 1372926182, -2012472678, -1853824242, -1896567703, -1089943017, -1667761452, -264180301, 228157639, -1916780821, 1985867650, 897451767, 153917328, -905842727, -1220592946, -631629644, -716032020, 2025552307, 1562522355, -1010334971, -927267644, 754628258, 1272622097, 1104384221, -1191154385, 302129978, 1429817251, -960492749, 1644424133, -432607704, 976364174, -1684542904, 1041548268, 606620247, 1864262959, 1486820202, -1829132864, 526926870, 1691389284, -2143249599, -1240381542, -1236473569, -1825200060, -499895390, -1637535245, -902454684, -829107044, 528212553, 107198702, -1012973430, -990199684, -1965130567, -676513468, -1620543935, 470941096, -1654856265, -2048023307, 1204292631, -285460060, -1041645981, 309005246, -838590854, -794658927, 1570231794, -479573069, -154676931, -849990516, 905343764, -499132333, 467057758, 1969418208, -445207676, 2118601161, 718466116, 1324001445, -760912398, -1290246249, 182358651, -1019630363, 129483290, -274190333, -1651993714, -801670429, 43806078, 1935129416, 833913418, 756357517, -1178262913, -806416792, 333729519, 1345590262, -675687454, -1241029615, -971185697, -2033122062, -150126464, 752197541, 1257262996, -1559877980, -1113563444, -1471836203, -2007241830, 1187672164, -986901908, 1445846479, -2114639958, -544630187, 1091212071, -1624183497, -2004556494, -166279234, 798117463, -1670153399, -1432361867, 258628212, -2004477786, -304798408, -1148921742, -1091694152, 1244634716, -1802075338, 399011352, 1776825991, -1819251867, -2122786300, 366608225, 57505644, 1203759938, 1952010824, -1277074148, -875778267, -269726540, -1779917729, -172824242, 1450740065, 571533550, 1018399355, -917165589, -1537685861, -468413845, -112354081, 356053472, 986848556, 1045826577, 531034714, -494638766, 282530995, -648991207, 952087813, -1350575928, -85554593, -1433724313, -1106876537, -92355303, -19732342, 1279456531, -511004989, 2090995347, -194068701, -931731999, -1538206530, -1552383898, 1963519743, -1262967083, 1533354297, 1360187660, -635195693, -1460496431, 39935695, -443925678, -1258451114, 1896558763, -1043378822, -497425755, 1591810520, -135620511, -1635599941, 394692628, -330139562, 1543271410, -1087167487, 1833490804, 2145519002, -1849664784, 1966398456, 245189112, 1504568730, 469359097, -1794286574, 795164740, 154462290, -1132404487, -770876585, 2067624732, 1732871411, -1099848450, -2128319171, 210355300, -566289010, -1875910766, -480568172, 759449271, 637007572, 1220173900, 707230374, -1881577458, -1805267881, -1440820388, -326639744, -498089825, -1219644263, -2114438404, 937098841, -1644360943, 1149071621, 13711491, 645592525, 1857886503, 1276685503, -666910404, -266525754, -1669889761, 264234806, 1942278121, -1720574312, -643229384, 2000722726, -1573775580, 424751713, 1675835969, -1507691437, 1341007072, 1461057880, 89175645, 1284879519, -289397664, 829547553, 810368094, -1499886709, 1527321152, 589356112, -1055023562, -1809562043, 630704973, -1198396920, 1959028384, 51047183, -301144489, 632190403, 2081882212, -724580298, 2960323, 1737756651, -296986722, -71500043, 428711865, 520330322, -913649778, -360470309, -229840389, 17668127, 1836815800, -204069960, 439927126, -1231647731, 1803185177, 979344492, -1811730920, 389991226, -428787354, 648547699, 1604400083, 610540386, -284111845, -409677162, 1827323956, 1066890655, -2036376927, 1625912905, 33644313, -654908008, 711866787, 1166450727, -1854177502, -1672411081, -2136266252, 256114931, -766448457, 1486804296, -687045679, 1141973195, 348013692, 1719141639, 151815235, -515836906, -1973594612, -1336567005, -1786283799, -255995280, -1697254859, -197079406, -355509594, -775387994, 242346369, 1320772486, -355027753, 669325257, -1915807227, -1563840374, 1591832013, -864114483, 1771449603, -1358512000, -1696431172, 396663951, 1980618706, -1797636647, -1318072264, -2100252126, 1676268892, -2041332538, 949691227, -1396800636, -1501010902, -264804697, 605240005, -2018431252, -1823549506, 466310182, -599408057, 2061867463, -1955295038, 167063533, -1117278095, 1046514742, 1317399331, -1487521166, 1708600723, -1532741043, 524638800, 539771184, -1567346127, -1902421047, 1327690622, -399452625, 1978419839, -629061309, 517688324, -437534223, -1848642769, -1139690349, 1678750513, 2079880294, -154610982, -1206647349, 1026064888, -1563666412, -1019699737, -165240022, -1257386366, 16302777, -262978839, -972882478, -1596255938, -1007073849, -1693791556, -1740592051, 1920877952, 571275343, -1913072584, -112346533, 140687899, 142746125, 1539887879, 1124219102, -2042017316, 1159369026, -325843437, -1548040643, 437748400, -945663933, 133028676, -602009872, 1021336736, -233900216, 2145278193, -1685176493, 848377624, 713661621, -1603239815, 1253527041, -785278329, -2086268247, -99491729, 441078542, 2089559025, -1736814327, -2050507416, -1941490914, -512316064, -334217179, 940238206, 1399465411, -181039888, -572169948, 51555859, 675967667, -1980359596, -1723433772, -1886919738, 635420604, -583742593, -1634534623, 1290419560, -171286316, -817731524, 1312434906, -1759898785, -597641420, -544637197, -786446916, 841976872, -1791656634, -1569334239, -398713270, -1059294103, -1867585648, -734953327, -880867153, -837556602, -279074386, -473751100, 425227347, -727733420, 445990327, 635489545, -171288146, 626570935, -811611765, -2129693076, 1815181583, 2125699706, 1040368352, -1500182902, -827534427, -383495021, 1789798837, -2010095577, 2113181078, -1661360834, -1572673619, -156940158, 795771145, 1163588952, -1802413131, 1401931213, 91226831, 2133220100, 935639448, -794624944, -1207195477, -1907460372, 1017424463, -680334818, 537568387, 230845850, -1921146749, -107784639, 1448104587, 175526440, -827678372, -565172898, 892702235, 696460198, -523011714, -336228181, -53616394, 1484216828, 265473548, -811628463, -1426021115, 563112684, -728445080, -2108323126, 1770008742, 598117421, 289095112, -998266551, -991483720, 1012931207, 862005234, 1157773152, -856461279, 718081425, 890695050, -740010500, -1927331273, 732297547, -1060523192, -1610911492, -890318860, -2017287250, -1120743580, -203363363, -1043762290, -22037002, -264942164, -2021176334, -1800389354, -1504514478, -2063684746, 507745979, 811594422, 92249453, -839707683, 507943321, 550798292, -949118789, 932689129, -1483738191, 1759552051, -576389545, 1762152188, 1834491834, -701055718, 883658446, -1901711315, -22631475, 1904271650, -2135132253, 1461801992, -1523997509, 1816037203, 222963140, -463417628, -1086614918, -586342172, -1296250552, 1889492219, -1044343908, -1078371457, 1417179645, 1346055525, -1338333065, 240401292, 898463601, 2028103463, 1377471906, -1836081296, 476069707, 1776633981, -530452195, 968288932, 890819322, -1721041526, 881436101, -716205717, 1255670978, -698960771, 186221364, -1901368678, 13181266, -2021821419, 460530331, -1429362158, 1697726533, 1670115754, -1966795588, -168772316, -1214244161, 1209299080, 1476610933, -1445477393, -1336885137, -1458416740, -710253153, 717281492, -756110181, 1841549480, -1755847037, 1332182527, 955341156, 609214889, -811914714, 1628590942, -93174401, -1388811628, -516356831, -439546673, -1893975994, 1663021042, 1221883868, 239980858, -1466840556, -1619368065, 322640641, -951835123, -1038985615, -683118049, -670282787, -690866931, -449847012, -2061995824, -1388102853, 1516477368, 640253607, -1294087941, 309512468, -1611487107, -1909178758, 1235324156, -1017876933, 1118500709, 1110078562, -1170032855, 2051276038, -2022107000, -723906642, -1101379734, 1864642487, 632483563, -791748618, -986341006, -1908799289, 1305123120, 1726845770, 1850076284, 10511938, -867482539, 306639099, 1716648769, 202374649, -349524953, 1892990254, 1358814887, 1316030237, -577592670, -307946206, 1001830832, -528012684, 5525052, 243506457, -1323434124, 1375456664, -1165563580, -1343647460, 2085752549, 2102600358, -1043876060, 688338850, -667790744, 863013870, 723589796, -2068797193, -192827102, -2091522913, -1125941991, 40717391, -980112913, 1531854866, 1378300095, -865037397, 492844750, -1072377504, -1366962286, -569487310, 442014001, 2007878499, 1922820830, 926929369, 1093596960, 1736700104, -1370953907, -1084090578, 1974542370, -835520428, 515532608, 560437430, -813446277, -832587750, -1658872626, 588658049, 983262531, -1138021283, -915679804, -1808842116, -1732775241, -37732711, -139382643, -198280124, -753073922, -1661346037, 2026396101, 1432382120, -373896278, -1924437090, 730209528, -1593592886, -1259921071, 1366064174, 1343817041, -1974113258, -2104197288, -463028945, -2003101712, -1158200293, -482546759, -1202123214, 1106144636, -1048992621, -1716920381, -1983708276, -872999994, 1658308024, -161843086, -1104434361, -1810553563, 1586629286, 1943507021, 1239585779, 1497381990, 23941066, -1511485983, -1292172121, -525319595, 881872134, -537970334, -1261921096, -1481128204, -181565511, -908995954, 1261259922, -289729113, 908906986, 827560189, -744583768, -1774545524, 1641401552, 1479675189, 2094110052, -1660646617, -467649449, 1176466223, -1971337345, -142127535, 16936052, 92032033, 588921646, 430204899, 1450378766, -1294295346, 953133127, 2109622255, -44060504, -1628122187, -1965740641, -1291543529, -595254331, 751934582, -14179300, 1903705376, -282027011, -626177449, 1787407780, -1606210013, 202969546, -569436844, 1802381428, 1214079296, 1979721392, -474518336, 888014255, 947457302, -1629617301, -750493122, -582516055, -1556977732, -1156580924, -386127641, -1474706510, 1043354379, 779865585, 1492331480, -907328017, 1712098283, -1560289910, 446047665, 1828028329, -829261274, -89699967, 743025664, -1689810597, 1383953176, 155486689, -714590538, 944445991, -757630916, 1258251027, 901437248, -1666374860, -278797100, -1588249212, 60265301, -888566258, -975212770, -1050667488, 1132897368, -568759879, 1778024782, 1265136, 432500843, -395613238, -481388386, -1295348292, -1063206471, 1182932192, 763997125, -1668438736, 1147987730, -1299591081, 1798711578, -1431081630, -995701160, -1937413884, -271552178, -1138524257, -1167464766, -1346163499, 1232997848, 79055216, 731065700, -135452621, 2142188485, -1696629842, 1291212111, -1256697752, 2107450363, -1532556144, 1594302050, -32439309, 671974139, 1184833140, 116018108, 1134849256, 1278619505, -1266026451, 649868591, -1293351797, -869726441, 1154499396, 1306229413, -334065883, -102088072, -1722293900, -397427540, -1264896145, -1265834122, -1158632899, 1727689690, 1394681036, 846314537, 22693533, -1473756825, -1168173184, 1566834549, 205766209, -188916286, 2018032159, 657159513, -1353289563, 950448763, -824578740, -1330551497, 1131370037, 2104825653, -1815931767, 1010327410, -429692101, 1889839321, 1390735967, -805901740, -1812076627, 2117839183, -1332543379, 1488558198, -984084432, -1212941465, 1919241598, -481513581, 495416308, 1678145196, 164935808, 62940067, -445100256, 636973430, -2109503989, -740546976, 1325287205, 269595300, -127163463, -485030574, 1757518990, 1525841992, 786502900, 34685337, -1827246441, -637214929, -2132456108, -2145068466, 482366670, 136455404, -1189251634, 1193571702, 1399591423, -605412824, 456959856, -240983508, 1101790475, 406309509, 1450379739, 1138603224, -1610604815, 1474957962, 737892750, -1863352403, 782239378, -96244599, 1166826194, 1430597679, -1414842655, -67896559, -1714244320, 1876213576, -141594411, 743227148, 1326103887, -2123741245, 1920795101, -1113100821, 1065934167, 1941371950, -1827742881, -1220891549, 384687433, 537505044, -1590238063, 1594202044, -825511470, -1928316518, -668030363, -97323434, -876701055, -1998473144, -1778352483, -1352806925, -1758641284, -553100970, -211681906, 387257811, 1507039009, 1804193901, 1058651819, 1161575196, 674709347, -319546981, -779538207, -1056611535, 251256344, 693404186, 437194922, -1658713950, -1801288432, 1018113721, 1338780308, -1216670331, -177752440, -761877877, -2089265100, -1613587474, -2056412345, 1869809804, -1135095829, 1896739193, -1652210165, -1381792955, 1347460579, 412548609, -1064099555, -222860994, 963497213, 534582273, -2145645948, -1695619591, -1053984336, 949046371, -1798042468, 1382981640, 914975224, 1977758142, -115912768, -927854003, -1888101238, 759311622, -1150381132, -635242601, 1702378448, 656920190, 330170442, -165869015, 786177024, -591730421, 1612998781, -1899126271, 765249873, 2087512946, 619979470, 2052306960, 1949077802, 725654678, 1809778443, -1222211418, 317127039, 1010145479, 2061683757, -28032099, 542650206, 1414017883, -2121220796, 1201370668, -1533701885, 1673507780, 1459625516, 1550957424, 562508126, -1439791928, -1008327214, -112005967, 163783558, -1608877525, 838637880, 1477659230, 830635822, -1080878017, 272070669, 1273867620, 180955359, 1457347688, -1933934457, 345622681, -2050107879, 517258659, 1585272397, 994567680, 1218919543, 673055822, 1771297071, 1827698889, -1982687164, 1076111895, 493057230, -1345851163, -843715648, 1444793790, -1680572085, 626572748, -797425747, 1736137105, 30668615, 615715417, 1386133100, 1844470421, -706966327, 1649859039, -853695528, -1699075962, 705101023, -1927867404, -210990334, 285119545, -63456911, 885527086, 1225888133, -1438597758, 1482202891, 1115394917, -1813462066, -325271838, -917557262, -1485034469, -2071964070, 1967708471, -308957317, 779168177, 680869515, 868021049, 1179897975, 885986630, -1201125406, 1007672284, -1995778044, 1669237647, 1102775073, -479698377, 112012052, 677407472, -2008228544, 1520295092, 1323540059, 1470520212, 247201932, -951322631, 1532334039, 2063700344, 1444835377, -1035289057, 1410714078, -1083505963, -1379420174, 1013396002, 1190436573, -1582951442, -821151101, -1942151161, -1380163371, 330171520, -2130715659, -28583501, -459995767, 973667761, -100453177, 307008783, 1345216289, 1524951312, 406465274, -28206299, 974183900, 536799226, 1630672756, 1129990123, 1353618907, 1089668189, 1904850333, 761952938, -871029652, -1822050367, -688586504, 272640830, 369035972, -1950878186, 1506509752, -998795898, -204219768, -1297629703, -899589825, -670683472, 1787960576, 1644016105, 338201866, 2116326931, -1899970629, 1642768842, -1131482762, -2112417422, 1778001898, -751926370, -459737543, -1847863240, 1624309077, 371959479, -306346411, 57355273, 1848838224, -453576818, -403673626, 157858522, 259945674, -2040696480, -1270438547, 959821219, 1235621123, -1200623479, 1865048288, -1413993835, 2095560907, -756457302, 1513341614, -1894743885, 465802130, 259217706, -1371355875, -825134093, -37760439, 1982607371, 982100976, -251461770, -109420740, -135303870, 1728254082, -1008755595, 1322635974, -1707814277, 1875502416, -606219798, 1414767934, 814026842, 260673651, 1060717532, -284469926, 603652165, -1926380281, -1480763498, -466085677, 1196938735, 1933902021, -1796760197, 1706198895, -366050591, 910643691, 97056506, -1141503023, 1588567766, 1279567070, -2028703996, 942925896, 243771320, -1111380510, -636551777, 1116350337, -858479096, 243543472, 1086819327, 986580791, 2007861973, 1031384023, -1143022022, 1912414163, 2142694296, 1007376573, 1311167569, 213499779, -740458032, -625478066, 1842838241, -593960214, 2128229231, -1955287224, -145847355, -1458464530, 87155307, -1040275014, -158823132, 1513561869, 913385656, 73953344, -1452911678, -777397744, 340137327, -370994148, 1573194720, -1663087073, -1990978380, 795522786, -83650937, -146455910, 483609360, 1585855387, -1943097118, -333323737, -1624074792, 667889848, -856114419, -1697745416, 1003506487, -1243529990, 607591537, -1811621020, -830991550, -1991348671, 1654977098, -1438865202, 1533704444, 1922463110, -1736638706, 1669981662, -345829244, -145942950, -625932037, -483179218, -221123135, -239959610, 282543504, -1599203680, -1742006890, 2012300773, -1105430060, -488277845, 1250922319, 838863466, -602547084, -1270174970, -797094148, -1801674023, -756778832, -941754326, -1189116397, -804409462, 1961039732, 74719705, 1030593184, -525977012, 1976015107, -1909474899, -1438007205, 943751455, 1598647373, -1126223250, 708225303, -1118695985, 536789188, 907843596, -607290504, 1439638712, -1198673677, 1300488445, 954212379, -1287227424, -2038595461, -1700445824, 1660525456, 1542921516, 1081759101, 1019408725, -129931464, 885268106, 1827191247, 329526872, 798939352, 900885749, 2090204093, 473854029, 6695964, -1571885698, -110882082, 1360464789, -1764692592, 624152982, 2090893717, 1282083699, 1890283721, -1713072328, 2101004478, 1907251765, 2068308684, -1149940849, 158125327, -306262136, -878617842, 1189970943, 2021037619, 477519483, 573804935, -93298682, 131138697, -1686110965, 1996378147, 1218292861, -1065325500, 1153402104, 999429539, -825020119, -946863686, -546491620, 792965663, -1478230982, 1434355582, -1694587107, -1249998648, -1855177361, -165161591, 1900361506, 1150385829, -1133265106, -1185711560, -1601032693, 437639327, -762564174, 639983304, -2138540512, -145096692, 1615100466, -467352404, -158476663, 452435267, -450434914, 195998539, -1259992039, 795224178, -661157535, 841030443, -403277952, -1768037422, -1335240071, -550512051, -397812846, 1018278885, -232161122, 1269834741, 634632086, 1926132132, 41228271, 487936248, -1508845369, 917116262, 1281813022, 1704212280, 2111810946, 148202946, -1653513101, 405820496, 812478127, -952723355, -1462311828, 1261885727, 1355900418, 39907862, -1911695180, -1559337887, 1815492105, 1292313827, 1132464543, -1269081408, 1898988954, 1193860859, 874988722, -1821956494, -621347948, 584514376, -1702834466, -465070338, 608773666, 474381651, -1245585111, -895717575, 644848640, -1881777820, 143635668, -1709756281, -1386888345, 1190555952, 714512230, -1973957462, -1499364946, -1511587839, 896202, 1290661604, -402237274, 1428127237, 579764631, 529519317, 979321212, -1892940262, 1779521679, -398148027, 934598603, -749246543, -1100967958, 508803829, -1630055310, 360609136, 158452743, 1211077932, 2103255460, 56670632, -909447983, -1342511656, 1930148350, -435514010, -770012698, 1039873800, 60907859, -718848142, -1506054984, -1686872750, 1908002704, -1955072156, 973271765, -307695281, 271730751, 1954004650, -2089919630, -846140224, -2131570169, -1572407944, 1375770961, 1147452128, 1896431281, -373818574, 235371173, -1779227785, 198950782, -658496693, -1926918750, 1869666309, -699287279, -856560017, 1963282157, 1680103846, -326458250, -1110867595, -1560846156, 535507168, -1129704981, -1297440470, 1215457189, 850033624, -1543009727, 1280572133, -675991366, 109180501, -1797046838, 462655578, -529046673, -1965948407, -90951162, -380177492, -1745766119, 470634811, -1988136729, -1181484889, 2043371297, -201899802, -2051985861, 773608572, 1298870683, 510816179, 2024816508, 1390836454, -1965452238, 1573743511, 2101971164, -557058113, 2047008705, -572878059, -2082464174, 2045885280, -1618586685, 1493452403, 315480741, -67987897, 1223469625, -211714735, 1149868853, -935657783, 1466493203, 2017301009, -363746981, -1409286889, -1604842239, -1721593741, -537192233, -601988941, -1205793450, -1967814592, 1809022425, 1932153337, -1357861460, 1123475538, 1147013933, 1007919760, -699694192, -1621215384, 2066906763, 1593585584, -475179165, 1143779301, -586129542, 581667142, 1492996665, -134971460, -235503615, 1688906035, 1609196744, 804863894, -1108706764, -646274671, -1069027098, 311553694, -1470507906, -1491583483, -844554526, -1171833315, 528747721, -1553568712, -1214535735, 1833189196, 2038088431, 392821632, -763421480, 181827223, 1913070046, -138432946, -304292182, 788965993, 1363804715, 369791559, -790756598, -1515406361, 1410804574, 1418922680, -441340813, -815009575, -1319477066, -728139288, -1449300487, 825291269, -924837484, 1542189515, -270906537, 1400435540, -358233852, -569487515, -99471149, -1444933215, 1522524067, 1446272080, 1487929120, 1943218273, 658282521, 7347755, 961561183, 228439552, 1137293755, 363938864, -930460368, -1262721440, -869797469, 195520033, 1856208903, -1381644842, -592305889, 1757003289, 1106835980, -1025502300, 1224396970, 2030538064, 1003485845, -1144370309, -1414702345, -228124146, -1074354608, 858772232, -2021953086, 1064276939, 1069010619, 1723806992, -1007188432, 1223648261, -32515918, -623447269, -1448072414, 413259913, 1310414793, 1980915107, 493570171, -638293668, -1896394894, 166398873, 1409785101, 1913979640, -1369339660, -144931303, 1398112338, 60412969, -1943421350, -1259699187, 860635849, -703617878, 912943583, -68782392, -1462452538, 1048712056, 2125593372, -1041579446, 1055064102, -262831341, -390597151, -1886237962, -876353887, -1915419926, -739741206, 670877982, -887505070, -736496554, -1482640793, -1289390476, -1860099076, 913978138, 2073436184, -697867410, -892805022, 1207152920, 1501257191, 615876472, -1651410936, 873983899, -902943686, 1156004525, 1832528959, -70970686, 1700299358, -876801647, -1957871498, -1568919510, -1048671770, -1289317034, 134106918, -1505588421, -1849118863, 1199316838, -2035170223, 747626921, 1116667945, 1985054427, -1498370169, -1471611405, -2080774379, -1278151647, -1584771942, 1495636961, -1873481907, 999261603, -883260509, -1723319277, 1082082621, 2112267517, 256910441, 1997830435, 1388706801, -1269559003, -1378663323, 631109243, -1147447055, -498407177, -503070464, -80867569, 587142723, -1530994870, -1895948844, 879602891, -2146732507, 1539449883, 696223252, -774555031, -1632124035, -819276009, -1958336108, -1315318305, 1399945276, -1438713330, 333027049, 785191597, -1133532244, -544335033, -1583465980, 1044996113, -801383905, -1882042242, -1767000104, -81361628, 711688180, -1179435524, -1637699251, 1038689704, 2082705598, -440781644, -880896018, -1880945319, 746337773, -1962866863, 1607533296, 1414422096, -216229277, 1491338910, 1268751922, 868522498, 1949357131, 150085240, -823049178, 519874998, 906136211, 1880165097, -296882572, 240315750, -219188289, -1271262921, 1386352457, 954316131, 1773419711, -1676181866, 1692695249, 1162872812, -796950845, -454589314, 1363666157, -368936427, 1913907725, -2037447971, -1255659661, 487915960, 1125865361, -2072867838, 1895727173, -1926421755, 1909077464, -297156218, 1141419492, 445083635, 1903099022, 1578252925, 1615689799, 9784283, 945365131, 1869253655, 1363070015, 1415617857, -1374773332, -24053714, 1925912383, -1151725608, 1963254455, -115511523, 685088653, 1994257752, -2072935340, -1763247037, 738357279, 1788765089, 599689465, 299419577, -1338585751, -870923977, 1106427347, 1046307483, -1722366216, -1562445700, 1349834553, -1900560798, -1002876056, 1410932156, 206008985, 1932581636, 1120415175, -1107515363, 2122814359, 2115419589, 677032854, -960179552, -1032597134, 1306093785, 250598985, 1399346257, 1263885409, -1359723772, 127748795, -1507208801, -345316697, -319755401, 1817741375, -846437971, -200035232, 2032312812, 1229335204, -1083031187, -608035888, 1709684861, 1758175813, 1578717725, 731742106, 388472928, -1640530790, -424153774, -1226394775, -1185515317, 1467306038, 1804681745, 1774559423, -850048234, 2040572450, -1304240389, -1311073416, -288264857, 894150318, 433611492, 1942311868, -1264482697, 1651399709, 1494322772, 1145757174, -92428104, -180343351, -87504189, 1500850477, 1794815867, 1110876534, -82490581, -46497552, -564501467, 1463635859, 1190109641, -784415639, -2142848349, 350761483, 1814798667, -934644213, 187100501, 1579970904, -586308816, -935549978, 1257543356, 767611618, 99787424, -342521857, -1961608285, 109480681, -1436127526, 322671461, 551301944, 2019301372, 693391259, -569069231, -786187815, 1479195472, 522160502, -376816829, -231805591, -739346990, -1235881491, -132802300, -236315866, -1649160848, 612730780, -100952179, -592361085, 342552280, -1816075130, 673167457, 1317780803, 2063807754, -132379254, -1418234343, 1499984473, -1409360615, -728707861, -1974335171, -1313137885, -1609282390, 1430499621, 1523677325, 124994091, -707775005, 2087940175, 1642400182, 1855929786, 1622443457, -1778512979, -1634604238, 1154697200, -1803419191, 1748161442, -1651637928, 2036482523, 392144337, 1033708636, -1016121353, -1987713610, -754978281, -1628297382, -71273841, -1198093568, 256920147, 1166332723, 142219233, 1523109504, 1627351811, -835890113, -259316639, -122400349, -760823620, -1666156910, 1482428045, -1206379991, -749673126, -312537401, -1540369943, 1355015623, -1833521536, -590564618, 1736424678, -361506754, -511774703, 1447411201, 1232222002, 1918963668, -413877214, 1262435748, -490948743, 1408161504, -233871369, 1936684741, -865381569, -215528641, 970074732, 1621153848, -59102633, -179431796, -720491220, 1719189073, 1498905059, -514838544, -615472888, -1274722182, -1891936203, -1721272720, -363118408, -1044558805, 1242905928, 1436161059, -1600558211, -1692503435, -1061188758, -634857415, -1663890429, 897194027, 1212571456, -673313552, -1225956934, 479241108, -1931596749, 1293948144, -482554295, -869657421, -1514249432, 477405933, 2145290478, -757286371, 277994965, -1261504661, 139991951, 1887011790, -456366895, 1406093317, -886402325, 252494506, 689950503, 1356598053, -1004137644, -1192753277, 670062665, 1083906569, -1329649859, 1488888513, -969685318, 459043016, 1161313952, -1129497754, 1324467055, -1099019764, -203704355, -1069029839, 1278937085, 1073181115, 226875896, -264842983, 1980864560, -656047475, 1323231642, -601401053, -1946802418, -253790903, 119956763, -44364644, -1995613000, 1610683387, -1699262499, -2103180928, -63167324, -1300352141, -1009321940, -1044929750, -1800105049, -1979944148, 14222471, -1432640628, 1688235742, 424114623, 30308972, 1462966850, -359476729, 1488377264, -527220589, 1186931100, 1101973752, -1472579895, 1914931104, 283107098, -1931279151, -1718200491, 1792738082, 1667244170, -114658266, -1224265059, 351047092, -1605815820, 1516659109, 1462102522, 681751559, -807956376, -786865187, -1693372931, -673156580, 1309653081, 446052025, -186550220, -642009792, -2134745073, -449421949, -237043221, 1975064865, -1652125684, 382056507, 1942350801, 1154312036, -1127994577, -1260892858, -70777083, 594868445, -447760497, -1329308630, 1024084550, 766358247, 1827325386, 2144728345, -1298174473, 231860022, -418919919, -2085785440, 2141510387, 1462173083, -661695332, -1156528440, -1959187193, 807454502, -1248709382, 37646812, 1920730334, -661832103, -1190920655, -1881837225, -1201869824, -1208235575, -113727977, -1764793855, -1550797371, -1204731695, 186747613, -1218435074, 1957746366, 454163363, -65971481, -1304482776, 1544857664, 930738730, 1678677373, -1003320057, 1265725736, 1956891693, -417894949, 517277694, 891796487, 1228794427, -176209, 141634552, -439467150, 38106221, -1495901082, 2127996072, -1503461118, 1809040108, 1627496104, -333002288, 2137185931, -1073007113, 1720941082, -1271215886, -1127754397, -1851449345, -1880413021, 353079556, 1459902589, -1921484492, -1510958623, 751470763, -1833747000, -721794635, 2049922754, -291520455, -267044280, 1179388024, 155806298, 1307439864, -709701511, -1081407653, 428855877, -1835958873, -831847952, 2136018861, 1024638104, -1881292992, 936646378, -180466400, 126984382, -1639949024, -444567803, 1091572596, 492144947, -1486723177, 510355722, 33891022, 1803350302, 660921310, 638050765, 874880528, -1986177967, -993906518, 1593021621, -1452112927, -506004895, 437341923, 2119609533, -355668060, -1687323724, -1900041588, 704316977, -1283123831, -709142656, 1680380685, 1343855333, 844516429, -418250255, -656024350, 1228458056, -148191680, -1114556213, 260694258, -441056449, -536921038, -1942265700, -2125229175, -1696362218, -701065156, 560077529, 1036623286, -340511558, 553174342, -737076946, 247187933, -1843075350, -2014538342, -286725762, -830648809, 1006640706, 814528877, -1562137403, -1383810808, 936725162, -1832046635, -595664406, 235633427, 1215009721, -1330003543, 643602705, 9070321, -2122985511, -180874289, -434075224, 1320572600, 448007596, -355760708, -2139522265, 726143704, -558263286, 1711644270, 277293540, -1745861874, -238194849, -1650157982, 891602958, 202684487, -1288519012, 779269420, 716011377, -1529774751, 1115632997, -1246420280, -628585597, 605344052, 1095918929, 1991661933, 83529150, -734389870, 1180932781, -277376191, -872980168, -206171015, -2004269296, -1265516718, -496598906, -1999564102, -1393244179, -1186931866, 915367475, 1194803503, -1462110844, 1340433009, 106022459, 894231254, -494012522, 891382372, -1595168117, -718710097, -868678737, -1876520821, 1350247070, -256081870, -1126707659, 219836420, 607227376, -410259630, -298324977, 141330521, 898675034, 927792137, 1290363279, -595199101, 741850881, -584294764, -836313982, 847360395, 453335563, -1201739726, -286110583, -1890611187, 2950286, 643569779, 1497722778, 1897060465, 677554663, -982550542, -914478017, -992895552, -447444064, 1548929412, -116532649, -578468620, -275364510, -230633369, 1343574242, -1094772458, 84301202, -469969878, 406646030, 2124798447, -1890016752, 758405837, 1651791103, 391191697, -1928726777, -861867533, 4741298, 1816363658, -1473740502, 1922521014, 342230988, -121510671, 1164335844, 256081002, -567311466, 561087273, 1025637901, -613306517, 737542525, 1639112109, 1541340586, -1681025335, 95351556, 1885451465, -1128416918, -1699479660, 198419038, -1666750215, 604793566, 111605059, 683781445, 58947048, 38197788, 1131261318, 964566156, 651980285, -150493665, 1238783127, -1490740101, -73516038, 2066122730, -292995522, -204470899, 349527483, 2059205508, 1492966785, -271090742, 650255319, 178177003, -848926172, -14606861, 912695250, -459254434, 117523430, -545965159, 66550492, 1282668264, -1961586127, 55097911, -360396794, -1918077941, 1377716475, 1988039182, -38646403, -1326950323, 200257735, -1258891143, 375803543, 958470486, 194595748, -1260178113, 1714164163, -1315669042, -492111163, 892128870, 1704553781, 1558430931, -479396028, -728478785, 750924349, 355414235, 478559711, -1434394503, -1008211010, -1717713405, 189750720, -1264975434, 896427939, 978847597, -362686550, -1228966901, 677635207, -1512285449, -1461241351, 1666783574, 824410920, -1417763943, -603173782, -1141448292, -490432104, 1276321843, -12875786, 703613299, -515699362, 1191568619, 1549121985, -2057741765, -1223897867, -1156575124, -1335888653, -1074885462, 435418687, -1577552900, -166211098, -1705461745, 114134930, -1397417735, 2138784264, -1634583703, -2006347946, -909630394, -1965144503, -484300210, 1856096070, -723413990, 1793185962, 1614055343, 810913952, 1662972360, 1182830722, -1471719274, -1546129270, -307483904, 1968956976, -799070156, 1050658604, -1144697434, 89460728, -941428410, -122161052, -1350549960, 1607351415, 1932091470, 1523524394, -1823383970, 960590694, 847249804, -1149243035, -695583853, 686459825, -1343363100, -367498297, 2015530271, 16136716, 1958929914, 1503526383, 296919109, 814553155, 723033123, 580496578, -51354493, 1643839467, -617817823, 1224027864, -1236233218, 765971743, -1224816592, -1208290440, -913761583, -1770804960, -382906420, 1718065547, -429735563, 1912746017, -185128900, -1100384588, 1876289588, -300747725, -1227196825, 1835371648, 1076813716, -2006649175, -673100686, -215048223, -391801397, 123246221, 1158190854, -929001098, -817005448, 1781589109, -274468116, -1995063986, 1742686779, -1201077001, -213531050, 1284583888, -2041131732, -1496569734, -282273172, 183531725, -491997656, -447879478, -1265834145, 1583500155, -1210291916, -878092245, 1607261760, -1666100980, 1120309729, 1002218188, -1531157653, 1393530317, -2008773159, 1415749472, 972906647, -1758198483, -208300303, 1892302216, 494033915, -358341674, 840060403, -1966814599, -1287829260, -1459539048, -772357942, 59900265, -1506353715, -1319659359, -1663555389, 252836352, -656883971, 428100479, 151423145, 1418181703, 1694553898, 1858314111, -1262057723, -545181481, 788235257, 1044460438, 177740558, -1921328030, -322923173, -613090052, -512763215, -669801844, 1722324584, -463603493, 2146427480, 698414532, -1233859098, -1412257772, 120379379, 105339858, -1070572887, 2060852360, -1515083037, 2004731835, 118263430, 1141114334, -413524875, -501302207, -1490521176, 811346316, 884835676, 225107240, 1061444245, -829676748, 426127849, -941093591, 1129629822, -81832228, -1317037345, -1964677234, 275235138, 1502488877, -1554352636, 640613906, -1437798555, 196702482, 1902902971, -472103645, -1670986930, -1688408456, -278506322, -1782195120, -1393346494, -1349310538, 2042497814, 748168186, -444671224, 1338156424, -2145383314, -1514258676, 96996643, -1011442041, -1872055867, 152290864, 322225395, 570061937, -1124117913, -1033305006, -470630024, -81960967, 1464901700, 197750318, -164270934, 1271742859, 463512555, 776858483, 811851213, 1313823641, 1068864647, 905285845, -1067114775, 680811370, -656530561, -1325429453, 2080653677, -1595711403, -567009045, 322923102, 1502953872, 903482515, 1864192536, -757924707, -952190312, -1661511502, -1510483862, -330091202, -652277362, 468740797, -1760350751, -1897316850, -1667560635, 843087663, -2036900525, 1706138183, 1692755666, 409461481, 612918398, -981637914, -478080458, 672151357, 1620269160, -2003279943, 1425552948, -996267201, 71811080, 1689541523, -298179555, -1991497825, 2063037353, 354490008, 1304739678, -684427893, 1314608828, -2074732138, -1318288178, 446712634, -535533431, 1868742830, 1307429836, -1110701257, -752103582, -594250510, -1075350152, -124476854, -1044009920, 684010993, 767483345, -421437497, 2128934646, 1554106672, -1210282217, 1317462638, 1119098170, -489689085, 1242501075, 1474438679, 802577422, -1562705469, -1044966662, 348889038, -1638823850, -1457837203, 1441466964, 1208555157, -711054124, -1231243915, -1150925993, -1220754411, 1307470481, 622936937, -30094442, 1289118, -388114648, 754635617, 856727668, -291283758, 831410314, -1808557882, 87182148, 600411597, 1059398288, -1007267185, -615660547, -1669061323, 1476538285, 2048353399, 468484099, 1420871458, -101588779, -649442911, -97163154, -1613496541, -140285139, -1884559249, -1112984573, -1686654756, 1025522180, 184813412, 2141097723, -1257367414, 553224438, 25301844, -2142562813, 1755485472, 1839193418, -173533633, 371190304, 2018089405, -959463330, -18054443, 102729411, 1838998089, -1269614741, -824599975, -575373865, 1498056256, -678046591, 1553189018, -2018672366, -1793538382, 1462846791, -776054819, -1289769222, -525822720, 2109700966, -1358503882, 1667924983, 1269108284, 1175706598, 1626798475, 2129561451, -887248608, 1513759056, -1931683412, 1952942399, -1889093829, 1913030140, 1106814650, 315507327, -1184354610, -845267304, 86200420, -587958390, 970371571, -495246149, 1087212814, -929663949, -1988622590, -1087217094, -1294581982, -2002943521, -1511705422, -33438, 306070164, -794474068, -607379400, 995075290, -1947574462, 291138661, -1862026425, -284994431, 1981331325, -295095652, -1640664050, -502391647, -298147006, -759845877, -57850817, 62687211, -867523503, -2045788990, -1888838589, -429975345, -1618629335, -61416479, -1120648789, 258517897, -1270073923, 660994092, -1429166385, -840504072, -1435140398, -1341126539, -395745828, -811500847, -1160710657, 940755305, 270032119, -493228936, 796034185, -596653897, -1821200654, 1355130577, 1063640085, -462968182, 2128283302, -1913776328, 359717262, -1152333962, -998979542, 1975954391, -557806346, -463622556, 1216253080, -635822680, 718622920, 2013281180, -2004887289, 1829369658, 666403036, -349103516, 1527813962, -1135439226, -1161633003, -443906754, -1923472597, 1815774854, 1568116969, 2136400151, -827712414, 119489899, -2091704143, 1578039823, -204310972, 1639073175, 1973581756, -1405492023, 464695482, -574900055, 986315757, 1743760258, -132155111, 950211624, -570553748, -1038810430, 778193004, -1468229997, 234884206, -372299627, -751441573, 1425166080, 317414273, 1358862764, 1949216581, 1862852961, 1400729205, 416699274, -2023791725, -556950324, -1276507218, 1367038669, 810158340, -1253834255, 1547203648, 1712426469, -2040438668, -942745551, 1914533793, -1937965113, 1800509634, 2029585463, 1384292693, 1181618494, -413404740, 1561115879, 297314112, 229917094, -1978493305, 1214251529, -837122023, -833015636, 1954960522, 1006169068, -1531846893, 333842166, -1012672929, -469850904, 637048029, -395312868, -1380943487, -1892576823, 442180993, -1646482639, 1446446226, -1682016398, -1007453652, 888411462, 331116203, -629682089, -1718482518, 265043760, -1019221259, 1869846781, 936747089, -1517311213, 372562696, 906859232, -1425676017, 48975252, -1341854859, -2089180612, -1068076055, 1874892782, 1652169965, 1157943384, -773225543, -323996276, -818862632, 156005302, 2000519514, 1427820008, -1021442831, 1804302941, -1609750249, 1228352825, -1290885767, -1899483953, -1272003119, -1035472828, 2001303805, 1279880126, -1972758673, -860699977, -895677, 1553908866, -256889456, -54349105, 1935563167, 1959654550, 1342306927, -463860350, 2018212448, -1976136873, -1321789709, 519290351, -878196271, 1416391706, 1997808027, -741508841, -647346054, 646400542, -1106467688, 1468263050, -1425279304, 1170563435, -1841378329, 1184969864, 1914824652, -1325456412, 988552147, 884565065, 415800418, -453574918, 275834609, 48207744, 2135467314, 702477650, 102965566, -763968440, 471224482, -1279720951, 739300156, 2136013176, -2115946465, 823955913, -1847689566, -859494013, -1717723340, 421442946, -775469653, -1602093703, 628061442, -1156466954, 2146056167, 1163863080, 613966968, -268941904, 1130830948, -1580207712, -1766534996, 385727357, 320405604, -2144049214, 1276259991, 1344448621, 489194245, -1847841712, 756151600, -151969326, 164358178, 697709449, -370308967, 2093670590, -665704333, -134953266, 759941983, 672239619, 279015781, 1395133283, -842458038, -1524105337, 182288246, 1431853343, 78700095, 1433355670, -24593159, 527405240, 1406613517, -764183089, 686495640, 2053356436, 1543473442, 1665227150, -16894973, 1892440712, 1791400383, -1510847956, -1214782850, 916872379, -1086841580, -1084208313, 416347580, -268161060, -594948841, -1010051534, -54545220, 22879806, 22079373, 260808346, 1499853288, 752706288, -1446555783, -1508906906, -142572826, 2085624580, -1694570799, 1322533584, -1634778380, 1720243426, -446724573, -966715585, -1060769188, -303942680, 101162157, -478783329, -2024114681, -254341969, 979137120, -303649029, 808347593, 321882488, 1493080090, 1691499643, -418789643, -1064499066, -1102944414, 879990377, 1588432383, 1150856295, -1680509849, 1970957530, -797026769, -73327919, 748785685, 1215011973, 585217952, -886677309, 1766904120, 365332543, -1482001054, -326119897, -1445345695, 1456094038, 1027199429, 1010128020, -1080582474, 2023702212, 1350470435, 390289859, -165678955, 1391872715, -2036012256, 583114991, -1027988504, -872534637, -980212881, -1929975011, -327092927, 734121734, 1585555479, 550659297, 1974120794, -923753061, 2043915994, 1159226886, -1806512234, -1828935780, -1530965616, 873171067, -1789687415, -1872307293, -417901750, 1741334968, -360712375, -1022301158, 1865882568, 1200151331, 2145666141, -2027655890, 687151700, 1410594918, 974900322, -1519354448, -156678080, -226110093, -1047772447, -1719525872]
+cc e62da794bbaf569bec601c6ce85d8ca80d85b726d10347a487524807c76e9e9a # shrinks to ref input = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+cc 6bb8dfa5f2a1b8c2e7cbd18e81b31724ea1e121e84061ee6fa6a8ad7ed62fbe2 # shrinks to ref input = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+cc a2ce9c3a2234cbda6bcf2e0d84a3c3e607d730def32a5dfff59b9c680a18b5af # shrinks to ref mut input_src = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+cc bc29377410935c0e4cd1d3a56cb6e5ccc8bb23ca1fc7e11dae15e57066482739 # shrinks to ref input = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
diff --git a/vendor/im-rc/src/arbitrary.rs b/vendor/im-rc/src/arbitrary.rs
new file mode 100644
index 0000000..777a3b3
--- /dev/null
+++ b/vendor/im-rc/src/arbitrary.rs
@@ -0,0 +1,98 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use std::hash::{BuildHasher, Hash};
+
+use ::arbitrary::{size_hint, Arbitrary, Result, Unstructured};
+
+use crate::{HashMap, HashSet, OrdMap, OrdSet, Vector};
+
+impl<'a, A: Arbitrary<'a> + Clone> Arbitrary<'a> for Vector<A> {
+ fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_iter()?.collect()
+ }
+
+ fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_take_rest_iter()?.collect()
+ }
+
+ fn size_hint(depth: usize) -> (usize, Option<usize>) {
+ size_hint::recursion_guard(depth, |depth| {
+ size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
+ })
+ }
+}
+
+impl<'a, K: Arbitrary<'a> + Ord + Clone, V: Arbitrary<'a> + Clone> Arbitrary<'a> for OrdMap<K, V> {
+ fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_iter()?.collect()
+ }
+
+ fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_take_rest_iter()?.collect()
+ }
+
+ fn size_hint(depth: usize) -> (usize, Option<usize>) {
+ size_hint::recursion_guard(depth, |depth| {
+ size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
+ })
+ }
+}
+
+impl<'a, A: Arbitrary<'a> + Ord + Clone> Arbitrary<'a> for OrdSet<A> {
+ fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_iter()?.collect()
+ }
+
+ fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_take_rest_iter()?.collect()
+ }
+
+ fn size_hint(depth: usize) -> (usize, Option<usize>) {
+ size_hint::recursion_guard(depth, |depth| {
+ size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
+ })
+ }
+}
+
+impl<'a, K, V, S> Arbitrary<'a> for HashMap<K, V, S>
+where
+ K: Arbitrary<'a> + Hash + Eq + Clone,
+ V: Arbitrary<'a> + Clone,
+ S: BuildHasher + Default + 'static,
+{
+ fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_iter()?.collect()
+ }
+
+ fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_take_rest_iter()?.collect()
+ }
+
+ fn size_hint(depth: usize) -> (usize, Option<usize>) {
+ size_hint::recursion_guard(depth, |depth| {
+ size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
+ })
+ }
+}
+
+impl<'a, A, S> Arbitrary<'a> for HashSet<A, S>
+where
+ A: Arbitrary<'a> + Hash + Eq + Clone,
+ S: BuildHasher + Default + 'static,
+{
+ fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_iter()?.collect()
+ }
+
+ fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
+ u.arbitrary_take_rest_iter()?.collect()
+ }
+
+ fn size_hint(depth: usize) -> (usize, Option<usize>) {
+ size_hint::recursion_guard(depth, |depth| {
+ size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
+ })
+ }
+}
diff --git a/vendor/im-rc/src/config.rs b/vendor/im-rc/src/config.rs
new file mode 100644
index 0000000..f861139
--- /dev/null
+++ b/vendor/im-rc/src/config.rs
@@ -0,0 +1,20 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use typenum::*;
+
+/// The branching factor of RRB-trees
+pub(crate) type VectorChunkSize = U64;
+
+/// The branching factor of B-trees
+pub(crate) type OrdChunkSize = U64; // Must be an even number!
+
+/// The level size of HAMTs, in bits
+/// Branching factor is 2 ^ HashLevelSize.
+pub(crate) type HashLevelSize = U5;
+
+/// The size of per-instance memory pools if the `pool` feature is enabled.
+/// This is set to 0, meaning you have to opt in to using a pool by constructing
+/// with eg. `Vector::with_pool(pool)` even if the `pool` feature is enabled.
+pub(crate) const POOL_SIZE: usize = 0;
diff --git a/vendor/im-rc/src/fakepool.rs b/vendor/im-rc/src/fakepool.rs
new file mode 100644
index 0000000..5ff36f7
--- /dev/null
+++ b/vendor/im-rc/src/fakepool.rs
@@ -0,0 +1,208 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#![allow(dead_code)]
+
+use std::marker::PhantomData;
+use std::ops::Deref;
+use std::rc::Rc as RRc;
+use std::sync::Arc as RArc;
+
+use crate::nodes::chunk::Chunk;
+
+pub(crate) trait PoolDefault: Default {}
+pub(crate) trait PoolClone: Clone {}
+
+impl<A> PoolDefault for Chunk<A> {}
+impl<A> PoolClone for Chunk<A> where A: Clone {}
+
+pub(crate) struct Pool<A>(PhantomData<A>);
+
+impl<A> Pool<A> {
+ pub(crate) fn new(_size: usize) -> Self {
+ Pool(PhantomData)
+ }
+
+ pub(crate) fn get_pool_size(&self) -> usize {
+ 0
+ }
+
+ pub(crate) fn fill(&self) {}
+}
+
+impl<A> Clone for Pool<A> {
+ fn clone(&self) -> Self {
+ Self::new(0)
+ }
+}
+
+// Rc
+
+#[derive(Default)]
+pub(crate) struct Rc<A>(RRc<A>);
+
+impl<A> Rc<A> {
+ #[inline(always)]
+ pub(crate) fn default(_pool: &Pool<A>) -> Self
+ where
+ A: PoolDefault,
+ {
+ Self(Default::default())
+ }
+
+ #[inline(always)]
+ pub(crate) fn new(_pool: &Pool<A>, value: A) -> Self {
+ Rc(RRc::new(value))
+ }
+
+ #[inline(always)]
+ pub(crate) fn clone_from(_pool: &Pool<A>, value: &A) -> Self
+ where
+ A: PoolClone,
+ {
+ Rc(RRc::new(value.clone()))
+ }
+
+ #[inline(always)]
+ pub(crate) fn make_mut<'a>(_pool: &Pool<A>, this: &'a mut Self) -> &'a mut A
+ where
+ A: PoolClone,
+ {
+ RRc::make_mut(&mut this.0)
+ }
+
+ #[inline(always)]
+ pub(crate) fn ptr_eq(left: &Self, right: &Self) -> bool {
+ RRc::ptr_eq(&left.0, &right.0)
+ }
+
+ pub(crate) fn unwrap_or_clone(this: Self) -> A
+ where
+ A: PoolClone,
+ {
+ RRc::try_unwrap(this.0).unwrap_or_else(|r| (*r).clone())
+ }
+}
+
+impl<A> Clone for Rc<A> {
+ #[inline(always)]
+ fn clone(&self) -> Self {
+ Rc(self.0.clone())
+ }
+}
+
+impl<A> Deref for Rc<A> {
+ type Target = A;
+ #[inline(always)]
+ fn deref(&self) -> &Self::Target {
+ self.0.deref()
+ }
+}
+
+impl<A> PartialEq for Rc<A>
+where
+ A: PartialEq,
+{
+ #[inline(always)]
+ fn eq(&self, other: &Self) -> bool {
+ **self == **other
+ }
+}
+
+impl<A> Eq for Rc<A> where A: Eq {}
+
+impl<A> std::fmt::Debug for Rc<A>
+where
+ A: std::fmt::Debug,
+{
+ #[inline(always)]
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
+ self.0.fmt(f)
+ }
+}
+
+// Arc
+
+#[derive(Default)]
+pub(crate) struct Arc<A>(RArc<A>);
+
+impl<A> Arc<A> {
+ #[inline(always)]
+ pub(crate) fn default(_pool: &Pool<A>) -> Self
+ where
+ A: PoolDefault,
+ {
+ Self(Default::default())
+ }
+
+ #[inline(always)]
+ pub(crate) fn new(_pool: &Pool<A>, value: A) -> Self {
+ Self(RArc::new(value))
+ }
+
+ #[inline(always)]
+ pub(crate) fn clone_from(_pool: &Pool<A>, value: &A) -> Self
+ where
+ A: PoolClone,
+ {
+ Self(RArc::new(value.clone()))
+ }
+
+ #[inline(always)]
+ pub(crate) fn make_mut<'a>(_pool: &Pool<A>, this: &'a mut Self) -> &'a mut A
+ where
+ A: PoolClone,
+ {
+ RArc::make_mut(&mut this.0)
+ }
+
+ #[inline(always)]
+ pub(crate) fn ptr_eq(left: &Self, right: &Self) -> bool {
+ RArc::ptr_eq(&left.0, &right.0)
+ }
+
+ pub(crate) fn unwrap_or_clone(this: Self) -> A
+ where
+ A: PoolClone,
+ {
+ RArc::try_unwrap(this.0).unwrap_or_else(|r| (*r).clone())
+ }
+}
+
+impl<A> Clone for Arc<A> {
+ #[inline(always)]
+ fn clone(&self) -> Self {
+ Self(self.0.clone())
+ }
+}
+
+impl<A> Deref for Arc<A> {
+ type Target = A;
+ #[inline(always)]
+ fn deref(&self) -> &Self::Target {
+ self.0.deref()
+ }
+}
+
+impl<A> PartialEq for Arc<A>
+where
+ A: PartialEq,
+{
+ #[inline(always)]
+ fn eq(&self, other: &Self) -> bool {
+ **self == **other
+ }
+}
+
+impl<A> Eq for Arc<A> where A: Eq {}
+
+impl<A> std::fmt::Debug for Arc<A>
+where
+ A: std::fmt::Debug,
+{
+ #[inline(always)]
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
+ self.0.fmt(f)
+ }
+}
diff --git a/vendor/im-rc/src/hash/map.rs b/vendor/im-rc/src/hash/map.rs
new file mode 100644
index 0000000..2c2761b
--- /dev/null
+++ b/vendor/im-rc/src/hash/map.rs
@@ -0,0 +1,2379 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+//! An unordered map.
+//!
+//! An immutable hash map using [hash array mapped tries][1].
+//!
+//! Most operations on this map are O(log<sub>x</sub> n) for a
+//! suitably high *x* that it should be nearly O(1) for most maps.
+//! Because of this, it's a great choice for a generic map as long as
+//! you don't mind that keys will need to implement
+//! [`Hash`][std::hash::Hash] and [`Eq`][std::cmp::Eq].
+//!
+//! Map entries will have a predictable order based on the hasher
+//! being used. Unless otherwise specified, this will be the standard
+//! [`RandomState`][std::collections::hash_map::RandomState] hasher.
+//!
+//! [1]: https://en.wikipedia.org/wiki/Hash_array_mapped_trie
+//! [std::cmp::Eq]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
+//! [std::hash::Hash]: https://doc.rust-lang.org/std/hash/trait.Hash.html
+//! [std::collections::hash_map::RandomState]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
+
+use std::borrow::Borrow;
+use std::cmp::Ordering;
+use std::collections;
+use std::collections::hash_map::RandomState;
+use std::fmt::{Debug, Error, Formatter};
+use std::hash::{BuildHasher, Hash, Hasher};
+use std::iter::{FromIterator, FusedIterator, Sum};
+use std::mem;
+use std::ops::{Add, Index, IndexMut};
+
+use crate::nodes::hamt::{
+ hash_key, Drain as NodeDrain, HashBits, HashValue, Iter as NodeIter, IterMut as NodeIterMut,
+ Node,
+};
+use crate::util::{Pool, PoolRef, Ref};
+
+/// Construct a hash map from a sequence of key/value pairs.
+///
+/// # Examples
+///
+/// ```
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::hashmap::HashMap;
+/// # fn main() {
+/// assert_eq!(
+/// hashmap!{
+/// 1 => 11,
+/// 2 => 22,
+/// 3 => 33
+/// },
+/// HashMap::from(vec![(1, 11), (2, 22), (3, 33)])
+/// );
+/// # }
+/// ```
+#[macro_export]
+macro_rules! hashmap {
+ () => { $crate::hashmap::HashMap::new() };
+
+ ( $( $key:expr => $value:expr ),* ) => {{
+ let mut map = $crate::hashmap::HashMap::new();
+ $({
+ map.insert($key, $value);
+ })*;
+ map
+ }};
+
+ ( $( $key:expr => $value:expr ,)* ) => {{
+ let mut map = $crate::hashmap::HashMap::new();
+ $({
+ map.insert($key, $value);
+ })*;
+ map
+ }};
+}
+
+def_pool!(HashMapPool<K,V>, Node<(K,V)>);
+
+/// An unordered map.
+///
+/// An immutable hash map using [hash array mapped tries] [1].
+///
+/// Most operations on this map are O(log<sub>x</sub> n) for a
+/// suitably high *x* that it should be nearly O(1) for most maps.
+/// Because of this, it's a great choice for a generic map as long as
+/// you don't mind that keys will need to implement
+/// [`Hash`][std::hash::Hash] and [`Eq`][std::cmp::Eq].
+///
+/// Map entries will have a predictable order based on the hasher
+/// being used. Unless otherwise specified, this will be the standard
+/// [`RandomState`][std::collections::hash_map::RandomState] hasher.
+///
+/// [1]: https://en.wikipedia.org/wiki/Hash_array_mapped_trie
+/// [std::cmp::Eq]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
+/// [std::hash::Hash]: https://doc.rust-lang.org/std/hash/trait.Hash.html
+/// [std::collections::hash_map::RandomState]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
+
+pub struct HashMap<K, V, S = RandomState> {
+ size: usize,
+ pool: HashMapPool<K, V>,
+ root: PoolRef<Node<(K, V)>>,
+ hasher: Ref<S>,
+}
+
+impl<K, V> HashValue for (K, V)
+where
+ K: Eq,
+{
+ type Key = K;
+
+ fn extract_key(&self) -> &Self::Key {
+ &self.0
+ }
+
+ fn ptr_eq(&self, _other: &Self) -> bool {
+ false
+ }
+}
+
+impl<K, V> HashMap<K, V, RandomState> {
+ /// Construct an empty hash map.
+ #[inline]
+ #[must_use]
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ /// Construct an empty hash map using a specific memory pool.
+ #[cfg(feature = "pool")]
+ #[must_use]
+ pub fn with_pool(pool: &HashMapPool<K, V>) -> Self {
+ let root = PoolRef::default(&pool.0);
+ Self {
+ size: 0,
+ hasher: Default::default(),
+ pool: pool.clone(),
+ root,
+ }
+ }
+}
+
+impl<K, V> HashMap<K, V, RandomState>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+{
+ /// Construct a hash map with a single mapping.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map = HashMap::unit(123, "onetwothree");
+ /// assert_eq!(
+ /// map.get(&123),
+ /// Some(&"onetwothree")
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn unit(k: K, v: V) -> HashMap<K, V> {
+ HashMap::new().update(k, v)
+ }
+}
+
+impl<K, V, S> HashMap<K, V, S> {
+ /// Test whether a hash map is empty.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// assert!(
+ /// !hashmap!{1 => 2}.is_empty()
+ /// );
+ /// assert!(
+ /// HashMap::<i32, i32>::new().is_empty()
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ /// Get the size of a hash map.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// assert_eq!(3, hashmap!{
+ /// 1 => 11,
+ /// 2 => 22,
+ /// 3 => 33
+ /// }.len());
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn len(&self) -> usize {
+ self.size
+ }
+
+ /// Test whether two maps refer to the same content in memory.
+ ///
+ /// This is true if the two sides are references to the same map,
+ /// or if the two maps refer to the same root node.
+ ///
+ /// This would return true if you're comparing a map to itself, or
+ /// if you're comparing a map to a fresh clone of itself.
+ ///
+ /// Time: O(1)
+ pub fn ptr_eq(&self, other: &Self) -> bool {
+ std::ptr::eq(self, other) || PoolRef::ptr_eq(&self.root, &other.root)
+ }
+
+ /// Get a reference to the memory pool used by this map.
+ ///
+ /// Note that if you didn't specifically construct it with a pool, you'll
+ /// get back a reference to a pool of size 0.
+ #[cfg(feature = "pool")]
+ pub fn pool(&self) -> &HashMapPool<K, V> {
+ &self.pool
+ }
+
+ /// Construct an empty hash map using the provided hasher.
+ #[inline]
+ #[must_use]
+ pub fn with_hasher<RS>(hasher: RS) -> Self
+ where
+ Ref<S>: From<RS>,
+ {
+ let pool = HashMapPool::default();
+ let root = PoolRef::default(&pool.0);
+ HashMap {
+ size: 0,
+ hasher: hasher.into(),
+ pool,
+ root,
+ }
+ }
+
+ /// Construct an empty hash map using a specific memory pool and hasher.
+ #[cfg(feature = "pool")]
+ #[must_use]
+ pub fn with_pool_hasher<RS>(pool: &HashMapPool<K, V>, hasher: RS) -> Self
+ where
+ Ref<S>: From<RS>,
+ {
+ let root = PoolRef::default(&pool.0);
+ Self {
+ size: 0,
+ hasher: hasher.into(),
+ pool: pool.clone(),
+ root,
+ }
+ }
+
+ /// Get a reference to the map's [`BuildHasher`][BuildHasher].
+ ///
+ /// [BuildHasher]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html
+ #[must_use]
+ pub fn hasher(&self) -> &Ref<S> {
+ &self.hasher
+ }
+
+ /// Construct an empty hash map using the same hasher as the
+ /// current hash map.
+ #[inline]
+ #[must_use]
+ pub fn new_from<K1, V1>(&self) -> HashMap<K1, V1, S>
+ where
+ K1: Hash + Eq + Clone,
+ V1: Clone,
+ {
+ let pool = HashMapPool::default();
+ let root = PoolRef::default(&pool.0);
+ HashMap {
+ size: 0,
+ pool,
+ root,
+ hasher: self.hasher.clone(),
+ }
+ }
+
+ /// Get an iterator over the key/value pairs of a hash map.
+ ///
+ /// Please note that the order is consistent between maps using
+ /// the same hasher, but no other ordering guarantee is offered.
+ /// Items will not come out in insertion order or sort order.
+ /// They will, however, come out in the same order every time for
+ /// the same map.
+ #[inline]
+ #[must_use]
+ pub fn iter(&self) -> Iter<'_, K, V> {
+ Iter {
+ it: NodeIter::new(&self.root, self.size),
+ }
+ }
+
+ /// Get an iterator over a hash map's keys.
+ ///
+ /// Please note that the order is consistent between maps using
+ /// the same hasher, but no other ordering guarantee is offered.
+ /// Items will not come out in insertion order or sort order.
+ /// They will, however, come out in the same order every time for
+ /// the same map.
+ #[inline]
+ #[must_use]
+ pub fn keys(&self) -> Keys<'_, K, V> {
+ Keys {
+ it: NodeIter::new(&self.root, self.size),
+ }
+ }
+
+ /// Get an iterator over a hash map's values.
+ ///
+ /// Please note that the order is consistent between maps using
+ /// the same hasher, but no other ordering guarantee is offered.
+ /// Items will not come out in insertion order or sort order.
+ /// They will, however, come out in the same order every time for
+ /// the same map.
+ #[inline]
+ #[must_use]
+ pub fn values(&self) -> Values<'_, K, V> {
+ Values {
+ it: NodeIter::new(&self.root, self.size),
+ }
+ }
+
+ /// Discard all elements from the map.
+ ///
+ /// This leaves you with an empty map, and all elements that
+ /// were previously inside it are dropped.
+ ///
+ /// Time: O(n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::HashMap;
+ /// let mut map = hashmap![1=>1, 2=>2, 3=>3];
+ /// map.clear();
+ /// assert!(map.is_empty());
+ /// ```
+ pub fn clear(&mut self) {
+ if !self.is_empty() {
+ self.root = PoolRef::default(&self.pool.0);
+ self.size = 0;
+ }
+ }
+}
+
+impl<K, V, S> HashMap<K, V, S>
+where
+ K: Hash + Eq,
+ S: BuildHasher,
+{
+ fn test_eq(&self, other: &Self) -> bool
+ where
+ K: Hash + Eq,
+ V: PartialEq,
+ {
+ if self.len() != other.len() {
+ return false;
+ }
+ let mut seen = collections::HashSet::new();
+ for (key, value) in self.iter() {
+ if Some(value) != other.get(key) {
+ return false;
+ }
+ seen.insert(key);
+ }
+ for key in other.keys() {
+ if !seen.contains(&key) {
+ return false;
+ }
+ }
+ true
+ }
+
+ /// Get the value for a key from a hash map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map = hashmap!{123 => "lol"};
+ /// assert_eq!(
+ /// map.get(&123),
+ /// Some(&"lol")
+ /// );
+ /// ```
+ #[must_use]
+ pub fn get<BK>(&self, key: &BK) -> Option<&V>
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.root
+ .get(hash_key(&*self.hasher, key), 0, key)
+ .map(|&(_, ref v)| v)
+ }
+
+ /// Get the key/value pair for a key from a hash map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map = hashmap!{123 => "lol"};
+ /// assert_eq!(
+ /// map.get_key_value(&123),
+ /// Some((&123, &"lol"))
+ /// );
+ /// ```
+ #[must_use]
+ pub fn get_key_value<BK>(&self, key: &BK) -> Option<(&K, &V)>
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.root
+ .get(hash_key(&*self.hasher, key), 0, key)
+ .map(|&(ref k, ref v)| (k, v))
+ }
+
+ /// Test for the presence of a key in a hash map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map = hashmap!{123 => "lol"};
+ /// assert!(
+ /// map.contains_key(&123)
+ /// );
+ /// assert!(
+ /// !map.contains_key(&321)
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn contains_key<BK>(&self, k: &BK) -> bool
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.get(k).is_some()
+ }
+
+ /// Test whether a map is a submap of another map, meaning that
+ /// all keys in our map must also be in the other map, with the
+ /// same values.
+ ///
+ /// Use the provided function to decide whether values are equal.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn is_submap_by<B, RM, F>(&self, other: RM, mut cmp: F) -> bool
+ where
+ F: FnMut(&V, &B) -> bool,
+ RM: Borrow<HashMap<K, B, S>>,
+ {
+ self.iter()
+ .all(|(k, v)| other.borrow().get(k).map(|ov| cmp(v, ov)).unwrap_or(false))
+ }
+
+ /// Test whether a map is a proper submap of another map, meaning
+ /// that all keys in our map must also be in the other map, with
+ /// the same values. To be a proper submap, ours must also contain
+ /// fewer keys than the other map.
+ ///
+ /// Use the provided function to decide whether values are equal.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn is_proper_submap_by<B, RM, F>(&self, other: RM, cmp: F) -> bool
+ where
+ F: FnMut(&V, &B) -> bool,
+ RM: Borrow<HashMap<K, B, S>>,
+ {
+ self.len() != other.borrow().len() && self.is_submap_by(other, cmp)
+ }
+
+ /// Test whether a map is a submap of another map, meaning that
+ /// all keys in our map must also be in the other map, with the
+ /// same values.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 2 => 2};
+ /// let map2 = hashmap!{1 => 1, 2 => 2, 3 => 3};
+ /// assert!(map1.is_submap(map2));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn is_submap<RM>(&self, other: RM) -> bool
+ where
+ V: PartialEq,
+ RM: Borrow<Self>,
+ {
+ self.is_submap_by(other.borrow(), PartialEq::eq)
+ }
+
+ /// Test whether a map is a proper submap of another map, meaning
+ /// that all keys in our map must also be in the other map, with
+ /// the same values. To be a proper submap, ours must also contain
+ /// fewer keys than the other map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 2 => 2};
+ /// let map2 = hashmap!{1 => 1, 2 => 2, 3 => 3};
+ /// assert!(map1.is_proper_submap(map2));
+ ///
+ /// let map3 = hashmap!{1 => 1, 2 => 2};
+ /// let map4 = hashmap!{1 => 1, 2 => 2};
+ /// assert!(!map3.is_proper_submap(map4));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn is_proper_submap<RM>(&self, other: RM) -> bool
+ where
+ V: PartialEq,
+ RM: Borrow<Self>,
+ {
+ self.is_proper_submap_by(other.borrow(), PartialEq::eq)
+ }
+}
+
+impl<K, V, S> HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher,
+{
+ /// Get a mutable iterator over the values of a hash map.
+ ///
+ /// Please note that the order is consistent between maps using
+ /// the same hasher, but no other ordering guarantee is offered.
+ /// Items will not come out in insertion order or sort order.
+ /// They will, however, come out in the same order every time for
+ /// the same map.
+ #[inline]
+ #[must_use]
+ pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ IterMut {
+ it: NodeIterMut::new(&self.pool.0, root, self.size),
+ }
+ }
+
+ /// Get a mutable reference to the value for a key from a hash
+ /// map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let mut map = hashmap!{123 => "lol"};
+ /// if let Some(value) = map.get_mut(&123) {
+ /// *value = "omg";
+ /// }
+ /// assert_eq!(
+ /// map.get(&123),
+ /// Some(&"omg")
+ /// );
+ /// ```
+ #[must_use]
+ pub fn get_mut<BK>(&mut self, key: &BK) -> Option<&mut V>
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ match root.get_mut(&self.pool.0, hash_key(&*self.hasher, key), 0, key) {
+ None => None,
+ Some(&mut (_, ref mut value)) => Some(value),
+ }
+ }
+
+ /// Insert a key/value mapping into a map.
+ ///
+ /// If the map already has a mapping for the given key, the
+ /// previous value is overwritten.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let mut map = hashmap!{};
+ /// map.insert(123, "123");
+ /// map.insert(456, "456");
+ /// assert_eq!(
+ /// map,
+ /// hashmap!{123 => "123", 456 => "456"}
+ /// );
+ /// ```
+ #[inline]
+ pub fn insert(&mut self, k: K, v: V) -> Option<V> {
+ let hash = hash_key(&*self.hasher, &k);
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ let result = root.insert(&self.pool.0, hash, 0, (k, v));
+ if result.is_none() {
+ self.size += 1;
+ }
+ result.map(|(_, v)| v)
+ }
+
+ /// Remove a key/value pair from a map, if it exists, and return
+ /// the removed value.
+ ///
+ /// This is a copy-on-write operation, so that the parts of the
+ /// set's structure which are shared with other sets will be
+ /// safely copied before mutating.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let mut map = hashmap!{123 => "123", 456 => "456"};
+ /// assert_eq!(Some("123"), map.remove(&123));
+ /// assert_eq!(Some("456"), map.remove(&456));
+ /// assert_eq!(None, map.remove(&789));
+ /// assert!(map.is_empty());
+ /// ```
+ pub fn remove<BK>(&mut self, k: &BK) -> Option<V>
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.remove_with_key(k).map(|(_, v)| v)
+ }
+
+ /// Remove a key/value pair from a map, if it exists, and return
+ /// the removed key and value.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let mut map = hashmap!{123 => "123", 456 => "456"};
+ /// assert_eq!(Some((123, "123")), map.remove_with_key(&123));
+ /// assert_eq!(Some((456, "456")), map.remove_with_key(&456));
+ /// assert_eq!(None, map.remove_with_key(&789));
+ /// assert!(map.is_empty());
+ /// ```
+ pub fn remove_with_key<BK>(&mut self, k: &BK) -> Option<(K, V)>
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ let result = root.remove(&self.pool.0, hash_key(&*self.hasher, k), 0, k);
+ if result.is_some() {
+ self.size -= 1;
+ }
+ result
+ }
+
+ /// Get the [`Entry`][Entry] for a key in the map for in-place manipulation.
+ ///
+ /// Time: O(log n)
+ ///
+ /// [Entry]: enum.Entry.html
+ #[must_use]
+ pub fn entry(&mut self, key: K) -> Entry<'_, K, V, S> {
+ let hash = hash_key(&*self.hasher, &key);
+ if self.root.get(hash, 0, &key).is_some() {
+ Entry::Occupied(OccupiedEntry {
+ map: self,
+ hash,
+ key,
+ })
+ } else {
+ Entry::Vacant(VacantEntry {
+ map: self,
+ hash,
+ key,
+ })
+ }
+ }
+
+ /// Construct a new hash map by inserting a key/value mapping into a map.
+ ///
+ /// If the map already has a mapping for the given key, the previous value
+ /// is overwritten.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map = hashmap!{};
+ /// assert_eq!(
+ /// map.update(123, "123"),
+ /// hashmap!{123 => "123"}
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn update(&self, k: K, v: V) -> Self {
+ let mut out = self.clone();
+ out.insert(k, v);
+ out
+ }
+
+ /// Construct a new hash map by inserting a key/value mapping into
+ /// a map.
+ ///
+ /// If the map already has a mapping for the given key, we call
+ /// the provided function with the old value and the new value,
+ /// and insert the result as the new value.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn update_with<F>(&self, k: K, v: V, f: F) -> Self
+ where
+ F: FnOnce(V, V) -> V,
+ {
+ match self.extract_with_key(&k) {
+ None => self.update(k, v),
+ Some((_, v2, m)) => m.update(k, f(v2, v)),
+ }
+ }
+
+ /// Construct a new map by inserting a key/value mapping into a
+ /// map.
+ ///
+ /// If the map already has a mapping for the given key, we call
+ /// the provided function with the key, the old value and the new
+ /// value, and insert the result as the new value.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn update_with_key<F>(&self, k: K, v: V, f: F) -> Self
+ where
+ F: FnOnce(&K, V, V) -> V,
+ {
+ match self.extract_with_key(&k) {
+ None => self.update(k, v),
+ Some((_, v2, m)) => {
+ let out_v = f(&k, v2, v);
+ m.update(k, out_v)
+ }
+ }
+ }
+
+ /// Construct a new map by inserting a key/value mapping into a
+ /// map, returning the old value for the key as well as the new
+ /// map.
+ ///
+ /// If the map already has a mapping for the given key, we call
+ /// the provided function with the key, the old value and the new
+ /// value, and insert the result as the new value.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn update_lookup_with_key<F>(&self, k: K, v: V, f: F) -> (Option<V>, Self)
+ where
+ F: FnOnce(&K, &V, V) -> V,
+ {
+ match self.extract_with_key(&k) {
+ None => (None, self.update(k, v)),
+ Some((_, v2, m)) => {
+ let out_v = f(&k, &v2, v);
+ (Some(v2), m.update(k, out_v))
+ }
+ }
+ }
+
+ /// Update the value for a given key by calling a function with
+ /// the current value and overwriting it with the function's
+ /// return value.
+ ///
+ /// The function gets an [`Option<V>`][std::option::Option] and
+ /// returns the same, so that it can decide to delete a mapping
+ /// instead of updating the value, and decide what to do if the
+ /// key isn't in the map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// [std::option::Option]: https://doc.rust-lang.org/std/option/enum.Option.html
+ #[must_use]
+ pub fn alter<F>(&self, f: F, k: K) -> Self
+ where
+ F: FnOnce(Option<V>) -> Option<V>,
+ {
+ let pop = self.extract_with_key(&k);
+ match (f(pop.as_ref().map(|&(_, ref v, _)| v.clone())), pop) {
+ (None, None) => self.clone(),
+ (Some(v), None) => self.update(k, v),
+ (None, Some((_, _, m))) => m,
+ (Some(v), Some((_, _, m))) => m.update(k, v),
+ }
+ }
+
+ /// Construct a new map without the given key.
+ ///
+ /// Construct a map that's a copy of the current map, absent the
+ /// mapping for `key` if it's present.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn without<BK>(&self, k: &BK) -> Self
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ match self.extract_with_key(k) {
+ None => self.clone(),
+ Some((_, _, map)) => map,
+ }
+ }
+
+ /// Filter out values from a map which don't satisfy a predicate.
+ ///
+ /// This is slightly more efficient than filtering using an
+ /// iterator, in that it doesn't need to rehash the retained
+ /// values, but it still needs to reconstruct the entire tree
+ /// structure of the map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::HashMap;
+ /// let mut map = hashmap!{1 => 1, 2 => 2, 3 => 3};
+ /// map.retain(|k, v| *k > 1);
+ /// let expected = hashmap!{2 => 2, 3 => 3};
+ /// assert_eq!(expected, map);
+ /// ```
+ pub fn retain<F>(&mut self, mut f: F)
+ where
+ F: FnMut(&K, &V) -> bool,
+ {
+ let old_root = self.root.clone();
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ for ((key, value), hash) in NodeIter::new(&old_root, self.size) {
+ if !f(key, value) && root.remove(&self.pool.0, hash, 0, key).is_some() {
+ self.size -= 1;
+ }
+ }
+ }
+
+ /// Remove a key/value pair from a map, if it exists, and return
+ /// the removed value as well as the updated map.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn extract<BK>(&self, k: &BK) -> Option<(V, Self)>
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.extract_with_key(k).map(|(_, v, m)| (v, m))
+ }
+
+ /// Remove a key/value pair from a map, if it exists, and return
+ /// the removed key and value as well as the updated list.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn extract_with_key<BK>(&self, k: &BK) -> Option<(K, V, Self)>
+ where
+ BK: Hash + Eq + ?Sized,
+ K: Borrow<BK>,
+ {
+ let mut out = self.clone();
+ out.remove_with_key(k).map(|(k, v)| (k, v, out))
+ }
+
+ /// Construct the union of two maps, keeping the values in the
+ /// current map when keys exist in both maps.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 3 => 3};
+ /// let map2 = hashmap!{2 => 2, 3 => 4};
+ /// let expected = hashmap!{1 => 1, 2 => 2, 3 => 3};
+ /// assert_eq!(expected, map1.union(map2));
+ /// ```
+ #[must_use]
+ pub fn union(self, other: Self) -> Self {
+ let (mut to_mutate, to_consume) = if self.len() >= other.len() {
+ (self, other)
+ } else {
+ (other, self)
+ };
+ for (k, v) in to_consume {
+ to_mutate.entry(k).or_insert(v);
+ }
+ to_mutate
+ }
+
+ /// Construct the union of two maps, using a function to decide
+ /// what to do with the value when a key is in both maps.
+ ///
+ /// The function is called when a value exists in both maps, and
+ /// receives the value from the current map as its first argument,
+ /// and the value from the other map as the second. It should
+ /// return the value to be inserted in the resulting map.
+ ///
+ /// Time: O(n log n)
+ #[inline]
+ #[must_use]
+ pub fn union_with<F>(self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(V, V) -> V,
+ {
+ self.union_with_key(other, |_, v1, v2| f(v1, v2))
+ }
+
+ /// Construct the union of two maps, using a function to decide
+ /// what to do with the value when a key is in both maps.
+ ///
+ /// The function is called when a value exists in both maps, and
+ /// receives a reference to the key as its first argument, the
+ /// value from the current map as the second argument, and the
+ /// value from the other map as the third argument. It should
+ /// return the value to be inserted in the resulting map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 3 => 4};
+ /// let map2 = hashmap!{2 => 2, 3 => 5};
+ /// let expected = hashmap!{1 => 1, 2 => 2, 3 => 9};
+ /// assert_eq!(expected, map1.union_with_key(
+ /// map2,
+ /// |key, left, right| left + right
+ /// ));
+ /// ```
+ #[must_use]
+ pub fn union_with_key<F>(self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(&K, V, V) -> V,
+ {
+ if self.len() >= other.len() {
+ self.union_with_key_inner(other, f)
+ } else {
+ other.union_with_key_inner(self, |key, other_value, self_value| {
+ f(key, self_value, other_value)
+ })
+ }
+ }
+
+ fn union_with_key_inner<F>(mut self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(&K, V, V) -> V,
+ {
+ for (key, right_value) in other {
+ match self.remove(&key) {
+ None => {
+ self.insert(key, right_value);
+ }
+ Some(left_value) => {
+ let final_value = f(&key, left_value, right_value);
+ self.insert(key, final_value);
+ }
+ }
+ }
+ self
+ }
+
+ /// Construct the union of a sequence of maps, selecting the value
+ /// of the leftmost when a key appears in more than one map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 3 => 3};
+ /// let map2 = hashmap!{2 => 2};
+ /// let expected = hashmap!{1 => 1, 2 => 2, 3 => 3};
+ /// assert_eq!(expected, HashMap::unions(vec![map1, map2]));
+ /// ```
+ #[must_use]
+ pub fn unions<I>(i: I) -> Self
+ where
+ S: Default,
+ I: IntoIterator<Item = Self>,
+ {
+ i.into_iter().fold(Self::default(), Self::union)
+ }
+
+ /// Construct the union of a sequence of maps, using a function to
+ /// decide what to do with the value when a key is in more than
+ /// one map.
+ ///
+ /// The function is called when a value exists in multiple maps,
+ /// and receives the value from the current map as its first
+ /// argument, and the value from the next map as the second. It
+ /// should return the value to be inserted in the resulting map.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn unions_with<I, F>(i: I, f: F) -> Self
+ where
+ S: Default,
+ I: IntoIterator<Item = Self>,
+ F: Fn(V, V) -> V,
+ {
+ i.into_iter()
+ .fold(Self::default(), |a, b| a.union_with(b, &f))
+ }
+
+ /// Construct the union of a sequence of maps, using a function to
+ /// decide what to do with the value when a key is in more than
+ /// one map.
+ ///
+ /// The function is called when a value exists in multiple maps,
+ /// and receives a reference to the key as its first argument, the
+ /// value from the current map as the second argument, and the
+ /// value from the next map as the third argument. It should
+ /// return the value to be inserted in the resulting map.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn unions_with_key<I, F>(i: I, f: F) -> Self
+ where
+ S: Default,
+ I: IntoIterator<Item = Self>,
+ F: Fn(&K, V, V) -> V,
+ {
+ i.into_iter()
+ .fold(Self::default(), |a, b| a.union_with_key(b, &f))
+ }
+
+ /// Construct the symmetric difference between two maps by discarding keys
+ /// which occur in both maps.
+ ///
+ /// This is an alias for the
+ /// [`symmetric_difference`][symmetric_difference] method.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 3 => 4};
+ /// let map2 = hashmap!{2 => 2, 3 => 5};
+ /// let expected = hashmap!{1 => 1, 2 => 2};
+ /// assert_eq!(expected, map1.difference(map2));
+ /// ```
+ ///
+ /// [symmetric_difference]: #method.symmetric_difference
+ #[inline]
+ #[must_use]
+ pub fn difference(self, other: Self) -> Self {
+ self.symmetric_difference(other)
+ }
+
+ /// Construct the symmetric difference between two maps by discarding keys
+ /// which occur in both maps.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 3 => 4};
+ /// let map2 = hashmap!{2 => 2, 3 => 5};
+ /// let expected = hashmap!{1 => 1, 2 => 2};
+ /// assert_eq!(expected, map1.symmetric_difference(map2));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn symmetric_difference(self, other: Self) -> Self {
+ self.symmetric_difference_with_key(other, |_, _, _| None)
+ }
+
+ /// Construct the symmetric difference between two maps by using a function
+ /// to decide what to do if a key occurs in both.
+ ///
+ /// This is an alias for the
+ /// [`symmetric_difference_with`][symmetric_difference_with] method.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// [symmetric_difference_with]: #method.symmetric_difference_with
+ #[inline]
+ #[must_use]
+ pub fn difference_with<F>(self, other: Self, f: F) -> Self
+ where
+ F: FnMut(V, V) -> Option<V>,
+ {
+ self.symmetric_difference_with(other, f)
+ }
+
+ /// Construct the symmetric difference between two maps by using a function
+ /// to decide what to do if a key occurs in both.
+ ///
+ /// Time: O(n log n)
+ #[inline]
+ #[must_use]
+ pub fn symmetric_difference_with<F>(self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(V, V) -> Option<V>,
+ {
+ self.symmetric_difference_with_key(other, |_, a, b| f(a, b))
+ }
+
+ /// Construct the symmetric difference between two maps by using a function
+ /// to decide what to do if a key occurs in both. The function
+ /// receives the key as well as both values.
+ ///
+ /// This is an alias for the
+ /// [`symmetric_difference_with`_key][symmetric_difference_with_key]
+ /// method.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 3 => 4};
+ /// let map2 = hashmap!{2 => 2, 3 => 5};
+ /// let expected = hashmap!{1 => 1, 2 => 2, 3 => 9};
+ /// assert_eq!(expected, map1.difference_with_key(
+ /// map2,
+ /// |key, left, right| Some(left + right)
+ /// ));
+ /// ```
+ ///
+ /// [symmetric_difference_with_key]: #method.symmetric_difference_with_key
+ #[must_use]
+ pub fn difference_with_key<F>(self, other: Self, f: F) -> Self
+ where
+ F: FnMut(&K, V, V) -> Option<V>,
+ {
+ self.symmetric_difference_with_key(other, f)
+ }
+
+ /// Construct the symmetric difference between two maps by using a function
+ /// to decide what to do if a key occurs in both. The function
+ /// receives the key as well as both values.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 3 => 4};
+ /// let map2 = hashmap!{2 => 2, 3 => 5};
+ /// let expected = hashmap!{1 => 1, 2 => 2, 3 => 9};
+ /// assert_eq!(expected, map1.symmetric_difference_with_key(
+ /// map2,
+ /// |key, left, right| Some(left + right)
+ /// ));
+ /// ```
+ #[must_use]
+ pub fn symmetric_difference_with_key<F>(mut self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(&K, V, V) -> Option<V>,
+ {
+ let mut out = self.new_from();
+ for (key, right_value) in other {
+ match self.remove(&key) {
+ None => {
+ out.insert(key, right_value);
+ }
+ Some(left_value) => {
+ if let Some(final_value) = f(&key, left_value, right_value) {
+ out.insert(key, final_value);
+ }
+ }
+ }
+ }
+ out.union(self)
+ }
+
+ /// Construct the relative complement between two maps by discarding keys
+ /// which occur in `other`.
+ ///
+ /// Time: O(m log n) where m is the size of the other map
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 4};
+ /// let map2 = ordmap!{2 => 2, 3 => 5};
+ /// let expected = ordmap!{1 => 1};
+ /// assert_eq!(expected, map1.relative_complement(map2));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn relative_complement(mut self, other: Self) -> Self {
+ for (key, _) in other {
+ let _ = self.remove(&key);
+ }
+ self
+ }
+
+ /// Construct the intersection of two maps, keeping the values
+ /// from the current map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 2 => 2};
+ /// let map2 = hashmap!{2 => 3, 3 => 4};
+ /// let expected = hashmap!{2 => 2};
+ /// assert_eq!(expected, map1.intersection(map2));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn intersection(self, other: Self) -> Self {
+ self.intersection_with_key(other, |_, v, _| v)
+ }
+
+ /// Construct the intersection of two maps, calling a function
+ /// with both values for each key and using the result as the
+ /// value for the key.
+ ///
+ /// Time: O(n log n)
+ #[inline]
+ #[must_use]
+ pub fn intersection_with<B, C, F>(self, other: HashMap<K, B, S>, mut f: F) -> HashMap<K, C, S>
+ where
+ B: Clone,
+ C: Clone,
+ F: FnMut(V, B) -> C,
+ {
+ self.intersection_with_key(other, |_, v1, v2| f(v1, v2))
+ }
+
+ /// Construct the intersection of two maps, calling a function
+ /// with the key and both values for each key and using the result
+ /// as the value for the key.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashmap::HashMap;
+ /// let map1 = hashmap!{1 => 1, 2 => 2};
+ /// let map2 = hashmap!{2 => 3, 3 => 4};
+ /// let expected = hashmap!{2 => 5};
+ /// assert_eq!(expected, map1.intersection_with_key(
+ /// map2,
+ /// |key, left, right| left + right
+ /// ));
+ /// ```
+ #[must_use]
+ pub fn intersection_with_key<B, C, F>(
+ mut self,
+ other: HashMap<K, B, S>,
+ mut f: F,
+ ) -> HashMap<K, C, S>
+ where
+ B: Clone,
+ C: Clone,
+ F: FnMut(&K, V, B) -> C,
+ {
+ let mut out = self.new_from();
+ for (key, right_value) in other {
+ match self.remove(&key) {
+ None => (),
+ Some(left_value) => {
+ let result = f(&key, left_value, right_value);
+ out.insert(key, result);
+ }
+ }
+ }
+ out
+ }
+}
+
+// Entries
+
+/// A handle for a key and its associated value.
+///
+/// ## Performance Note
+///
+/// When using an `Entry`, the key is only ever hashed once, when you
+/// create the `Entry`. Operations on an `Entry` will never trigger a
+/// rehash, where eg. a `contains_key(key)` followed by an
+/// `insert(key, default_value)` (the equivalent of
+/// `Entry::or_insert()`) would need to hash the key once for the
+/// `contains_key` and again for the `insert`. The operations
+/// generally perform similarly otherwise.
+pub enum Entry<'a, K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher,
+{
+ /// An entry which exists in the map.
+ Occupied(OccupiedEntry<'a, K, V, S>),
+ /// An entry which doesn't exist in the map.
+ Vacant(VacantEntry<'a, K, V, S>),
+}
+
+impl<'a, K, V, S> Entry<'a, K, V, S>
+where
+ K: 'a + Hash + Eq + Clone,
+ V: 'a + Clone,
+ S: 'a + BuildHasher,
+{
+ /// Insert the default value provided if there was no value
+ /// already, and return a mutable reference to the value.
+ pub fn or_insert(self, default: V) -> &'a mut V {
+ self.or_insert_with(|| default)
+ }
+
+ /// Insert the default value from the provided function if there
+ /// was no value already, and return a mutable reference to the
+ /// value.
+ pub fn or_insert_with<F>(self, default: F) -> &'a mut V
+ where
+ F: FnOnce() -> V,
+ {
+ match self {
+ Entry::Occupied(entry) => entry.into_mut(),
+ Entry::Vacant(entry) => entry.insert(default()),
+ }
+ }
+
+ /// Insert a default value if there was no value already, and
+ /// return a mutable reference to the value.
+ pub fn or_default(self) -> &'a mut V
+ where
+ V: Default,
+ {
+ self.or_insert_with(Default::default)
+ }
+
+ /// Get the key for this entry.
+ #[must_use]
+ pub fn key(&self) -> &K {
+ match self {
+ Entry::Occupied(entry) => entry.key(),
+ Entry::Vacant(entry) => entry.key(),
+ }
+ }
+
+ /// Call the provided function to modify the value if the value
+ /// exists.
+ pub fn and_modify<F>(mut self, f: F) -> Self
+ where
+ F: FnOnce(&mut V),
+ {
+ match &mut self {
+ Entry::Occupied(ref mut entry) => f(entry.get_mut()),
+ Entry::Vacant(_) => (),
+ }
+ self
+ }
+}
+
+/// An entry for a mapping that already exists in the map.
+pub struct OccupiedEntry<'a, K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher,
+{
+ map: &'a mut HashMap<K, V, S>,
+ hash: HashBits,
+ key: K,
+}
+
+impl<'a, K, V, S> OccupiedEntry<'a, K, V, S>
+where
+ K: 'a + Hash + Eq + Clone,
+ V: 'a + Clone,
+ S: 'a + BuildHasher,
+{
+ /// Get the key for this entry.
+ #[must_use]
+ pub fn key(&self) -> &K {
+ &self.key
+ }
+
+ /// Remove this entry from the map and return the removed mapping.
+ pub fn remove_entry(self) -> (K, V) {
+ let root = PoolRef::make_mut(&self.map.pool.0, &mut self.map.root);
+ let result = root.remove(&self.map.pool.0, self.hash, 0, &self.key);
+ self.map.size -= 1;
+ result.unwrap()
+ }
+
+ /// Get the current value.
+ #[must_use]
+ pub fn get(&self) -> &V {
+ &self.map.root.get(self.hash, 0, &self.key).unwrap().1
+ }
+
+ /// Get a mutable reference to the current value.
+ #[must_use]
+ pub fn get_mut(&mut self) -> &mut V {
+ let root = PoolRef::make_mut(&self.map.pool.0, &mut self.map.root);
+ &mut root
+ .get_mut(&self.map.pool.0, self.hash, 0, &self.key)
+ .unwrap()
+ .1
+ }
+
+ /// Convert this entry into a mutable reference.
+ #[must_use]
+ pub fn into_mut(self) -> &'a mut V {
+ let root = PoolRef::make_mut(&self.map.pool.0, &mut self.map.root);
+ &mut root
+ .get_mut(&self.map.pool.0, self.hash, 0, &self.key)
+ .unwrap()
+ .1
+ }
+
+ /// Overwrite the current value.
+ pub fn insert(&mut self, value: V) -> V {
+ mem::replace(self.get_mut(), value)
+ }
+
+ /// Remove this entry from the map and return the removed value.
+ pub fn remove(self) -> V {
+ self.remove_entry().1
+ }
+}
+
+/// An entry for a mapping that does not already exist in the map.
+pub struct VacantEntry<'a, K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher,
+{
+ map: &'a mut HashMap<K, V, S>,
+ hash: HashBits,
+ key: K,
+}
+
+impl<'a, K, V, S> VacantEntry<'a, K, V, S>
+where
+ K: 'a + Hash + Eq + Clone,
+ V: 'a + Clone,
+ S: 'a + BuildHasher,
+{
+ /// Get the key for this entry.
+ #[must_use]
+ pub fn key(&self) -> &K {
+ &self.key
+ }
+
+ /// Convert this entry into its key.
+ #[must_use]
+ pub fn into_key(self) -> K {
+ self.key
+ }
+
+ /// Insert a value into this entry.
+ pub fn insert(self, value: V) -> &'a mut V {
+ let root = PoolRef::make_mut(&self.map.pool.0, &mut self.map.root);
+ if root
+ .insert(&self.map.pool.0, self.hash, 0, (self.key.clone(), value))
+ .is_none()
+ {
+ self.map.size += 1;
+ }
+ // TODO it's unfortunate that we need to look up the key again
+ // here to get the mut ref.
+ &mut root
+ .get_mut(&self.map.pool.0, self.hash, 0, &self.key)
+ .unwrap()
+ .1
+ }
+}
+
+// Core traits
+
+impl<K, V, S> Clone for HashMap<K, V, S>
+where
+ K: Clone,
+ V: Clone,
+{
+ /// Clone a map.
+ ///
+ /// Time: O(1)
+ #[inline]
+ fn clone(&self) -> Self {
+ HashMap {
+ root: self.root.clone(),
+ pool: self.pool.clone(),
+ size: self.size,
+ hasher: self.hasher.clone(),
+ }
+ }
+}
+
+#[cfg(not(has_specialisation))]
+impl<K, V, S> PartialEq for HashMap<K, V, S>
+where
+ K: Hash + Eq,
+ V: PartialEq,
+ S: BuildHasher,
+{
+ fn eq(&self, other: &Self) -> bool {
+ self.test_eq(other)
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<K, V, S> PartialEq for HashMap<K, V, S>
+where
+ K: Hash + Eq,
+ V: PartialEq,
+ S: BuildHasher,
+{
+ default fn eq(&self, other: &Self) -> bool {
+ self.test_eq(other)
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<K, V, S> PartialEq for HashMap<K, V, S>
+where
+ K: Hash + Eq,
+ V: Eq,
+ S: BuildHasher,
+{
+ fn eq(&self, other: &Self) -> bool {
+ if PoolRef::ptr_eq(&self.root, &other.root) {
+ return true;
+ }
+ self.test_eq(other)
+ }
+}
+
+impl<K, V, S> Eq for HashMap<K, V, S>
+where
+ K: Hash + Eq,
+ V: Eq,
+ S: BuildHasher,
+{
+}
+
+impl<K, V, S> PartialOrd for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone + PartialOrd,
+ V: PartialOrd + Clone,
+ S: BuildHasher,
+{
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ if Ref::ptr_eq(&self.hasher, &other.hasher) {
+ return self.iter().partial_cmp(other.iter());
+ }
+ self.iter().partial_cmp(other.iter())
+ }
+}
+
+impl<K, V, S> Ord for HashMap<K, V, S>
+where
+ K: Hash + Eq + Ord + Clone,
+ V: Ord + Clone,
+ S: BuildHasher,
+{
+ fn cmp(&self, other: &Self) -> Ordering {
+ if Ref::ptr_eq(&self.hasher, &other.hasher) {
+ return self.iter().cmp(other.iter());
+ }
+ self.iter().cmp(other.iter())
+ }
+}
+
+impl<K, V, S> Hash for HashMap<K, V, S>
+where
+ K: Hash + Eq,
+ V: Hash,
+ S: BuildHasher,
+{
+ fn hash<H>(&self, state: &mut H)
+ where
+ H: Hasher,
+ {
+ for i in self.iter() {
+ i.hash(state);
+ }
+ }
+}
+
+impl<K, V, S> Default for HashMap<K, V, S>
+where
+ S: BuildHasher + Default,
+{
+ #[inline]
+ fn default() -> Self {
+ let pool = HashMapPool::default();
+ let root = PoolRef::default(&pool.0);
+ HashMap {
+ size: 0,
+ pool,
+ root,
+ hasher: Ref::<S>::default(),
+ }
+ }
+}
+
+impl<K, V, S> Add for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher,
+{
+ type Output = HashMap<K, V, S>;
+
+ fn add(self, other: Self) -> Self::Output {
+ self.union(other)
+ }
+}
+
+impl<'a, K, V, S> Add for &'a HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher,
+{
+ type Output = HashMap<K, V, S>;
+
+ fn add(self, other: Self) -> Self::Output {
+ self.clone().union(other.clone())
+ }
+}
+
+impl<K, V, S> Sum for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn sum<I>(it: I) -> Self
+ where
+ I: Iterator<Item = Self>,
+ {
+ it.fold(Self::default(), |a, b| a + b)
+ }
+}
+
+impl<K, V, S, RK, RV> Extend<(RK, RV)> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone + From<RK>,
+ V: Clone + From<RV>,
+ S: BuildHasher,
+{
+ fn extend<I>(&mut self, iter: I)
+ where
+ I: IntoIterator<Item = (RK, RV)>,
+ {
+ for (key, value) in iter {
+ self.insert(From::from(key), From::from(value));
+ }
+ }
+}
+
+impl<'a, BK, K, V, S> Index<&'a BK> for HashMap<K, V, S>
+where
+ BK: Hash + Eq + ?Sized,
+ K: Hash + Eq + Borrow<BK>,
+ S: BuildHasher,
+{
+ type Output = V;
+
+ fn index(&self, key: &BK) -> &Self::Output {
+ match self.root.get(hash_key(&*self.hasher, key), 0, key) {
+ None => panic!("HashMap::index: invalid key"),
+ Some(&(_, ref value)) => value,
+ }
+ }
+}
+
+impl<'a, BK, K, V, S> IndexMut<&'a BK> for HashMap<K, V, S>
+where
+ BK: Hash + Eq + ?Sized,
+ K: Hash + Eq + Clone + Borrow<BK>,
+ V: Clone,
+ S: BuildHasher,
+{
+ fn index_mut(&mut self, key: &BK) -> &mut Self::Output {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ match root.get_mut(&self.pool.0, hash_key(&*self.hasher, key), 0, key) {
+ None => panic!("HashMap::index_mut: invalid key"),
+ Some(&mut (_, ref mut value)) => value,
+ }
+ }
+}
+
+#[cfg(not(has_specialisation))]
+impl<K, V, S> Debug for HashMap<K, V, S>
+where
+ K: Hash + Eq + Debug,
+ V: Debug,
+ S: BuildHasher,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ let mut d = f.debug_map();
+ for (k, v) in self {
+ d.entry(k, v);
+ }
+ d.finish()
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<K, V, S> Debug for HashMap<K, V, S>
+where
+ K: Hash + Eq + Debug,
+ V: Debug,
+ S: BuildHasher,
+{
+ default fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ let mut d = f.debug_map();
+ for (k, v) in self {
+ d.entry(k, v);
+ }
+ d.finish()
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<K, V, S> Debug for HashMap<K, V, S>
+where
+ K: Hash + Eq + Ord + Debug,
+ V: Debug,
+ S: BuildHasher,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ let mut keys = collections::BTreeSet::new();
+ keys.extend(self.keys());
+ let mut d = f.debug_map();
+ for key in keys {
+ d.entry(key, &self[key]);
+ }
+ d.finish()
+ }
+}
+
+// // Iterators
+
+/// An iterator over the elements of a map.
+pub struct Iter<'a, K, V> {
+ it: NodeIter<'a, (K, V)>,
+}
+
+impl<'a, K, V> Iterator for Iter<'a, K, V> {
+ type Item = (&'a K, &'a V);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|((k, v), _)| (k, v))
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {}
+
+impl<'a, K, V> FusedIterator for Iter<'a, K, V> {}
+
+/// A mutable iterator over the elements of a map.
+pub struct IterMut<'a, K, V>
+where
+ K: Clone,
+ V: Clone,
+{
+ it: NodeIterMut<'a, (K, V)>,
+}
+
+impl<'a, K, V> Iterator for IterMut<'a, K, V>
+where
+ K: Clone,
+ V: Clone,
+{
+ type Item = (&'a K, &'a mut V);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|((k, v), _)| (&*k, v))
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V>
+where
+ K: Clone,
+ V: Clone,
+{
+}
+
+impl<'a, K, V> FusedIterator for IterMut<'a, K, V>
+where
+ K: Clone,
+ V: Clone,
+{
+}
+
+/// A consuming iterator over the elements of a map.
+pub struct ConsumingIter<A: HashValue> {
+ it: NodeDrain<A>,
+}
+
+impl<A> Iterator for ConsumingIter<A>
+where
+ A: HashValue + Clone,
+{
+ type Item = A;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|(p, _)| p)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<A> ExactSizeIterator for ConsumingIter<A> where A: HashValue + Clone {}
+
+impl<A> FusedIterator for ConsumingIter<A> where A: HashValue + Clone {}
+
+/// An iterator over the keys of a map.
+pub struct Keys<'a, K, V> {
+ it: NodeIter<'a, (K, V)>,
+}
+
+impl<'a, K, V> Iterator for Keys<'a, K, V> {
+ type Item = &'a K;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|((k, _), _)| k)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {}
+
+impl<'a, K, V> FusedIterator for Keys<'a, K, V> {}
+
+/// An iterator over the values of a map.
+pub struct Values<'a, K, V> {
+ it: NodeIter<'a, (K, V)>,
+}
+
+impl<'a, K, V> Iterator for Values<'a, K, V> {
+ type Item = &'a V;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|((_, v), _)| v)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {}
+
+impl<'a, K, V> FusedIterator for Values<'a, K, V> {}
+
+impl<'a, K, V, S> IntoIterator for &'a HashMap<K, V, S>
+where
+ K: Hash + Eq,
+ S: BuildHasher,
+{
+ type Item = (&'a K, &'a V);
+ type IntoIter = Iter<'a, K, V>;
+
+ #[inline]
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
+impl<K, V, S> IntoIterator for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher,
+{
+ type Item = (K, V);
+ type IntoIter = ConsumingIter<(K, V)>;
+
+ #[inline]
+ fn into_iter(self) -> Self::IntoIter {
+ ConsumingIter {
+ it: NodeDrain::new(&self.pool.0, self.root, self.size),
+ }
+ }
+}
+
+// Conversions
+
+impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn from_iter<T>(i: T) -> Self
+ where
+ T: IntoIterator<Item = (K, V)>,
+ {
+ let mut map = Self::default();
+ for (k, v) in i {
+ map.insert(k, v);
+ }
+ map
+ }
+}
+
+impl<K, V, S> AsRef<HashMap<K, V, S>> for HashMap<K, V, S> {
+ #[inline]
+ fn as_ref(&self) -> &Self {
+ self
+ }
+}
+
+impl<'m, 'k, 'v, K, V, OK, OV, SA, SB> From<&'m HashMap<&'k K, &'v V, SA>> for HashMap<OK, OV, SB>
+where
+ K: Hash + Eq + ToOwned<Owned = OK> + ?Sized,
+ V: ToOwned<Owned = OV> + ?Sized,
+ OK: Hash + Eq + Clone + Borrow<K>,
+ OV: Borrow<V> + Clone,
+ SA: BuildHasher,
+ SB: BuildHasher + Default,
+{
+ fn from(m: &HashMap<&K, &V, SA>) -> Self {
+ m.iter()
+ .map(|(k, v)| ((*k).to_owned(), (*v).to_owned()))
+ .collect()
+ }
+}
+
+impl<'a, K, V, S> From<&'a [(K, V)]> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn from(m: &'a [(K, V)]) -> Self {
+ m.iter().cloned().collect()
+ }
+}
+
+impl<K, V, S> From<Vec<(K, V)>> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn from(m: Vec<(K, V)>) -> Self {
+ m.into_iter().collect()
+ }
+}
+
+impl<'a, K, V, S> From<&'a Vec<(K, V)>> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn from(m: &'a Vec<(K, V)>) -> Self {
+ m.iter().cloned().collect()
+ }
+}
+
+impl<K, V, S> From<collections::HashMap<K, V>> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn from(m: collections::HashMap<K, V>) -> Self {
+ m.into_iter().collect()
+ }
+}
+
+impl<'a, K, V, S> From<&'a collections::HashMap<K, V>> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn from(m: &'a collections::HashMap<K, V>) -> Self {
+ m.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
+ }
+}
+
+impl<K, V, S> From<collections::BTreeMap<K, V>> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn from(m: collections::BTreeMap<K, V>) -> Self {
+ m.into_iter().collect()
+ }
+}
+
+impl<'a, K, V, S> From<&'a collections::BTreeMap<K, V>> for HashMap<K, V, S>
+where
+ K: Hash + Eq + Clone,
+ V: Clone,
+ S: BuildHasher + Default,
+{
+ fn from(m: &'a collections::BTreeMap<K, V>) -> Self {
+ m.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
+ }
+}
+
+// impl<K: Ord + Hash + Eq, V, S> From<OrdMap<K, V>> for HashMap<K, V, S>
+// where
+// S: BuildHasher + Default,
+// {
+// fn from(m: OrdMap<K, V>) -> Self {
+// m.into_iter().collect()
+// }
+// }
+
+// impl<'a, K: Ord + Hash + Eq, V, S> From<&'a OrdMap<K, V>> for HashMap<K, V, S>
+// where
+// S: BuildHasher + Default,
+// {
+// fn from(m: &'a OrdMap<K, V>) -> Self {
+// m.into_iter().collect()
+// }
+// }
+
+// Proptest
+#[cfg(any(test, feature = "proptest"))]
+#[doc(hidden)]
+pub mod proptest {
+ #[deprecated(
+ since = "14.3.0",
+ note = "proptest strategies have moved to im::proptest"
+ )]
+ pub use crate::proptest::hash_map;
+}
+
+// Tests
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ use crate::test::LolHasher;
+ use ::proptest::num::{i16, usize};
+ use ::proptest::{collection, proptest};
+ use std::hash::BuildHasherDefault;
+
+ #[test]
+ fn safe_mutation() {
+ let v1: HashMap<usize, usize> = (0..131_072).map(|i| (i, i)).collect::<HashMap<_, _>>();
+ let mut v2 = v1.clone();
+ v2.insert(131_000, 23);
+ assert_eq!(Some(&23), v2.get(&131_000));
+ assert_eq!(Some(&131_000), v1.get(&131_000));
+ }
+
+ #[test]
+ fn index_operator() {
+ let mut map = hashmap![1 => 2, 3 => 4, 5 => 6];
+ assert_eq!(4, map[&3]);
+ map[&3] = 8;
+ assert_eq!(hashmap![1 => 2, 3 => 8, 5 => 6], map);
+ }
+
+ #[test]
+ fn proper_formatting() {
+ let map = hashmap![1 => 2];
+ assert_eq!("{1: 2}", format!("{:?}", map));
+
+ assert_eq!("{}", format!("{:?}", HashMap::<(), ()>::new()));
+ }
+
+ #[test]
+ fn remove_failing() {
+ let pairs = [(1469, 0), (-67, 0)];
+ let mut m: collections::HashMap<i16, i16, _> =
+ collections::HashMap::with_hasher(BuildHasherDefault::<LolHasher>::default());
+ for &(ref k, ref v) in &pairs {
+ m.insert(*k, *v);
+ }
+ let mut map: HashMap<i16, i16, _> =
+ HashMap::with_hasher(BuildHasherDefault::<LolHasher>::default());
+ for (k, v) in &m {
+ map = map.update(*k, *v);
+ }
+ for k in m.keys() {
+ let l = map.len();
+ assert_eq!(m.get(k).cloned(), map.get(k).cloned());
+ map = map.without(k);
+ assert_eq!(None, map.get(k));
+ assert_eq!(l - 1, map.len());
+ }
+ }
+
+ #[test]
+ fn match_string_keys_with_string_slices() {
+ let mut map: HashMap<String, i32> =
+ From::from(&hashmap! { "foo" => &1, "bar" => &2, "baz" => &3 });
+ assert_eq!(Some(&1), map.get("foo"));
+ map = map.without("foo");
+ assert_eq!(Some(3), map.remove("baz"));
+ map["bar"] = 8;
+ assert_eq!(8, map["bar"]);
+ }
+
+ #[test]
+ fn macro_allows_trailing_comma() {
+ let map1 = hashmap! {"x" => 1, "y" => 2};
+ let map2 = hashmap! {
+ "x" => 1,
+ "y" => 2,
+ };
+ assert_eq!(map1, map2);
+ }
+
+ #[test]
+ fn remove_top_level_collisions() {
+ let pairs = vec![9, 2569, 27145];
+ let mut map: HashMap<i16, i16, BuildHasherDefault<LolHasher>> = Default::default();
+ for k in pairs.clone() {
+ map.insert(k, k);
+ }
+ assert_eq!(pairs.len(), map.len());
+ let keys: Vec<_> = map.keys().cloned().collect();
+ for k in keys {
+ let l = map.len();
+ assert_eq!(Some(&k), map.get(&k));
+ map.remove(&k);
+ assert_eq!(None, map.get(&k));
+ assert_eq!(l - 1, map.len());
+ }
+ }
+
+ #[test]
+ fn entry_api() {
+ let mut map = hashmap! {"bar" => 5};
+ map.entry("foo").and_modify(|v| *v += 5).or_insert(1);
+ assert_eq!(1, map[&"foo"]);
+ map.entry("foo").and_modify(|v| *v += 5).or_insert(1);
+ assert_eq!(6, map[&"foo"]);
+ map.entry("bar").and_modify(|v| *v += 5).or_insert(1);
+ assert_eq!(10, map[&"bar"]);
+ assert_eq!(
+ 10,
+ match map.entry("bar") {
+ Entry::Occupied(entry) => entry.remove(),
+ _ => panic!(),
+ }
+ );
+ assert!(!map.contains_key(&"bar"));
+ }
+
+ #[test]
+ fn refpool_crash() {
+ let _map = HashMap::<u128, usize>::new();
+ }
+
+ #[test]
+ fn large_map() {
+ let mut map = HashMap::new();
+ let size = 32769;
+ for i in 0..size {
+ map.insert(i, i);
+ }
+ assert_eq!(size, map.len());
+ for i in 0..size {
+ assert_eq!(Some(&i), map.get(&i));
+ }
+ }
+
+ proptest! {
+ #[test]
+ fn update_and_length(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..100)) {
+ let mut map: HashMap<i16, i16, BuildHasherDefault<LolHasher>> = Default::default();
+ for (index, (k, v)) in m.iter().enumerate() {
+ map = map.update(*k, *v);
+ assert_eq!(Some(v), map.get(k));
+ assert_eq!(index + 1, map.len());
+ }
+ }
+
+ #[test]
+ fn from_iterator(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..100)) {
+ let map: HashMap<i16, i16> =
+ FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ assert_eq!(m.len(), map.len());
+ }
+
+ #[test]
+ fn iterate_over(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..100)) {
+ let map: HashMap<i16, i16> = FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ assert_eq!(m.len(), map.iter().count());
+ }
+
+ #[test]
+ fn equality(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..100)) {
+ let map1: HashMap<i16, i16> = FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ let map2: HashMap<i16, i16> = FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ assert_eq!(map1, map2);
+ }
+
+ #[test]
+ fn lookup(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..100)) {
+ let map: HashMap<i16, i16> = FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ for (k, v) in m {
+ assert_eq!(Some(*v), map.get(k).cloned());
+ }
+ }
+
+ #[test]
+ fn without(ref pairs in collection::vec((i16::ANY, i16::ANY), 0..100)) {
+ let mut m: collections::HashMap<i16, i16, _> =
+ collections::HashMap::with_hasher(BuildHasherDefault::<LolHasher>::default());
+ for &(ref k, ref v) in pairs {
+ m.insert(*k, *v);
+ }
+ let mut map: HashMap<i16, i16, _> = HashMap::with_hasher(BuildHasherDefault::<LolHasher>::default());
+ for (k, v) in &m {
+ map = map.update(*k, *v);
+ }
+ for k in m.keys() {
+ let l = map.len();
+ assert_eq!(m.get(k).cloned(), map.get(k).cloned());
+ map = map.without(k);
+ assert_eq!(None, map.get(k));
+ assert_eq!(l - 1, map.len());
+ }
+ }
+
+ #[test]
+ fn insert(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..100)) {
+ let mut mut_map: HashMap<i16, i16, BuildHasherDefault<LolHasher>> = Default::default();
+ let mut map: HashMap<i16, i16, BuildHasherDefault<LolHasher>> = Default::default();
+ for (count, (k, v)) in m.iter().enumerate() {
+ map = map.update(*k, *v);
+ mut_map.insert(*k, *v);
+ assert_eq!(count + 1, map.len());
+ assert_eq!(count + 1, mut_map.len());
+ }
+ assert_eq!(map, mut_map);
+ }
+
+ #[test]
+ fn remove(ref pairs in collection::vec((i16::ANY, i16::ANY), 0..100)) {
+ let mut m: collections::HashMap<i16, i16, _> =
+ collections::HashMap::with_hasher(BuildHasherDefault::<LolHasher>::default());
+ for &(ref k, ref v) in pairs {
+ m.insert(*k, *v);
+ }
+ let mut map: HashMap<i16, i16, _> = HashMap::with_hasher(BuildHasherDefault::<LolHasher>::default());
+ for (k, v) in &m {
+ map.insert(*k, *v);
+ }
+ for k in m.keys() {
+ let l = map.len();
+ assert_eq!(m.get(k).cloned(), map.get(k).cloned());
+ map.remove(k);
+ assert_eq!(None, map.get(k));
+ assert_eq!(l - 1, map.len());
+ }
+ }
+
+ #[test]
+ fn delete_and_reinsert(
+ ref input in collection::hash_map(i16::ANY, i16::ANY, 1..100),
+ index_rand in usize::ANY
+ ) {
+ let index = *input.keys().nth(index_rand % input.len()).unwrap();
+ let map1: HashMap<_, _> = HashMap::from_iter(input.clone());
+ let (val, map2) = map1.extract(&index).unwrap();
+ let map3 = map2.update(index, val);
+ for key in map2.keys() {
+ assert!(*key != index);
+ }
+ assert_eq!(map1.len(), map2.len() + 1);
+ assert_eq!(map1, map3);
+ }
+
+ #[test]
+ fn proptest_works(ref m in proptest::hash_map(0..9999, ".*", 10..100)) {
+ assert!(m.len() < 100);
+ assert!(m.len() >= 10);
+ }
+
+ #[test]
+ fn exact_size_iterator(ref m in proptest::hash_map(i16::ANY, i16::ANY, 0..100)) {
+ let mut should_be = m.len();
+ let mut it = m.iter();
+ loop {
+ assert_eq!(should_be, it.len());
+ match it.next() {
+ None => break,
+ Some(_) => should_be -= 1,
+ }
+ }
+ assert_eq!(0, it.len());
+ }
+ }
+}
diff --git a/vendor/im-rc/src/hash/mod.rs b/vendor/im-rc/src/hash/mod.rs
new file mode 100644
index 0000000..27a56a5
--- /dev/null
+++ b/vendor/im-rc/src/hash/mod.rs
@@ -0,0 +1,8 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#[macro_use]
+pub mod map;
+#[macro_use]
+pub mod set;
diff --git a/vendor/im-rc/src/hash/set.rs b/vendor/im-rc/src/hash/set.rs
new file mode 100644
index 0000000..edc4ad6
--- /dev/null
+++ b/vendor/im-rc/src/hash/set.rs
@@ -0,0 +1,1134 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+//! An unordered set.
+//!
+//! An immutable hash set using [hash array mapped tries] [1].
+//!
+//! Most operations on this set are O(log<sub>x</sub> n) for a
+//! suitably high *x* that it should be nearly O(1) for most sets.
+//! Because of this, it's a great choice for a generic set as long as
+//! you don't mind that values will need to implement
+//! [`Hash`][std::hash::Hash] and [`Eq`][std::cmp::Eq].
+//!
+//! Values will have a predictable order based on the hasher
+//! being used. Unless otherwise specified, this will be the standard
+//! [`RandomState`][std::collections::hash_map::RandomState] hasher.
+//!
+//! [1]: https://en.wikipedia.org/wiki/Hash_array_mapped_trie
+//! [std::cmp::Eq]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
+//! [std::hash::Hash]: https://doc.rust-lang.org/std/hash/trait.Hash.html
+//! [std::collections::hash_map::RandomState]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
+
+use std::borrow::Borrow;
+use std::cmp::Ordering;
+use std::collections::hash_map::RandomState;
+use std::collections::{self, BTreeSet};
+use std::fmt::{Debug, Error, Formatter};
+use std::hash::{BuildHasher, Hash, Hasher};
+use std::iter::FusedIterator;
+use std::iter::{FromIterator, IntoIterator, Sum};
+use std::ops::{Add, Deref, Mul};
+
+use crate::nodes::hamt::{hash_key, Drain as NodeDrain, HashValue, Iter as NodeIter, Node};
+use crate::ordset::OrdSet;
+use crate::util::{Pool, PoolRef, Ref};
+use crate::Vector;
+
+/// Construct a set from a sequence of values.
+///
+/// # Examples
+///
+/// ```
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::hashset::HashSet;
+/// # fn main() {
+/// assert_eq!(
+/// hashset![1, 2, 3],
+/// HashSet::from(vec![1, 2, 3])
+/// );
+/// # }
+/// ```
+#[macro_export]
+macro_rules! hashset {
+ () => { $crate::hashset::HashSet::new() };
+
+ ( $($x:expr),* ) => {{
+ let mut l = $crate::hashset::HashSet::new();
+ $(
+ l.insert($x);
+ )*
+ l
+ }};
+
+ ( $($x:expr ,)* ) => {{
+ let mut l = $crate::hashset::HashSet::new();
+ $(
+ l.insert($x);
+ )*
+ l
+ }};
+}
+
+def_pool!(HashSetPool<A>, Node<Value<A>>);
+
+/// An unordered set.
+///
+/// An immutable hash set using [hash array mapped tries] [1].
+///
+/// Most operations on this set are O(log<sub>x</sub> n) for a
+/// suitably high *x* that it should be nearly O(1) for most sets.
+/// Because of this, it's a great choice for a generic set as long as
+/// you don't mind that values will need to implement
+/// [`Hash`][std::hash::Hash] and [`Eq`][std::cmp::Eq].
+///
+/// Values will have a predictable order based on the hasher
+/// being used. Unless otherwise specified, this will be the standard
+/// [`RandomState`][std::collections::hash_map::RandomState] hasher.
+///
+/// [1]: https://en.wikipedia.org/wiki/Hash_array_mapped_trie
+/// [std::cmp::Eq]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
+/// [std::hash::Hash]: https://doc.rust-lang.org/std/hash/trait.Hash.html
+/// [std::collections::hash_map::RandomState]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
+pub struct HashSet<A, S = RandomState> {
+ hasher: Ref<S>,
+ pool: HashSetPool<A>,
+ root: PoolRef<Node<Value<A>>>,
+ size: usize,
+}
+
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)]
+struct Value<A>(A);
+
+impl<A> Deref for Value<A> {
+ type Target = A;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+// FIXME lacking specialisation, we can't simply implement `HashValue`
+// for `A`, we have to use the `Value<A>` indirection.
+impl<A> HashValue for Value<A>
+where
+ A: Hash + Eq,
+{
+ type Key = A;
+
+ fn extract_key(&self) -> &Self::Key {
+ &self.0
+ }
+
+ fn ptr_eq(&self, _other: &Self) -> bool {
+ false
+ }
+}
+
+impl<A> HashSet<A, RandomState> {
+ /// Construct an empty set.
+ #[must_use]
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ /// Construct an empty set using a specific memory pool.
+ #[cfg(feature = "pool")]
+ #[must_use]
+ pub fn with_pool(pool: &HashSetPool<A>) -> Self {
+ Self {
+ pool: pool.clone(),
+ hasher: Default::default(),
+ size: 0,
+ root: PoolRef::default(&pool.0),
+ }
+ }
+}
+
+impl<A> HashSet<A, RandomState>
+where
+ A: Hash + Eq + Clone,
+{
+ /// Construct a set with a single value.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashset::HashSet;
+ /// # use std::sync::Arc;
+ /// let set = HashSet::unit(123);
+ /// assert!(set.contains(&123));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn unit(a: A) -> Self {
+ HashSet::new().update(a)
+ }
+}
+
+impl<A, S> HashSet<A, S> {
+ /// Test whether a set is empty.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashset::HashSet;
+ /// assert!(
+ /// !hashset![1, 2, 3].is_empty()
+ /// );
+ /// assert!(
+ /// HashSet::<i32>::new().is_empty()
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ /// Get the size of a set.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashset::HashSet;
+ /// assert_eq!(3, hashset![1, 2, 3].len());
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn len(&self) -> usize {
+ self.size
+ }
+
+ /// Test whether two sets refer to the same content in memory.
+ ///
+ /// This is true if the two sides are references to the same set,
+ /// or if the two sets refer to the same root node.
+ ///
+ /// This would return true if you're comparing a set to itself, or
+ /// if you're comparing a set to a fresh clone of itself.
+ ///
+ /// Time: O(1)
+ pub fn ptr_eq(&self, other: &Self) -> bool {
+ std::ptr::eq(self, other) || PoolRef::ptr_eq(&self.root, &other.root)
+ }
+
+ /// Get a reference to the memory pool used by this set.
+ ///
+ /// Note that if you didn't specifically construct it with a pool, you'll
+ /// get back a reference to a pool of size 0.
+ #[cfg(feature = "pool")]
+ pub fn pool(&self) -> &HashSetPool<A> {
+ &self.pool
+ }
+
+ /// Construct an empty hash set using the provided hasher.
+ #[inline]
+ #[must_use]
+ pub fn with_hasher<RS>(hasher: RS) -> Self
+ where
+ Ref<S>: From<RS>,
+ {
+ let pool = HashSetPool::default();
+ let root = PoolRef::default(&pool.0);
+ HashSet {
+ size: 0,
+ pool,
+ root,
+ hasher: From::from(hasher),
+ }
+ }
+
+ /// Construct an empty hash set using the provided memory pool and hasher.
+ #[cfg(feature = "pool")]
+ #[inline]
+ #[must_use]
+ pub fn with_pool_hasher<RS>(pool: &HashSetPool<A>, hasher: RS) -> Self
+ where
+ Ref<S>: From<RS>,
+ {
+ let root = PoolRef::default(&pool.0);
+ HashSet {
+ size: 0,
+ pool: pool.clone(),
+ root,
+ hasher: From::from(hasher),
+ }
+ }
+
+ /// Get a reference to the set's [`BuildHasher`][BuildHasher].
+ ///
+ /// [BuildHasher]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html
+ #[must_use]
+ pub fn hasher(&self) -> &Ref<S> {
+ &self.hasher
+ }
+
+ /// Construct an empty hash set using the same hasher as the current hash set.
+ #[inline]
+ #[must_use]
+ pub fn new_from<A1>(&self) -> HashSet<A1, S>
+ where
+ A1: Hash + Eq + Clone,
+ {
+ let pool = HashSetPool::default();
+ let root = PoolRef::default(&pool.0);
+ HashSet {
+ size: 0,
+ pool,
+ root,
+ hasher: self.hasher.clone(),
+ }
+ }
+
+ /// Discard all elements from the set.
+ ///
+ /// This leaves you with an empty set, and all elements that
+ /// were previously inside it are dropped.
+ ///
+ /// Time: O(n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::HashSet;
+ /// let mut set = hashset![1, 2, 3];
+ /// set.clear();
+ /// assert!(set.is_empty());
+ /// ```
+ pub fn clear(&mut self) {
+ if !self.is_empty() {
+ self.root = PoolRef::default(&self.pool.0);
+ self.size = 0;
+ }
+ }
+
+ /// Get an iterator over the values in a hash set.
+ ///
+ /// Please note that the order is consistent between sets using
+ /// the same hasher, but no other ordering guarantee is offered.
+ /// Items will not come out in insertion order or sort order.
+ /// They will, however, come out in the same order every time for
+ /// the same set.
+ #[must_use]
+ pub fn iter(&self) -> Iter<'_, A> {
+ Iter {
+ it: NodeIter::new(&self.root, self.size),
+ }
+ }
+}
+
+impl<A, S> HashSet<A, S>
+where
+ A: Hash + Eq,
+ S: BuildHasher,
+{
+ fn test_eq(&self, other: &Self) -> bool {
+ if self.len() != other.len() {
+ return false;
+ }
+ let mut seen = collections::HashSet::new();
+ for value in self.iter() {
+ if !other.contains(value) {
+ return false;
+ }
+ seen.insert(value);
+ }
+ for value in other.iter() {
+ if !seen.contains(&value) {
+ return false;
+ }
+ }
+ true
+ }
+
+ /// Test if a value is part of a set.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn contains<BA>(&self, a: &BA) -> bool
+ where
+ BA: Hash + Eq + ?Sized,
+ A: Borrow<BA>,
+ {
+ self.root.get(hash_key(&*self.hasher, a), 0, a).is_some()
+ }
+
+ /// Test whether a set is a subset of another set, meaning that
+ /// all values in our set must also be in the other set.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn is_subset<RS>(&self, other: RS) -> bool
+ where
+ RS: Borrow<Self>,
+ {
+ let o = other.borrow();
+ self.iter().all(|a| o.contains(a))
+ }
+
+ /// Test whether a set is a proper subset of another set, meaning
+ /// that all values in our set must also be in the other set. A
+ /// proper subset must also be smaller than the other set.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn is_proper_subset<RS>(&self, other: RS) -> bool
+ where
+ RS: Borrow<Self>,
+ {
+ self.len() != other.borrow().len() && self.is_subset(other)
+ }
+}
+
+impl<A, S> HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher,
+{
+ /// Insert a value into a set.
+ ///
+ /// Time: O(log n)
+ #[inline]
+ pub fn insert(&mut self, a: A) -> Option<A> {
+ let hash = hash_key(&*self.hasher, &a);
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ match root.insert(&self.pool.0, hash, 0, Value(a)) {
+ None => {
+ self.size += 1;
+ None
+ }
+ Some(Value(old_value)) => Some(old_value),
+ }
+ }
+
+ /// Remove a value from a set if it exists.
+ ///
+ /// Time: O(log n)
+ pub fn remove<BA>(&mut self, a: &BA) -> Option<A>
+ where
+ BA: Hash + Eq + ?Sized,
+ A: Borrow<BA>,
+ {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ let result = root.remove(&self.pool.0, hash_key(&*self.hasher, a), 0, a);
+ if result.is_some() {
+ self.size -= 1;
+ }
+ result.map(|v| v.0)
+ }
+
+ /// Construct a new set from the current set with the given value
+ /// added.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashset::HashSet;
+ /// # use std::sync::Arc;
+ /// let set = hashset![123];
+ /// assert_eq!(
+ /// set.update(456),
+ /// hashset![123, 456]
+ /// );
+ /// ```
+ #[must_use]
+ pub fn update(&self, a: A) -> Self {
+ let mut out = self.clone();
+ out.insert(a);
+ out
+ }
+
+ /// Construct a new set with the given value removed if it's in
+ /// the set.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn without<BA>(&self, a: &BA) -> Self
+ where
+ BA: Hash + Eq + ?Sized,
+ A: Borrow<BA>,
+ {
+ let mut out = self.clone();
+ out.remove(a);
+ out
+ }
+
+ /// Filter out values from a set which don't satisfy a predicate.
+ ///
+ /// This is slightly more efficient than filtering using an
+ /// iterator, in that it doesn't need to rehash the retained
+ /// values, but it still needs to reconstruct the entire tree
+ /// structure of the set.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::HashSet;
+ /// let mut set = hashset![1, 2, 3];
+ /// set.retain(|v| *v > 1);
+ /// let expected = hashset![2, 3];
+ /// assert_eq!(expected, set);
+ /// ```
+ pub fn retain<F>(&mut self, mut f: F)
+ where
+ F: FnMut(&A) -> bool,
+ {
+ let old_root = self.root.clone();
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ for (value, hash) in NodeIter::new(&old_root, self.size) {
+ if !f(value) && root.remove(&self.pool.0, hash, 0, value).is_some() {
+ self.size -= 1;
+ }
+ }
+ }
+
+ /// Construct the union of two sets.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashset::HashSet;
+ /// let set1 = hashset!{1, 2};
+ /// let set2 = hashset!{2, 3};
+ /// let expected = hashset!{1, 2, 3};
+ /// assert_eq!(expected, set1.union(set2));
+ /// ```
+ #[must_use]
+ pub fn union(self, other: Self) -> Self {
+ let (mut to_mutate, to_consume) = if self.len() >= other.len() {
+ (self, other)
+ } else {
+ (other, self)
+ };
+ for value in to_consume {
+ to_mutate.insert(value);
+ }
+ to_mutate
+ }
+
+ /// Construct the union of multiple sets.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn unions<I>(i: I) -> Self
+ where
+ I: IntoIterator<Item = Self>,
+ S: Default,
+ {
+ i.into_iter().fold(Self::default(), Self::union)
+ }
+
+ /// Construct the symmetric difference between two sets.
+ ///
+ /// This is an alias for the
+ /// [`symmetric_difference`][symmetric_difference] method.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashset::HashSet;
+ /// let set1 = hashset!{1, 2};
+ /// let set2 = hashset!{2, 3};
+ /// let expected = hashset!{1, 3};
+ /// assert_eq!(expected, set1.difference(set2));
+ /// ```
+ ///
+ /// [symmetric_difference]: #method.symmetric_difference
+ #[must_use]
+ pub fn difference(self, other: Self) -> Self {
+ self.symmetric_difference(other)
+ }
+
+ /// Construct the symmetric difference between two sets.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashset::HashSet;
+ /// let set1 = hashset!{1, 2};
+ /// let set2 = hashset!{2, 3};
+ /// let expected = hashset!{1, 3};
+ /// assert_eq!(expected, set1.symmetric_difference(set2));
+ /// ```
+ #[must_use]
+ pub fn symmetric_difference(mut self, other: Self) -> Self {
+ for value in other {
+ if self.remove(&value).is_none() {
+ self.insert(value);
+ }
+ }
+ self
+ }
+
+ /// Construct the relative complement between two sets, that is the set
+ /// of values in `self` that do not occur in `other`.
+ ///
+ /// Time: O(m log n) where m is the size of the other set
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let set1 = ordset!{1, 2};
+ /// let set2 = ordset!{2, 3};
+ /// let expected = ordset!{1};
+ /// assert_eq!(expected, set1.relative_complement(set2));
+ /// ```
+ #[must_use]
+ pub fn relative_complement(mut self, other: Self) -> Self {
+ for value in other {
+ let _ = self.remove(&value);
+ }
+ self
+ }
+
+ /// Construct the intersection of two sets.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::hashset::HashSet;
+ /// let set1 = hashset!{1, 2};
+ /// let set2 = hashset!{2, 3};
+ /// let expected = hashset!{2};
+ /// assert_eq!(expected, set1.intersection(set2));
+ /// ```
+ #[must_use]
+ pub fn intersection(self, other: Self) -> Self {
+ let mut out = self.new_from();
+ for value in other {
+ if self.contains(&value) {
+ out.insert(value);
+ }
+ }
+ out
+ }
+}
+
+// Core traits
+
+impl<A, S> Clone for HashSet<A, S>
+where
+ A: Clone,
+{
+ /// Clone a set.
+ ///
+ /// Time: O(1)
+ #[inline]
+ fn clone(&self) -> Self {
+ HashSet {
+ hasher: self.hasher.clone(),
+ pool: self.pool.clone(),
+ root: self.root.clone(),
+ size: self.size,
+ }
+ }
+}
+
+impl<A, S> PartialEq for HashSet<A, S>
+where
+ A: Hash + Eq,
+ S: BuildHasher + Default,
+{
+ fn eq(&self, other: &Self) -> bool {
+ self.test_eq(other)
+ }
+}
+
+impl<A, S> Eq for HashSet<A, S>
+where
+ A: Hash + Eq,
+ S: BuildHasher + Default,
+{
+}
+
+impl<A, S> PartialOrd for HashSet<A, S>
+where
+ A: Hash + Eq + Clone + PartialOrd,
+ S: BuildHasher + Default,
+{
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ if Ref::ptr_eq(&self.hasher, &other.hasher) {
+ return self.iter().partial_cmp(other.iter());
+ }
+ self.iter().partial_cmp(other.iter())
+ }
+}
+
+impl<A, S> Ord for HashSet<A, S>
+where
+ A: Hash + Eq + Clone + Ord,
+ S: BuildHasher + Default,
+{
+ fn cmp(&self, other: &Self) -> Ordering {
+ if Ref::ptr_eq(&self.hasher, &other.hasher) {
+ return self.iter().cmp(other.iter());
+ }
+ self.iter().cmp(other.iter())
+ }
+}
+
+impl<A, S> Hash for HashSet<A, S>
+where
+ A: Hash + Eq,
+ S: BuildHasher + Default,
+{
+ fn hash<H>(&self, state: &mut H)
+ where
+ H: Hasher,
+ {
+ for i in self.iter() {
+ i.hash(state);
+ }
+ }
+}
+
+impl<A, S> Default for HashSet<A, S>
+where
+ S: BuildHasher + Default,
+{
+ fn default() -> Self {
+ let pool = HashSetPool::default();
+ let root = PoolRef::default(&pool.0);
+ HashSet {
+ hasher: Ref::<S>::default(),
+ pool,
+ root,
+ size: 0,
+ }
+ }
+}
+
+impl<A, S> Add for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher,
+{
+ type Output = HashSet<A, S>;
+
+ fn add(self, other: Self) -> Self::Output {
+ self.union(other)
+ }
+}
+
+impl<A, S> Mul for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher,
+{
+ type Output = HashSet<A, S>;
+
+ fn mul(self, other: Self) -> Self::Output {
+ self.intersection(other)
+ }
+}
+
+impl<'a, A, S> Add for &'a HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher,
+{
+ type Output = HashSet<A, S>;
+
+ fn add(self, other: Self) -> Self::Output {
+ self.clone().union(other.clone())
+ }
+}
+
+impl<'a, A, S> Mul for &'a HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher,
+{
+ type Output = HashSet<A, S>;
+
+ fn mul(self, other: Self) -> Self::Output {
+ self.clone().intersection(other.clone())
+ }
+}
+
+impl<A, S> Sum for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn sum<I>(it: I) -> Self
+ where
+ I: Iterator<Item = Self>,
+ {
+ it.fold(Self::default(), |a, b| a + b)
+ }
+}
+
+impl<A, S, R> Extend<R> for HashSet<A, S>
+where
+ A: Hash + Eq + Clone + From<R>,
+ S: BuildHasher,
+{
+ fn extend<I>(&mut self, iter: I)
+ where
+ I: IntoIterator<Item = R>,
+ {
+ for value in iter {
+ self.insert(From::from(value));
+ }
+ }
+}
+
+#[cfg(not(has_specialisation))]
+impl<A, S> Debug for HashSet<A, S>
+where
+ A: Hash + Eq + Debug,
+ S: BuildHasher,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ f.debug_set().entries(self.iter()).finish()
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<A, S> Debug for HashSet<A, S>
+where
+ A: Hash + Eq + Debug,
+ S: BuildHasher,
+{
+ default fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ f.debug_set().entries(self.iter()).finish()
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<A, S> Debug for HashSet<A, S>
+where
+ A: Hash + Eq + Debug + Ord,
+ S: BuildHasher,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ f.debug_set().entries(self.iter()).finish()
+ }
+}
+
+// Iterators
+
+/// An iterator over the elements of a set.
+pub struct Iter<'a, A> {
+ it: NodeIter<'a, Value<A>>,
+}
+
+impl<'a, A> Iterator for Iter<'a, A>
+where
+ A: 'a,
+{
+ type Item = &'a A;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|(v, _)| &v.0)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<'a, A> ExactSizeIterator for Iter<'a, A> {}
+
+impl<'a, A> FusedIterator for Iter<'a, A> {}
+
+/// A consuming iterator over the elements of a set.
+pub struct ConsumingIter<A>
+where
+ A: Hash + Eq + Clone,
+{
+ it: NodeDrain<Value<A>>,
+}
+
+impl<A> Iterator for ConsumingIter<A>
+where
+ A: Hash + Eq + Clone,
+{
+ type Item = A;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|(v, _)| v.0)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<A> ExactSizeIterator for ConsumingIter<A> where A: Hash + Eq + Clone {}
+
+impl<A> FusedIterator for ConsumingIter<A> where A: Hash + Eq + Clone {}
+
+// Iterator conversions
+
+impl<A, RA, S> FromIterator<RA> for HashSet<A, S>
+where
+ A: Hash + Eq + Clone + From<RA>,
+ S: BuildHasher + Default,
+{
+ fn from_iter<T>(i: T) -> Self
+ where
+ T: IntoIterator<Item = RA>,
+ {
+ let mut set = Self::default();
+ for value in i {
+ set.insert(From::from(value));
+ }
+ set
+ }
+}
+
+impl<'a, A, S> IntoIterator for &'a HashSet<A, S>
+where
+ A: Hash + Eq,
+ S: BuildHasher,
+{
+ type Item = &'a A;
+ type IntoIter = Iter<'a, A>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
+impl<A, S> IntoIterator for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher,
+{
+ type Item = A;
+ type IntoIter = ConsumingIter<Self::Item>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ ConsumingIter {
+ it: NodeDrain::new(&self.pool.0, self.root, self.size),
+ }
+ }
+}
+
+// Conversions
+
+impl<'s, 'a, A, OA, SA, SB> From<&'s HashSet<&'a A, SA>> for HashSet<OA, SB>
+where
+ A: ToOwned<Owned = OA> + Hash + Eq + ?Sized,
+ OA: Borrow<A> + Hash + Eq + Clone,
+ SA: BuildHasher,
+ SB: BuildHasher + Default,
+{
+ fn from(set: &HashSet<&A, SA>) -> Self {
+ set.iter().map(|a| (*a).to_owned()).collect()
+ }
+}
+
+impl<'a, A, S> From<&'a [A]> for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(slice: &'a [A]) -> Self {
+ slice.iter().cloned().collect()
+ }
+}
+
+impl<A, S> From<Vec<A>> for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(vec: Vec<A>) -> Self {
+ vec.into_iter().collect()
+ }
+}
+
+impl<'a, A, S> From<&'a Vec<A>> for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(vec: &Vec<A>) -> Self {
+ vec.iter().cloned().collect()
+ }
+}
+
+impl<A, S> From<Vector<A>> for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(vector: Vector<A>) -> Self {
+ vector.into_iter().collect()
+ }
+}
+
+impl<'a, A, S> From<&'a Vector<A>> for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(vector: &Vector<A>) -> Self {
+ vector.iter().cloned().collect()
+ }
+}
+
+impl<A, S> From<collections::HashSet<A>> for HashSet<A, S>
+where
+ A: Eq + Hash + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(hash_set: collections::HashSet<A>) -> Self {
+ hash_set.into_iter().collect()
+ }
+}
+
+impl<'a, A, S> From<&'a collections::HashSet<A>> for HashSet<A, S>
+where
+ A: Eq + Hash + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(hash_set: &collections::HashSet<A>) -> Self {
+ hash_set.iter().cloned().collect()
+ }
+}
+
+impl<'a, A, S> From<&'a BTreeSet<A>> for HashSet<A, S>
+where
+ A: Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(btree_set: &BTreeSet<A>) -> Self {
+ btree_set.iter().cloned().collect()
+ }
+}
+
+impl<A, S> From<OrdSet<A>> for HashSet<A, S>
+where
+ A: Ord + Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(ordset: OrdSet<A>) -> Self {
+ ordset.into_iter().collect()
+ }
+}
+
+impl<'a, A, S> From<&'a OrdSet<A>> for HashSet<A, S>
+where
+ A: Ord + Hash + Eq + Clone,
+ S: BuildHasher + Default,
+{
+ fn from(ordset: &OrdSet<A>) -> Self {
+ ordset.into_iter().cloned().collect()
+ }
+}
+
+// Proptest
+#[cfg(any(test, feature = "proptest"))]
+#[doc(hidden)]
+pub mod proptest {
+ #[deprecated(
+ since = "14.3.0",
+ note = "proptest strategies have moved to im::proptest"
+ )]
+ pub use crate::proptest::hash_set;
+}
+
+#[cfg(test)]
+mod test {
+ use super::proptest::*;
+ use super::*;
+ use crate::test::LolHasher;
+ use ::proptest::num::i16;
+ use ::proptest::proptest;
+ use std::hash::BuildHasherDefault;
+
+ #[test]
+ fn insert_failing() {
+ let mut set: HashSet<i16, BuildHasherDefault<LolHasher>> = Default::default();
+ set.insert(14658);
+ assert_eq!(1, set.len());
+ set.insert(-19198);
+ assert_eq!(2, set.len());
+ }
+
+ #[test]
+ fn match_strings_with_string_slices() {
+ let mut set: HashSet<String> = From::from(&hashset!["foo", "bar"]);
+ set = set.without("bar");
+ assert!(!set.contains("bar"));
+ set.remove("foo");
+ assert!(!set.contains("foo"));
+ }
+
+ #[test]
+ fn macro_allows_trailing_comma() {
+ let set1 = hashset! {"foo", "bar"};
+ let set2 = hashset! {
+ "foo",
+ "bar",
+ };
+ assert_eq!(set1, set2);
+ }
+
+ #[test]
+ fn issue_60_drain_iterator_memory_corruption() {
+ use crate::test::MetroHashBuilder;
+ for i in 0..1000 {
+ let mut lhs = vec![0, 1, 2];
+ lhs.sort_unstable();
+
+ let hasher = Ref::from(MetroHashBuilder::new(i));
+ let mut iset: HashSet<_, MetroHashBuilder> = HashSet::with_hasher(hasher.clone());
+ for &i in &lhs {
+ iset.insert(i);
+ }
+
+ let mut rhs: Vec<_> = iset.clone().into_iter().collect();
+ rhs.sort_unstable();
+
+ if lhs != rhs {
+ println!("iteration: {}", i);
+ println!("seed: {}", hasher.seed());
+ println!("lhs: {}: {:?}", lhs.len(), &lhs);
+ println!("rhs: {}: {:?}", rhs.len(), &rhs);
+ panic!();
+ }
+ }
+ }
+
+ proptest! {
+ #[test]
+ fn proptest_a_set(ref s in hash_set(".*", 10..100)) {
+ assert!(s.len() < 100);
+ assert!(s.len() >= 10);
+ }
+ }
+}
diff --git a/vendor/im-rc/src/iter.rs b/vendor/im-rc/src/iter.rs
new file mode 100644
index 0000000..2327b8d
--- /dev/null
+++ b/vendor/im-rc/src/iter.rs
@@ -0,0 +1,42 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+//! Iterators over immutable data.
+
+/// Create an iterator of values using a function to update an owned state
+/// value.
+///
+/// The function is called with the current state as its argument, and should
+/// return an [`Option`][std::option::Option] of a tuple of the next value to
+/// yield from the iterator and the updated state. If the function returns
+/// [`None`][std::option::Option::None], the iterator ends.
+///
+/// # Examples
+/// ```
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::iter::unfold;
+/// # use im::vector::Vector;
+/// # use std::iter::FromIterator;
+/// // Create an infinite stream of numbers, starting at 0.
+/// let mut it = unfold(0, |i| Some((i, i + 1)));
+///
+/// // Make a list out of its first five elements.
+/// let numbers = Vector::from_iter(it.take(5));
+/// assert_eq!(numbers, vector![0, 1, 2, 3, 4]);
+/// ```
+///
+/// [std::option::Option]: https://doc.rust-lang.org/std/option/enum.Option.html
+/// [std::option::Option::None]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
+pub fn unfold<F, S, A>(value: S, f: F) -> impl Iterator<Item = A>
+where
+ F: Fn(S) -> Option<(A, S)>,
+{
+ let mut value = Some(value);
+ std::iter::from_fn(move || {
+ f(value.take().unwrap()).map(|(next, state)| {
+ value = Some(state);
+ next
+ })
+ })
+}
diff --git a/vendor/im-rc/src/lib.rs b/vendor/im-rc/src/lib.rs
new file mode 100644
index 0000000..fa7a0a9
--- /dev/null
+++ b/vendor/im-rc/src/lib.rs
@@ -0,0 +1,507 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+//! # Immutable Data Structures for Rust
+//!
+//! This library implements several of the more commonly useful immutable data
+//! structures for Rust.
+//!
+//! ## What are immutable data structures?
+//!
+//! Immutable data structures are data structures which can be copied and
+//! modified efficiently without altering the original. The most uncomplicated
+//! example of this is the venerable [cons list][cons-list]. This crate offers a
+//! selection of more modern and flexible data structures with similar
+//! properties, tuned for the needs of Rust developers.
+//!
+//! Briefly, the following data structures are provided:
+//!
+//! * [Vectors][vector::Vector] based on [RRB trees][rrb-tree]
+//! * [Hash maps][hashmap::HashMap]/[sets][hashset::HashSet] based on [hash
+//! array mapped tries][hamt]
+//! * [Ordered maps][ordmap::OrdMap]/[sets][ordset::OrdSet] based on
+//! [B-trees][b-tree]
+//!
+//! ## Why Would I Want This?
+//!
+//! While immutable data structures can be a game changer for other
+//! programming languages, the most obvious benefit - avoiding the
+//! accidental mutation of data - is already handled so well by Rust's
+//! type system that it's just not something a Rust programmer needs
+//! to worry about even when using data structures that would send a
+//! conscientious Clojure programmer into a panic.
+//!
+//! Immutable data structures offer other benefits, though, some of
+//! which are useful even in a language like Rust. The most prominent
+//! is *structural sharing*, which means that if two data structures
+//! are mostly copies of each other, most of the memory they take up
+//! will be shared between them. This implies that making copies of an
+//! immutable data structure is cheap: it's really only a matter of
+//! copying a pointer and increasing a reference counter, where in the
+//! case of [`Vec`][std::vec::Vec] you have to allocate the same
+//! amount of memory all over again and make a copy of every element
+//! it contains. For immutable data structures, extra memory isn't
+//! allocated until you modify either the copy or the original, and
+//! then only the memory needed to record the difference.
+//!
+//! Another goal of this library has been the idea that you shouldn't
+//! even have to think about what data structure to use in any given
+//! situation, until the point where you need to start worrying about
+//! optimisation - which, in practice, often never comes. Beyond the
+//! shape of your data (ie. whether to use a list or a map), it should
+//! be fine not to think too carefully about data structures - you can
+//! just pick the one that has the right shape and it should have
+//! acceptable performance characteristics for every operation you
+//! might need. Specialised data structures will always be faster at
+//! what they've been specialised for, but `im` aims to provide the
+//! data structures which deliver the least chance of accidentally
+//! using them for the wrong thing.
+//!
+//! For instance, [`Vec`][std::vec::Vec] beats everything at memory
+//! usage, indexing and operations that happen at the back of the
+//! list, but is terrible at insertion and removal, and gets worse the
+//! closer to the front of the list you get.
+//! [`VecDeque`][std::collections::VecDeque] adds a little bit of
+//! complexity in order to make operations at the front as efficient
+//! as operations at the back, but is still bad at insertion and
+//! especially concatenation. [`Vector`][vector::Vector] adds another
+//! bit of complexity, and could never match [`Vec`][std::vec::Vec] at
+//! what it's best at, but in return every operation you can throw at
+//! it can be completed in a reasonable amount of time - even normally
+//! expensive operations like copying and especially concatenation are
+//! reasonably cheap when using a [`Vector`][vector::Vector].
+//!
+//! It should be noted, however, that because of its simplicity,
+//! [`Vec`][std::vec::Vec] actually beats [`Vector`][vector::Vector] even at its
+//! strongest operations at small sizes, just because modern CPUs are
+//! hyperoptimised for things like copying small chunks of contiguous memory -
+//! you actually need to go past a certain size (usually in the vicinity of
+//! several hundred elements) before you get to the point where
+//! [`Vec`][std::vec::Vec] isn't always going to be the fastest choice.
+//! [`Vector`][vector::Vector] attempts to overcome this by actually just being
+//! an array at very small sizes, and being able to switch efficiently to the
+//! full data structure when it grows large enough. Thus,
+//! [`Vector`][vector::Vector] will actually be equivalent to
+//! [Vec][std::vec::Vec] until it grows past the size of a single chunk.
+//!
+//! The maps - [`HashMap`][hashmap::HashMap] and
+//! [`OrdMap`][ordmap::OrdMap] - generally perform similarly to their
+//! equivalents in the standard library, but tend to run a bit slower
+//! on the basic operations ([`HashMap`][hashmap::HashMap] is almost
+//! neck and neck with its counterpart, while
+//! [`OrdMap`][ordmap::OrdMap] currently tends to run 2-3x slower). On
+//! the other hand, they offer the cheap copy and structural sharing
+//! between copies that you'd expect from immutable data structures.
+//!
+//! In conclusion, the aim of this library is to provide a safe
+//! default choice for the most common kinds of data structures,
+//! allowing you to defer careful thinking about the right data
+//! structure for the job until you need to start looking for
+//! optimisations - and you may find, especially for larger data sets,
+//! that immutable data structures are still the right choice.
+//!
+//! ## Values
+//!
+//! Because we need to make copies of shared nodes in these data structures
+//! before updating them, the values you store in them must implement
+//! [`Clone`][std::clone::Clone]. For primitive values that implement
+//! [`Copy`][std::marker::Copy], such as numbers, everything is fine: this is
+//! the case for which the data structures are optimised, and performance is
+//! going to be great.
+//!
+//! On the other hand, if you want to store values for which cloning is
+//! expensive, or values that don't implement [`Clone`][std::clone::Clone], you
+//! need to wrap them in [`Rc`][std::rc::Rc] or [`Arc`][std::sync::Arc]. Thus,
+//! if you have a complex structure `BigBlobOfData` and you want to store a list
+//! of them as a `Vector<BigBlobOfData>`, you should instead use a
+//! `Vector<Rc<BigBlobOfData>>`, which is going to save you not only the time
+//! spent cloning the big blobs of data, but also the memory spent keeping
+//! multiple copies of it around, as [`Rc`][std::rc::Rc] keeps a single
+//! reference counted copy around instead.
+//!
+//! If you're storing smaller values that aren't
+//! [`Copy`][std::marker::Copy]able, you'll need to exercise judgement: if your
+//! values are going to be very cheap to clone, as would be the case for short
+//! [`String`][std::string::String]s or small [`Vec`][std::vec::Vec]s, you're
+//! probably better off storing them directly without wrapping them in an
+//! [`Rc`][std::rc::Rc], because, like the [`Rc`][std::rc::Rc], they're just
+//! pointers to some data on the heap, and that data isn't expensive to clone -
+//! you might actually lose more performance from the extra redirection of
+//! wrapping them in an [`Rc`][std::rc::Rc] than you would from occasionally
+//! cloning them.
+//!
+//! ### When does cloning happen?
+//!
+//! So when will your values actually be cloned? The easy answer is only if you
+//! [`clone`][std::clone::Clone::clone] the data structure itself, and then only
+//! lazily as you change it. Values are stored in tree nodes inside the data
+//! structure, each node of which contains up to 64 values. When you
+//! [`clone`][std::clone::Clone::clone] a data structure, nothing is actually
+//! copied - it's just the reference count on the root node that's incremented,
+//! to indicate that it's shared between two data structures. It's only when you
+//! actually modify one of the shared data structures that nodes are cloned:
+//! when you make a change somewhere in the tree, the node containing the change
+//! needs to be cloned, and then its parent nodes need to be updated to contain
+//! the new child node instead of the old version, and so they're cloned as
+//! well.
+//!
+//! We can call this "lazy" cloning - if you make two copies of a data structure
+//! and you never change either of them, there's never any need to clone the
+//! data they contain. It's only when you start making changes that cloning
+//! starts to happen, and then only on the specific tree nodes that are part of
+//! the change. Note that the implications of lazily cloning the data structure
+//! extend to memory usage as well as the CPU workload of copying the data
+//! around - cloning an immutable data structure means both copies share the
+//! same allocated memory, until you start making changes.
+//!
+//! Most crucially, if you never clone the data structure, the data inside it is
+//! also never cloned, and in this case it acts just like a mutable data
+//! structure, with minimal performance differences (but still non-zero, as we
+//! still have to check for shared nodes).
+//!
+//! ## Data Structures
+//!
+//! We'll attempt to provide a comprehensive guide to the available
+//! data structures below.
+//!
+//! ### Performance Notes
+//!
+//! "Big O notation" is the standard way of talking about the time
+//! complexity of data structure operations. If you're not familiar
+//! with big O notation, here's a quick cheat sheet:
+//!
+//! *O(1)* means an operation runs in constant time: it will take the
+//! same time to complete regardless of the size of the data
+//! structure.
+//!
+//! *O(n)* means an operation runs in linear time: if you double the
+//! size of your data structure, the operation will take twice as long
+//! to complete; if you quadruple the size, it will take four times as
+//! long, etc.
+//!
+//! *O(log n)* means an operation runs in logarithmic time: for
+//! *log<sub>2</sub>*, if you double the size of your data structure,
+//! the operation will take one step longer to complete; if you
+//! quadruple the size, it will need two steps more; and so on.
+//! However, the data structures in this library generally run in
+//! *log<sub>64</sub>* time, meaning you have to make your data
+//! structure 64 times bigger to need one extra step, and 4096 times
+//! bigger to need two steps. This means that, while they still count
+//! as O(log n), operations on all but really large data sets will run
+//! at near enough to O(1) that you won't usually notice.
+//!
+//! *O(n log n)* is the most expensive operation you'll see in this
+//! library: it means that for every one of the *n* elements in your
+//! data structure, you have to perform *log n* operations. In our
+//! case, as noted above, this is often close enough to O(n) that it's
+//! not usually as bad as it sounds, but even O(n) isn't cheap and the
+//! cost still increases logarithmically, if slowly, as the size of
+//! your data increases. O(n log n) basically means "are you sure you
+//! need to do this?"
+//!
+//! *O(1)** means 'amortised O(1),' which means that an operation
+//! usually runs in constant time but will occasionally be more
+//! expensive: for instance,
+//! [`Vector::push_back`][vector::Vector::push_back], if called in
+//! sequence, will be O(1) most of the time but every 64th time it
+//! will be O(log n), as it fills up its tail chunk and needs to
+//! insert it into the tree. Please note that the O(1) with the
+//! asterisk attached is not a common notation; it's just a convention
+//! I've used in these docs to save myself from having to type
+//! 'amortised' everywhere.
+//!
+//! ### Lists
+//!
+//! Lists are sequences of single elements which maintain the order in
+//! which you inserted them. The only list in this library is
+//! [`Vector`][vector::Vector], which offers the best all round
+//! performance characteristics: it's pretty good at everything, even
+//! if there's always another kind of list that's better at something.
+//!
+//! | Type | Algorithm | Constraints | Order | Push | Pop | Split | Append | Lookup |
+//! | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+//! | [`Vector<A>`][vector::Vector] | [RRB tree][rrb-tree] | [`Clone`][std::clone::Clone] | insertion | O(1)\* | O(1)\* | O(log n) | O(log n) | O(log n) |
+//!
+//! ### Maps
+//!
+//! Maps are mappings of keys to values, where the most common read
+//! operation is to find the value associated with a given key. Maps
+//! may or may not have a defined order. Any given key can only occur
+//! once inside a map, and setting a key to a different value will
+//! overwrite the previous value.
+//!
+//! | Type | Algorithm | Key Constraints | Order | Insert | Remove | Lookup |
+//! | --- | --- | --- | --- | --- | --- | --- |
+//! | [`HashMap<K, V>`][hashmap::HashMap] | [HAMT][hamt] | [`Clone`][std::clone::Clone] + [`Hash`][std::hash::Hash] + [`Eq`][std::cmp::Eq] | undefined | O(log n) | O(log n) | O(log n) |
+//! | [`OrdMap<K, V>`][ordmap::OrdMap] | [B-tree][b-tree] | [`Clone`][std::clone::Clone] + [`Ord`][std::cmp::Ord] | sorted | O(log n) | O(log n) | O(log n) |
+//!
+//! ### Sets
+//!
+//! Sets are collections of unique values, and may or may not have a
+//! defined order. Their crucial property is that any given value can
+//! only exist once in a given set.
+//!
+//! | Type | Algorithm | Constraints | Order | Insert | Remove | Lookup |
+//! | --- | --- | --- | --- | --- | --- | --- |
+//! | [`HashSet<A>`][hashset::HashSet] | [HAMT][hamt] | [`Clone`][std::clone::Clone] + [`Hash`][std::hash::Hash] + [`Eq`][std::cmp::Eq] | undefined | O(log n) | O(log n) | O(log n) |
+//! | [`OrdSet<A>`][ordset::OrdSet] | [B-tree][b-tree] | [`Clone`][std::clone::Clone] + [`Ord`][std::cmp::Ord] | sorted | O(log n) | O(log n) | O(log n) |
+//!
+//! ## In-place Mutation
+//!
+//! All of these data structures support in-place copy-on-write
+//! mutation, which means that if you're the sole user of a data
+//! structure, you can update it in place without taking the
+//! performance hit of making a copy of the data structure before
+//! modifying it (this is about an order of magnitude faster than
+//! immutable operations, almost as fast as
+//! [`std::collections`][std::collections]'s mutable data structures).
+//!
+//! Thanks to [`Rc`][std::rc::Rc]'s reference counting, we are able to
+//! determine whether a node in a data structure is being shared with
+//! other data structures, or whether it's safe to mutate it in place.
+//! When it's shared, we'll automatically make a copy of the node
+//! before modifying it. The consequence of this is that cloning a
+//! data structure becomes a lazy operation: the initial clone is
+//! instant, and as you modify the cloned data structure it will clone
+//! chunks only where you change them, so that if you change the
+//! entire thing you will eventually have performed a full clone.
+//!
+//! This also gives us a couple of other optimisations for free:
+//! implementations of immutable data structures in other languages
+//! often have the idea of local mutation, like Clojure's transients
+//! or Haskell's `ST` monad - a managed scope where you can treat an
+//! immutable data structure like a mutable one, gaining a
+//! considerable amount of performance because you no longer need to
+//! copy your changed nodes for every operation, just the first time
+//! you hit a node that's sharing structure. In Rust, we don't need to
+//! think about this kind of managed scope, it's all taken care of
+//! behind the scenes because of our low level access to the garbage
+//! collector (which, in our case, is just a simple
+//! [`Rc`][std::rc::Rc]).
+//!
+//! ## Thread Safety
+//!
+//! The data structures in the `im` crate are thread safe, through
+//! [`Arc`][std::sync::Arc]. This comes with a slight performance impact, so
+//! that if you prioritise speed over thread safety, you may want to use the
+//! `im-rc` crate instead, which is identical to `im` except that it uses
+//! [`Rc`][std::rc::Rc] instead of [`Arc`][std::sync::Arc], implying that the
+//! data structures in `im-rc` do not implement [`Send`][std::marker::Send] and
+//! [`Sync`][std::marker::Sync]. This yields approximately a 20-25% increase in
+//! general performance.
+//!
+//! ## Feature Flags
+//!
+//! `im` comes with optional support for the following crates through Cargo
+//! feature flags. You can enable them in your `Cargo.toml` file like this:
+//!
+//! ```no_compile
+//! [dependencies]
+//! im = { version = "*", features = ["proptest", "serde"] }
+//! ```
+//!
+//! | Feature | Description |
+//! | ------- | ----------- |
+//! | [`pool`](https://crates.io/crates/refpool) | Constructors and pool types for [`refpool`](https://crates.io/crates/refpool) memory pools (only available in `im-rc`) |
+//! | [`proptest`](https://crates.io/crates/proptest) | Strategies for all `im` datatypes under a `proptest` namespace, eg. `im::vector::proptest::vector()` |
+//! | [`quickcheck`](https://crates.io/crates/quickcheck) | [`quickcheck::Arbitrary`](https://docs.rs/quickcheck/latest/quickcheck/trait.Arbitrary.html) implementations for all `im` datatypes (not available in `im-rc`) |
+//! | [`rayon`](https://crates.io/crates/rayon) | parallel iterator implementations for [`Vector`][vector::Vector] (not available in `im-rc`) |
+//! | [`serde`](https://crates.io/crates/serde) | [`Serialize`](https://docs.rs/serde/latest/serde/trait.Serialize.html) and [`Deserialize`](https://docs.rs/serde/latest/serde/trait.Deserialize.html) implementations for all `im` datatypes |
+//! | [`arbitrary`](https://crates.io/crates/arbitrary/) | [`arbitrary::Arbitrary`](https://docs.rs/arbitrary/latest/arbitrary/trait.Arbitrary.html) implementations for all `im` datatypes |
+//!
+//! [std::collections]: https://doc.rust-lang.org/std/collections/index.html
+//! [std::collections::VecDeque]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html
+//! [std::vec::Vec]: https://doc.rust-lang.org/std/vec/struct.Vec.html
+//! [std::string::String]: https://doc.rust-lang.org/std/string/struct.String.html
+//! [std::rc::Rc]: https://doc.rust-lang.org/std/rc/struct.Rc.html
+//! [std::sync::Arc]: https://doc.rust-lang.org/std/sync/struct.Arc.html
+//! [std::cmp::Eq]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
+//! [std::cmp::Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html
+//! [std::clone::Clone]: https://doc.rust-lang.org/std/clone/trait.Clone.html
+//! [std::clone::Clone::clone]: https://doc.rust-lang.org/std/clone/trait.Clone.html#tymethod.clone
+//! [std::marker::Copy]: https://doc.rust-lang.org/std/marker/trait.Copy.html
+//! [std::hash::Hash]: https://doc.rust-lang.org/std/hash/trait.Hash.html
+//! [std::marker::Send]: https://doc.rust-lang.org/std/marker/trait.Send.html
+//! [std::marker::Sync]: https://doc.rust-lang.org/std/marker/trait.Sync.html
+//! [hashmap::HashMap]: ./struct.HashMap.html
+//! [hashset::HashSet]: ./struct.HashSet.html
+//! [ordmap::OrdMap]: ./struct.OrdMap.html
+//! [ordset::OrdSet]: ./struct.OrdSet.html
+//! [vector::Vector]: ./struct.Vector.html
+//! [vector::Vector::push_back]: ./vector/enum.Vector.html#method.push_back
+//! [rrb-tree]: https://infoscience.epfl.ch/record/213452/files/rrbvector.pdf
+//! [hamt]: https://en.wikipedia.org/wiki/Hash_array_mapped_trie
+//! [b-tree]: https://en.wikipedia.org/wiki/B-tree
+//! [cons-list]: https://en.wikipedia.org/wiki/Cons#Lists
+
+#![forbid(rust_2018_idioms)]
+#![deny(unsafe_code, nonstandard_style)]
+#![warn(unreachable_pub, missing_docs)]
+#![cfg_attr(has_specialisation, feature(specialization))]
+
+#[cfg(test)]
+#[macro_use]
+extern crate pretty_assertions;
+
+mod config;
+mod nodes;
+mod sort;
+mod sync;
+
+#[macro_use]
+mod util;
+
+#[macro_use]
+mod ord;
+pub use crate::ord::map as ordmap;
+pub use crate::ord::set as ordset;
+
+#[macro_use]
+mod hash;
+pub use crate::hash::map as hashmap;
+pub use crate::hash::set as hashset;
+
+#[macro_use]
+pub mod vector;
+
+pub mod iter;
+
+#[cfg(any(test, feature = "proptest"))]
+pub mod proptest;
+
+#[cfg(any(test, feature = "serde"))]
+#[doc(hidden)]
+pub mod ser;
+
+#[cfg(feature = "arbitrary")]
+#[doc(hidden)]
+pub mod arbitrary;
+
+#[cfg(all(threadsafe, feature = "quickcheck"))]
+#[doc(hidden)]
+pub mod quickcheck;
+
+#[cfg(any(threadsafe, not(feature = "pool")))]
+mod fakepool;
+
+#[cfg(all(threadsafe, feature = "pool"))]
+compile_error!(
+ "The `pool` feature is not threadsafe but you've enabled it on a threadsafe version of `im`."
+);
+
+pub use crate::hashmap::HashMap;
+pub use crate::hashset::HashSet;
+pub use crate::ordmap::OrdMap;
+pub use crate::ordset::OrdSet;
+#[doc(inline)]
+pub use crate::vector::Vector;
+
+#[cfg(test)]
+mod test;
+
+#[cfg(test)]
+mod tests;
+
+/// Update a value inside multiple levels of data structures.
+///
+/// This macro takes a [`Vector`][Vector], [`OrdMap`][OrdMap] or [`HashMap`][HashMap],
+/// a key or a series of keys, and a value, and returns the data structure with the
+/// new value at the location described by the keys.
+///
+/// If one of the keys in the path doesn't exist, the macro will panic.
+///
+/// # Examples
+///
+/// ```
+/// # #[macro_use] extern crate im_rc as im;
+/// # use std::sync::Arc;
+/// # fn main() {
+/// let vec_inside_vec = vector![vector![1, 2, 3], vector![4, 5, 6]];
+///
+/// let expected = vector![vector![1, 2, 3], vector![4, 5, 1337]];
+///
+/// assert_eq!(expected, update_in![vec_inside_vec, 1 => 2, 1337]);
+/// # }
+/// ```
+///
+/// [Vector]: ../vector/enum.Vector.html
+/// [HashMap]: ../hashmap/struct.HashMap.html
+/// [OrdMap]: ../ordmap/struct.OrdMap.html
+#[macro_export]
+macro_rules! update_in {
+ ($target:expr, $path:expr => $($tail:tt) => *, $value:expr ) => {{
+ let inner = $target.get($path).expect("update_in! macro: key not found in target");
+ $target.update($path, update_in!(inner, $($tail) => *, $value))
+ }};
+
+ ($target:expr, $path:expr, $value:expr) => {
+ $target.update($path, $value)
+ };
+}
+
+/// Get a value inside multiple levels of data structures.
+///
+/// This macro takes a [`Vector`][Vector], [`OrdMap`][OrdMap] or [`HashMap`][HashMap],
+/// along with a key or a series of keys, and returns the value at the location inside
+/// the data structure described by the key sequence, or `None` if any of the keys didn't
+/// exist.
+///
+/// # Examples
+///
+/// ```
+/// # #[macro_use] extern crate im_rc as im;
+/// # use std::sync::Arc;
+/// # fn main() {
+/// let vec_inside_vec = vector![vector![1, 2, 3], vector![4, 5, 6]];
+///
+/// assert_eq!(Some(&6), get_in![vec_inside_vec, 1 => 2]);
+/// # }
+/// ```
+///
+/// [Vector]: ../vector/enum.Vector.html
+/// [HashMap]: ../hashmap/struct.HashMap.html
+/// [OrdMap]: ../ordmap/struct.OrdMap.html
+#[macro_export]
+macro_rules! get_in {
+ ($target:expr, $path:expr => $($tail:tt) => * ) => {{
+ $target.get($path).and_then(|v| get_in!(v, $($tail) => *))
+ }};
+
+ ($target:expr, $path:expr) => {
+ $target.get($path)
+ };
+}
+
+#[cfg(test)]
+mod lib_test {
+ #[test]
+ fn update_in() {
+ let vector = vector![1, 2, 3, 4, 5];
+ assert_eq!(vector![1, 2, 23, 4, 5], update_in!(vector, 2, 23));
+ let hashmap = hashmap![1 => 1, 2 => 2, 3 => 3];
+ assert_eq!(
+ hashmap![1 => 1, 2 => 23, 3 => 3],
+ update_in!(hashmap, 2, 23)
+ );
+ let ordmap = ordmap![1 => 1, 2 => 2, 3 => 3];
+ assert_eq!(ordmap![1 => 1, 2 => 23, 3 => 3], update_in!(ordmap, 2, 23));
+
+ let vecs = vector![vector![1, 2, 3], vector![4, 5, 6], vector![7, 8, 9]];
+ let vecs_target = vector![vector![1, 2, 3], vector![4, 5, 23], vector![7, 8, 9]];
+ assert_eq!(vecs_target, update_in!(vecs, 1 => 2, 23));
+ }
+
+ #[test]
+ fn get_in() {
+ let vector = vector![1, 2, 3, 4, 5];
+ assert_eq!(Some(&3), get_in!(vector, 2));
+ let hashmap = hashmap![1 => 1, 2 => 2, 3 => 3];
+ assert_eq!(Some(&2), get_in!(hashmap, &2));
+ let ordmap = ordmap![1 => 1, 2 => 2, 3 => 3];
+ assert_eq!(Some(&2), get_in!(ordmap, &2));
+
+ let vecs = vector![vector![1, 2, 3], vector![4, 5, 6], vector![7, 8, 9]];
+ assert_eq!(Some(&6), get_in!(vecs, 1 => 2));
+ }
+}
diff --git a/vendor/im-rc/src/nodes/btree.rs b/vendor/im-rc/src/nodes/btree.rs
new file mode 100644
index 0000000..84f63fa
--- /dev/null
+++ b/vendor/im-rc/src/nodes/btree.rs
@@ -0,0 +1,1368 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use std::borrow::Borrow;
+use std::cmp::Ordering;
+use std::mem;
+use std::ops::{Bound, RangeBounds};
+
+use sized_chunks::Chunk;
+use typenum::{Add1, Unsigned};
+
+use crate::config::OrdChunkSize as NodeSize;
+use crate::util::{Pool, PoolClone, PoolDefault, PoolRef};
+
+use self::Insert::*;
+use self::InsertAction::*;
+
+pub(crate) const NODE_SIZE: usize = NodeSize::USIZE;
+const MEDIAN: usize = (NODE_SIZE + 1) >> 1;
+
+pub trait BTreeValue {
+ type Key;
+ fn ptr_eq(&self, other: &Self) -> bool;
+ fn search_key<BK>(slice: &[Self], key: &BK) -> Result<usize, usize>
+ where
+ BK: Ord + ?Sized,
+ Self: Sized,
+ Self::Key: Borrow<BK>;
+ fn search_value(slice: &[Self], value: &Self) -> Result<usize, usize>
+ where
+ Self: Sized;
+ fn cmp_keys<BK>(&self, other: &BK) -> Ordering
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>;
+ fn cmp_values(&self, other: &Self) -> Ordering;
+}
+
+pub(crate) struct Node<A> {
+ keys: Chunk<A, NodeSize>,
+ children: Chunk<Option<PoolRef<Node<A>>>, Add1<NodeSize>>,
+}
+
+#[cfg(feature = "pool")]
+#[allow(unsafe_code)]
+unsafe fn cast_uninit<A>(target: &mut A) -> &mut mem::MaybeUninit<A> {
+ &mut *(target as *mut A as *mut mem::MaybeUninit<A>)
+}
+
+#[allow(unsafe_code)]
+impl<A> PoolDefault for Node<A> {
+ #[cfg(feature = "pool")]
+ unsafe fn default_uninit(target: &mut mem::MaybeUninit<Self>) {
+ let ptr: *mut Self = target.as_mut_ptr();
+ Chunk::default_uninit(cast_uninit(&mut (*ptr).keys));
+ Chunk::default_uninit(cast_uninit(&mut (*ptr).children));
+ (*ptr).children.push_back(None);
+ }
+}
+
+#[allow(unsafe_code)]
+impl<A> PoolClone for Node<A>
+where
+ A: Clone,
+{
+ #[cfg(feature = "pool")]
+ unsafe fn clone_uninit(&self, target: &mut mem::MaybeUninit<Self>) {
+ self.keys
+ .clone_uninit(cast_uninit(&mut (*target.as_mut_ptr()).keys));
+ self.children
+ .clone_uninit(cast_uninit(&mut (*target.as_mut_ptr()).children));
+ }
+}
+
+pub(crate) enum Insert<A> {
+ Added,
+ Replaced(A),
+ Split(Node<A>, A, Node<A>),
+}
+
+enum InsertAction<A> {
+ AddedAction,
+ ReplacedAction(A),
+ InsertAt,
+ InsertSplit(Node<A>, A, Node<A>),
+}
+
+pub(crate) enum Remove<A> {
+ NoChange,
+ Removed(A),
+ Update(A, Node<A>),
+}
+
+enum Boundary {
+ Lowest,
+ Highest,
+}
+
+enum RemoveAction {
+ DeleteAt(usize),
+ PullUp(Boundary, usize, usize),
+ Merge(usize),
+ StealFromLeft(usize),
+ StealFromRight(usize),
+ MergeFirst(usize),
+ ContinueDown(usize),
+}
+
+impl<A> Clone for Node<A>
+where
+ A: Clone,
+{
+ fn clone(&self) -> Self {
+ Node {
+ keys: self.keys.clone(),
+ children: self.children.clone(),
+ }
+ }
+}
+
+impl<A> Default for Node<A> {
+ fn default() -> Self {
+ Node {
+ keys: Chunk::new(),
+ children: Chunk::unit(None),
+ }
+ }
+}
+
+impl<A> Node<A> {
+ #[inline]
+ fn has_room(&self) -> bool {
+ self.keys.len() < NODE_SIZE
+ }
+
+ #[inline]
+ fn too_small(&self) -> bool {
+ self.keys.len() < MEDIAN
+ }
+
+ #[inline]
+ pub(crate) fn unit(value: A) -> Self {
+ Node {
+ keys: Chunk::unit(value),
+ children: Chunk::pair(None, None),
+ }
+ }
+
+ #[inline]
+ pub(crate) fn new_from_split(
+ pool: &Pool<Node<A>>,
+ left: Node<A>,
+ median: A,
+ right: Node<A>,
+ ) -> Self {
+ Node {
+ keys: Chunk::unit(median),
+ children: Chunk::pair(
+ Some(PoolRef::new(pool, left)),
+ Some(PoolRef::new(pool, right)),
+ ),
+ }
+ }
+
+ pub(crate) fn min(&self) -> Option<&A> {
+ match self.children.first().unwrap() {
+ None => self.keys.first(),
+ Some(ref child) => child.min(),
+ }
+ }
+
+ pub(crate) fn max(&self) -> Option<&A> {
+ match self.children.last().unwrap() {
+ None => self.keys.last(),
+ Some(ref child) => child.max(),
+ }
+ }
+}
+
+impl<A: BTreeValue> Node<A> {
+ fn child_contains<BK>(&self, index: usize, key: &BK) -> bool
+ where
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if let Some(Some(ref child)) = self.children.get(index) {
+ child.lookup(key).is_some()
+ } else {
+ false
+ }
+ }
+
+ pub(crate) fn lookup<BK>(&self, key: &BK) -> Option<&A>
+ where
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return None;
+ }
+ // Perform a binary search, resulting in either a match or
+ // the index of the first higher key, meaning we search the
+ // child to the left of it.
+ match A::search_key(&self.keys, key) {
+ Ok(index) => Some(&self.keys[index]),
+ Err(index) => match self.children[index] {
+ None => None,
+ Some(ref node) => node.lookup(key),
+ },
+ }
+ }
+
+ pub(crate) fn lookup_mut<BK>(&mut self, pool: &Pool<Node<A>>, key: &BK) -> Option<&mut A>
+ where
+ A: Clone,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return None;
+ }
+ // Perform a binary search, resulting in either a match or
+ // the index of the first higher key, meaning we search the
+ // child to the left of it.
+ match A::search_key(&self.keys, key) {
+ Ok(index) => Some(&mut self.keys[index]),
+ Err(index) => match self.children[index] {
+ None => None,
+ Some(ref mut child_ref) => {
+ let child = PoolRef::make_mut(pool, child_ref);
+ child.lookup_mut(pool, key)
+ }
+ },
+ }
+ }
+
+ pub(crate) fn lookup_prev<'a, BK>(&'a self, key: &BK) -> Option<&A>
+ where
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return None;
+ }
+ match A::search_key(&self.keys, key) {
+ Ok(index) => Some(&self.keys[index]),
+ Err(index) => match self.children[index] {
+ None if index == 0 => None,
+ None => self.keys.get(index - 1).map(|_| &self.keys[index - 1]),
+ Some(ref node) => node.lookup_prev(key),
+ },
+ }
+ }
+
+ pub(crate) fn lookup_next<'a, BK>(&'a self, key: &BK) -> Option<&A>
+ where
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return None;
+ }
+ match A::search_key(&self.keys, key) {
+ Ok(index) => Some(&self.keys[index]),
+ Err(index) => match self.children[index] {
+ None => self.keys.get(index).map(|_| &self.keys[index]),
+ Some(ref node) => node.lookup_next(key),
+ },
+ }
+ }
+
+ pub(crate) fn lookup_prev_mut<'a, BK>(
+ &'a mut self,
+ pool: &Pool<Node<A>>,
+ key: &BK,
+ ) -> Option<&mut A>
+ where
+ A: Clone,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return None;
+ }
+ match A::search_key(&self.keys, key) {
+ Ok(index) => Some(&mut self.keys[index]),
+ Err(index) => match self.children[index] {
+ None if index == 0 => None,
+ None => match self.keys.get(index - 1) {
+ Some(_) => Some(&mut self.keys[index - 1]),
+ None => None,
+ },
+ Some(ref mut node) => PoolRef::make_mut(pool, node).lookup_prev_mut(pool, key),
+ },
+ }
+ }
+
+ pub(crate) fn lookup_next_mut<'a, BK>(
+ &'a mut self,
+ pool: &Pool<Node<A>>,
+ key: &BK,
+ ) -> Option<&mut A>
+ where
+ A: Clone,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return None;
+ }
+ match A::search_key(&self.keys, key) {
+ Ok(index) => Some(&mut self.keys[index]),
+ Err(index) => match self.children[index] {
+ None => match self.keys.get(index) {
+ Some(_) => Some(&mut self.keys[index]),
+ None => None,
+ },
+ Some(ref mut node) => PoolRef::make_mut(pool, node).lookup_next_mut(pool, key),
+ },
+ }
+ }
+
+ pub(crate) fn path_first<'a, BK>(
+ &'a self,
+ mut path: Vec<(&'a Node<A>, usize)>,
+ ) -> Vec<(&'a Node<A>, usize)>
+ where
+ A: 'a,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return Vec::new();
+ }
+ match self.children[0] {
+ None => {
+ path.push((self, 0));
+ path
+ }
+ Some(ref node) => {
+ path.push((self, 0));
+ node.path_first(path)
+ }
+ }
+ }
+
+ pub(crate) fn path_last<'a, BK>(
+ &'a self,
+ mut path: Vec<(&'a Node<A>, usize)>,
+ ) -> Vec<(&'a Node<A>, usize)>
+ where
+ A: 'a,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return Vec::new();
+ }
+ let end = self.children.len() - 1;
+ match self.children[end] {
+ None => {
+ path.push((self, end - 1));
+ path
+ }
+ Some(ref node) => {
+ path.push((self, end));
+ node.path_last(path)
+ }
+ }
+ }
+
+ pub(crate) fn path_next<'a, BK>(
+ &'a self,
+ key: &BK,
+ mut path: Vec<(&'a Node<A>, usize)>,
+ ) -> Vec<(&'a Node<A>, usize)>
+ where
+ A: 'a,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return Vec::new();
+ }
+ match A::search_key(&self.keys, key) {
+ Ok(index) => {
+ path.push((self, index));
+ path
+ }
+ Err(index) => match self.children[index] {
+ None => match self.keys.get(index) {
+ Some(_) => {
+ path.push((self, index));
+ path
+ }
+ None => {
+ // go back up to find next
+ while let Some((node, idx)) = path.last() {
+ if node.keys.len() == *idx {
+ path.pop();
+ } else {
+ break;
+ }
+ }
+ path
+ }
+ },
+ Some(ref node) => {
+ path.push((self, index));
+ node.path_next(key, path)
+ }
+ },
+ }
+ }
+
+ pub(crate) fn path_prev<'a, BK>(
+ &'a self,
+ key: &BK,
+ mut path: Vec<(&'a Node<A>, usize)>,
+ ) -> Vec<(&'a Node<A>, usize)>
+ where
+ A: 'a,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ if self.keys.is_empty() {
+ return Vec::new();
+ }
+ match A::search_key(&self.keys, key) {
+ Ok(index) => {
+ path.push((self, index));
+ path
+ }
+ Err(index) => match self.children[index] {
+ None if index == 0 => {
+ // go back up to find prev
+ while let Some((_, idx)) = path.last_mut() {
+ if *idx == 0 {
+ path.pop();
+ } else {
+ *idx -= 1;
+ break;
+ }
+ }
+ path
+ }
+ None => {
+ path.push((self, index - 1));
+ path
+ }
+ Some(ref node) => {
+ path.push((self, index));
+ node.path_prev(key, path)
+ }
+ },
+ }
+ }
+
+ fn split(
+ &mut self,
+ pool: &Pool<Node<A>>,
+ value: A,
+ ins_left: Option<Node<A>>,
+ ins_right: Option<Node<A>>,
+ ) -> Insert<A> {
+ let left_child = ins_left.map(|node| PoolRef::new(pool, node));
+ let right_child = ins_right.map(|node| PoolRef::new(pool, node));
+ let index = A::search_value(&self.keys, &value).unwrap_err();
+ let mut left_keys;
+ let mut left_children;
+ let mut right_keys;
+ let mut right_children;
+ let median;
+ match index.cmp(&MEDIAN) {
+ Ordering::Less => {
+ self.children[index] = left_child;
+
+ left_keys = Chunk::from_front(&mut self.keys, index);
+ left_keys.push_back(value);
+ left_keys.drain_from_front(&mut self.keys, MEDIAN - index - 1);
+
+ left_children = Chunk::from_front(&mut self.children, index + 1);
+ left_children.push_back(right_child);
+ left_children.drain_from_front(&mut self.children, MEDIAN - index - 1);
+
+ median = self.keys.pop_front();
+
+ right_keys = Chunk::drain_from(&mut self.keys);
+ right_children = Chunk::drain_from(&mut self.children);
+ }
+ Ordering::Greater => {
+ self.children[index] = left_child;
+
+ left_keys = Chunk::from_front(&mut self.keys, MEDIAN);
+ left_children = Chunk::from_front(&mut self.children, MEDIAN + 1);
+
+ median = self.keys.pop_front();
+
+ right_keys = Chunk::from_front(&mut self.keys, index - MEDIAN - 1);
+ right_keys.push_back(value);
+ right_keys.append(&mut self.keys);
+
+ right_children = Chunk::from_front(&mut self.children, index - MEDIAN);
+ right_children.push_back(right_child);
+ right_children.append(&mut self.children);
+ }
+ Ordering::Equal => {
+ left_keys = Chunk::from_front(&mut self.keys, MEDIAN);
+ left_children = Chunk::from_front(&mut self.children, MEDIAN);
+ left_children.push_back(left_child);
+
+ median = value;
+
+ right_keys = Chunk::drain_from(&mut self.keys);
+ right_children = Chunk::drain_from(&mut self.children);
+ right_children[0] = right_child;
+ }
+ }
+
+ debug_assert!(left_keys.len() == MEDIAN);
+ debug_assert!(left_children.len() == MEDIAN + 1);
+ debug_assert!(right_keys.len() == MEDIAN);
+ debug_assert!(right_children.len() == MEDIAN + 1);
+
+ Split(
+ Node {
+ keys: left_keys,
+ children: left_children,
+ },
+ median,
+ Node {
+ keys: right_keys,
+ children: right_children,
+ },
+ )
+ }
+
+ fn merge(middle: A, left: Node<A>, mut right: Node<A>) -> Node<A> {
+ let mut keys = left.keys;
+ keys.push_back(middle);
+ keys.append(&mut right.keys);
+ let mut children = left.children;
+ children.append(&mut right.children);
+ Node { keys, children }
+ }
+
+ fn pop_min(&mut self) -> (A, Option<PoolRef<Node<A>>>) {
+ let value = self.keys.pop_front();
+ let child = self.children.pop_front();
+ (value, child)
+ }
+
+ fn pop_max(&mut self) -> (A, Option<PoolRef<Node<A>>>) {
+ let value = self.keys.pop_back();
+ let child = self.children.pop_back();
+ (value, child)
+ }
+
+ fn push_min(&mut self, child: Option<PoolRef<Node<A>>>, value: A) {
+ self.keys.push_front(value);
+ self.children.push_front(child);
+ }
+
+ fn push_max(&mut self, child: Option<PoolRef<Node<A>>>, value: A) {
+ self.keys.push_back(value);
+ self.children.push_back(child);
+ }
+
+ pub(crate) fn insert(&mut self, pool: &Pool<Node<A>>, value: A) -> Insert<A>
+ where
+ A: Clone,
+ {
+ if self.keys.is_empty() {
+ self.keys.push_back(value);
+ self.children.push_back(None);
+ return Insert::Added;
+ }
+ let (median, left, right) = match A::search_value(&self.keys, &value) {
+ // Key exists in node
+ Ok(index) => {
+ return Insert::Replaced(mem::replace(&mut self.keys[index], value));
+ }
+ // Key is adjacent to some key in node
+ Err(index) => {
+ let has_room = self.has_room();
+ let action = match self.children[index] {
+ // No child at location, this is the target node.
+ None => InsertAt,
+ // Child at location, pass it on.
+ Some(ref mut child_ref) => {
+ let child = PoolRef::make_mut(pool, child_ref);
+ match child.insert(pool, value.clone()) {
+ Insert::Added => AddedAction,
+ Insert::Replaced(value) => ReplacedAction(value),
+ Insert::Split(left, median, right) => InsertSplit(left, median, right),
+ }
+ }
+ };
+ match action {
+ ReplacedAction(value) => return Insert::Replaced(value),
+ AddedAction => {
+ return Insert::Added;
+ }
+ InsertAt => {
+ if has_room {
+ self.keys.insert(index, value);
+ self.children.insert(index + 1, None);
+ return Insert::Added;
+ } else {
+ (value, None, None)
+ }
+ }
+ InsertSplit(left, median, right) => {
+ if has_room {
+ self.children[index] = Some(PoolRef::new(pool, left));
+ self.keys.insert(index, median);
+ self.children
+ .insert(index + 1, Some(PoolRef::new(pool, right)));
+ return Insert::Added;
+ } else {
+ (median, Some(left), Some(right))
+ }
+ }
+ }
+ }
+ };
+ self.split(pool, median, left, right)
+ }
+
+ pub(crate) fn remove<BK>(&mut self, pool: &Pool<Node<A>>, key: &BK) -> Remove<A>
+ where
+ A: Clone,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ let index = A::search_key(&self.keys, key);
+ self.remove_index(pool, index, Ok(key))
+ }
+
+ fn remove_target<BK>(
+ &mut self,
+ pool: &Pool<Node<A>>,
+ target: Result<&BK, Boundary>,
+ ) -> Remove<A>
+ where
+ A: Clone,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ let index = match target {
+ Ok(key) => A::search_key(&self.keys, key),
+ Err(Boundary::Lowest) => Err(0),
+ Err(Boundary::Highest) => Err(self.keys.len()),
+ };
+ self.remove_index(pool, index, target)
+ }
+
+ fn remove_index<BK>(
+ &mut self,
+ pool: &Pool<Node<A>>,
+ index: Result<usize, usize>,
+ target: Result<&BK, Boundary>,
+ ) -> Remove<A>
+ where
+ A: Clone,
+ BK: Ord + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ let action = match index {
+ // Key exists in node, remove it.
+ Ok(index) => {
+ match (&self.children[index], &self.children[index + 1]) {
+ // If we're a leaf, just delete the entry.
+ (&None, &None) => RemoveAction::DeleteAt(index),
+ // First consider pulling either predecessor (from left) or successor (from right).
+ // otherwise just merge the two small children.
+ (&Some(ref left), &Some(ref right)) => {
+ if !left.too_small() {
+ RemoveAction::PullUp(Boundary::Highest, index, index)
+ } else if !right.too_small() {
+ RemoveAction::PullUp(Boundary::Lowest, index, index + 1)
+ } else {
+ RemoveAction::Merge(index)
+ }
+ }
+ _ => unreachable!("Branch missing children"),
+ }
+ }
+ // Target is adjacent to some key in node
+ Err(index) => match self.children[index] {
+ // We're deading with a leaf node
+ None => match target {
+ // No child at location means key isn't in map.
+ Ok(_key) => return Remove::NoChange,
+ // Looking for the lowest or highest key
+ Err(Boundary::Lowest) => RemoveAction::DeleteAt(0),
+ Err(Boundary::Highest) => RemoveAction::DeleteAt(self.keys.len() - 1),
+ },
+ // Child at location, but it's at minimum capacity.
+ Some(ref child) if child.too_small() => {
+ let left = if index > 0 {
+ self.children.get(index - 1)
+ } else {
+ None
+ }; // index is usize and can't be negative, best make sure it never is.
+ match (left, self.children.get(index + 1)) {
+ // If it has a left sibling with capacity, steal a key from it.
+ (Some(&Some(ref old_left)), _) if !old_left.too_small() => {
+ RemoveAction::StealFromLeft(index)
+ }
+ // If it has a right sibling with capacity, same as above.
+ (_, Some(&Some(ref old_right))) if !old_right.too_small() => {
+ RemoveAction::StealFromRight(index)
+ }
+ // If it has neither, we'll have to merge it with a sibling.
+ // If we have a right sibling, we'll merge with that.
+ (_, Some(&Some(_))) => RemoveAction::MergeFirst(index),
+ // If we have a left sibling, we'll merge with that.
+ (Some(&Some(_)), _) => RemoveAction::MergeFirst(index - 1),
+ // If none of the above, we're in a bad state.
+ _ => unreachable!(),
+ }
+ }
+ // Child at location, and it's big enough, we can recurse down.
+ Some(_) => RemoveAction::ContinueDown(index),
+ },
+ };
+ match action {
+ RemoveAction::DeleteAt(index) => {
+ let pair = self.keys.remove(index);
+ self.children.remove(index);
+ Remove::Removed(pair)
+ }
+ RemoveAction::PullUp(boundary, pull_to, child_index) => {
+ let children = &mut self.children;
+ let mut update = None;
+ let value;
+ if let Some(&mut Some(ref mut child_ref)) = children.get_mut(child_index) {
+ let child = PoolRef::make_mut(pool, child_ref);
+ match child.remove_target(pool, Err(boundary)) {
+ Remove::NoChange => unreachable!(),
+ Remove::Removed(pulled_value) => {
+ value = self.keys.set(pull_to, pulled_value);
+ }
+ Remove::Update(pulled_value, new_child) => {
+ value = self.keys.set(pull_to, pulled_value);
+ update = Some(new_child);
+ }
+ }
+ } else {
+ unreachable!()
+ }
+ if let Some(new_child) = update {
+ children[child_index] = Some(PoolRef::new(pool, new_child));
+ }
+ Remove::Removed(value)
+ }
+ RemoveAction::Merge(index) => {
+ let left = self.children.remove(index).unwrap();
+ let right = mem::replace(&mut self.children[index], None).unwrap();
+ let value = self.keys.remove(index);
+ let mut merged_child = Node::merge(
+ value,
+ PoolRef::unwrap_or_clone(left),
+ PoolRef::unwrap_or_clone(right),
+ );
+ let (removed, new_child) = match merged_child.remove_target(pool, target) {
+ Remove::NoChange => unreachable!(),
+ Remove::Removed(removed) => (removed, merged_child),
+ Remove::Update(removed, updated_child) => (removed, updated_child),
+ };
+ if self.keys.is_empty() {
+ // If we've depleted the root node, the merged child becomes the root.
+ Remove::Update(removed, new_child)
+ } else {
+ self.children[index] = Some(PoolRef::new(pool, new_child));
+ Remove::Removed(removed)
+ }
+ }
+ RemoveAction::StealFromLeft(index) => {
+ let mut update = None;
+ let out_value;
+ {
+ let mut children = self.children.as_mut_slice()[index - 1..=index]
+ .iter_mut()
+ .map(|n| n.as_mut().unwrap());
+ let left = PoolRef::make_mut(pool, children.next().unwrap());
+ let child = PoolRef::make_mut(pool, children.next().unwrap());
+ // Prepare the rebalanced node.
+ child.push_min(
+ left.children.last().unwrap().clone(),
+ self.keys[index - 1].clone(),
+ );
+ match child.remove_target(pool, target) {
+ Remove::NoChange => {
+ // Key wasn't there, we need to revert the steal.
+ child.pop_min();
+ return Remove::NoChange;
+ }
+ Remove::Removed(value) => {
+ // If we did remove something, we complete the rebalancing.
+ let (left_value, _) = left.pop_max();
+ self.keys[index - 1] = left_value;
+ out_value = value;
+ }
+ Remove::Update(value, new_child) => {
+ // If we did remove something, we complete the rebalancing.
+ let (left_value, _) = left.pop_max();
+ self.keys[index - 1] = left_value;
+ update = Some(new_child);
+ out_value = value;
+ }
+ }
+ }
+ if let Some(new_child) = update {
+ self.children[index] = Some(PoolRef::new(pool, new_child));
+ }
+ Remove::Removed(out_value)
+ }
+ RemoveAction::StealFromRight(index) => {
+ let mut update = None;
+ let out_value;
+ {
+ let mut children = self.children.as_mut_slice()[index..index + 2]
+ .iter_mut()
+ .map(|n| n.as_mut().unwrap());
+ let child = PoolRef::make_mut(pool, children.next().unwrap());
+ let right = PoolRef::make_mut(pool, children.next().unwrap());
+ // Prepare the rebalanced node.
+ child.push_max(right.children[0].clone(), self.keys[index].clone());
+ match child.remove_target(pool, target) {
+ Remove::NoChange => {
+ // Key wasn't there, we need to revert the steal.
+ child.pop_max();
+ return Remove::NoChange;
+ }
+ Remove::Removed(value) => {
+ // If we did remove something, we complete the rebalancing.
+ let (right_value, _) = right.pop_min();
+ self.keys[index] = right_value;
+ out_value = value;
+ }
+ Remove::Update(value, new_child) => {
+ // If we did remove something, we complete the rebalancing.
+ let (right_value, _) = right.pop_min();
+ self.keys[index] = right_value;
+ update = Some(new_child);
+ out_value = value;
+ }
+ }
+ }
+ if let Some(new_child) = update {
+ self.children[index] = Some(PoolRef::new(pool, new_child));
+ }
+ Remove::Removed(out_value)
+ }
+ RemoveAction::MergeFirst(index) => {
+ if let Ok(key) = target {
+ // Bail early if we're looking for a not existing key
+ match self.keys[index].cmp_keys(key) {
+ Ordering::Less if !self.child_contains(index + 1, key) => {
+ return Remove::NoChange
+ }
+ Ordering::Greater if !self.child_contains(index, key) => {
+ return Remove::NoChange
+ }
+ _ => (),
+ }
+ }
+ let left = self.children.remove(index).unwrap();
+ let right = mem::replace(&mut self.children[index], None).unwrap();
+ let middle = self.keys.remove(index);
+ let mut merged = Node::merge(
+ middle,
+ PoolRef::unwrap_or_clone(left),
+ PoolRef::unwrap_or_clone(right),
+ );
+ let update;
+ let out_value;
+ match merged.remove_target(pool, target) {
+ Remove::NoChange => {
+ panic!("nodes::btree::Node::remove: caught an absent key too late while merging");
+ }
+ Remove::Removed(value) => {
+ if self.keys.is_empty() {
+ return Remove::Update(value, merged);
+ }
+ update = merged;
+ out_value = value;
+ }
+ Remove::Update(value, new_child) => {
+ if self.keys.is_empty() {
+ return Remove::Update(value, new_child);
+ }
+ update = new_child;
+ out_value = value;
+ }
+ }
+ self.children[index] = Some(PoolRef::new(pool, update));
+ Remove::Removed(out_value)
+ }
+ RemoveAction::ContinueDown(index) => {
+ let mut update = None;
+ let out_value;
+ if let Some(&mut Some(ref mut child_ref)) = self.children.get_mut(index) {
+ let child = PoolRef::make_mut(pool, child_ref);
+ match child.remove_target(pool, target) {
+ Remove::NoChange => return Remove::NoChange,
+ Remove::Removed(value) => {
+ out_value = value;
+ }
+ Remove::Update(value, new_child) => {
+ update = Some(new_child);
+ out_value = value;
+ }
+ }
+ } else {
+ unreachable!()
+ }
+ if let Some(new_child) = update {
+ self.children[index] = Some(PoolRef::new(pool, new_child));
+ }
+ Remove::Removed(out_value)
+ }
+ }
+ }
+}
+
+// Iterator
+
+/// An iterator over an ordered set.
+pub struct Iter<'a, A> {
+ fwd_path: Vec<(&'a Node<A>, usize)>,
+ back_path: Vec<(&'a Node<A>, usize)>,
+ pub(crate) remaining: usize,
+}
+
+impl<'a, A: BTreeValue> Iter<'a, A> {
+ pub(crate) fn new<R, BK>(root: &'a Node<A>, size: usize, range: R) -> Self
+ where
+ R: RangeBounds<BK>,
+ A::Key: Borrow<BK>,
+ BK: Ord + ?Sized,
+ {
+ let fwd_path = match range.start_bound() {
+ Bound::Included(key) => root.path_next(key, Vec::new()),
+ Bound::Excluded(key) => {
+ let mut path = root.path_next(key, Vec::new());
+ if let Some(value) = Self::get(&path) {
+ if value.cmp_keys(key) == Ordering::Equal {
+ Self::step_forward(&mut path);
+ }
+ }
+ path
+ }
+ Bound::Unbounded => root.path_first(Vec::new()),
+ };
+ let back_path = match range.end_bound() {
+ Bound::Included(key) => root.path_prev(key, Vec::new()),
+ Bound::Excluded(key) => {
+ let mut path = root.path_prev(key, Vec::new());
+ if let Some(value) = Self::get(&path) {
+ if value.cmp_keys(key) == Ordering::Equal {
+ Self::step_back(&mut path);
+ }
+ }
+ path
+ }
+ Bound::Unbounded => root.path_last(Vec::new()),
+ };
+ Iter {
+ fwd_path,
+ back_path,
+ remaining: size,
+ }
+ }
+
+ fn get(path: &[(&'a Node<A>, usize)]) -> Option<&'a A> {
+ match path.last() {
+ Some((node, index)) => Some(&node.keys[*index]),
+ None => None,
+ }
+ }
+
+ fn step_forward(path: &mut Vec<(&'a Node<A>, usize)>) -> Option<&'a A> {
+ match path.pop() {
+ Some((node, index)) => {
+ let index = index + 1;
+ match node.children[index] {
+ // Child between current and next key -> step down
+ Some(ref child) => {
+ path.push((node, index));
+ path.push((child, 0));
+ let mut node = child;
+ while let Some(ref left_child) = node.children[0] {
+ path.push((left_child, 0));
+ node = left_child;
+ }
+ Some(&node.keys[0])
+ }
+ None => match node.keys.get(index) {
+ // Yield next key
+ value @ Some(_) => {
+ path.push((node, index));
+ value
+ }
+ // No more keys -> exhausted level, step up and yield
+ None => loop {
+ match path.pop() {
+ None => {
+ return None;
+ }
+ Some((node, index)) => {
+ if let value @ Some(_) = node.keys.get(index) {
+ path.push((node, index));
+ return value;
+ }
+ }
+ }
+ },
+ },
+ }
+ }
+ None => None,
+ }
+ }
+
+ fn step_back(path: &mut Vec<(&'a Node<A>, usize)>) -> Option<&'a A> {
+ match path.pop() {
+ Some((node, index)) => match node.children[index] {
+ Some(ref child) => {
+ path.push((node, index));
+ let mut end = child.keys.len() - 1;
+ path.push((child, end));
+ let mut node = child;
+ while let Some(ref right_child) = node.children[end + 1] {
+ end = right_child.keys.len() - 1;
+ path.push((right_child, end));
+ node = right_child;
+ }
+ Some(&node.keys[end])
+ }
+ None => {
+ if index == 0 {
+ loop {
+ match path.pop() {
+ None => {
+ return None;
+ }
+ Some((node, index)) => {
+ if index > 0 {
+ let index = index - 1;
+ path.push((node, index));
+ return Some(&node.keys[index]);
+ }
+ }
+ }
+ }
+ } else {
+ let index = index - 1;
+ path.push((node, index));
+ Some(&node.keys[index])
+ }
+ }
+ },
+ None => None,
+ }
+ }
+}
+
+impl<'a, A: 'a + BTreeValue> Iterator for Iter<'a, A> {
+ type Item = &'a A;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ match Iter::get(&self.fwd_path) {
+ None => None,
+ Some(value) => match Iter::get(&self.back_path) {
+ Some(last_value) if value.cmp_values(last_value) == Ordering::Greater => None,
+ None => None,
+ Some(_) => {
+ Iter::step_forward(&mut self.fwd_path);
+ self.remaining -= 1;
+ Some(value)
+ }
+ },
+ }
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ // (0, Some(self.remaining))
+ (0, None)
+ }
+}
+
+impl<'a, A: 'a + BTreeValue> DoubleEndedIterator for Iter<'a, A> {
+ fn next_back(&mut self) -> Option<Self::Item> {
+ match Iter::get(&self.back_path) {
+ None => None,
+ Some(value) => match Iter::get(&self.fwd_path) {
+ Some(last_value) if value.cmp_values(last_value) == Ordering::Less => None,
+ None => None,
+ Some(_) => {
+ Iter::step_back(&mut self.back_path);
+ self.remaining -= 1;
+ Some(value)
+ }
+ },
+ }
+ }
+}
+
+// Consuming iterator
+
+enum ConsumingIterItem<A> {
+ Consider(Node<A>),
+ Yield(A),
+}
+
+/// A consuming iterator over an ordered set.
+pub struct ConsumingIter<A> {
+ fwd_last: Option<A>,
+ fwd_stack: Vec<ConsumingIterItem<A>>,
+ back_last: Option<A>,
+ back_stack: Vec<ConsumingIterItem<A>>,
+ remaining: usize,
+}
+
+impl<A: Clone> ConsumingIter<A> {
+ pub(crate) fn new(root: &Node<A>, total: usize) -> Self {
+ ConsumingIter {
+ fwd_last: None,
+ fwd_stack: vec![ConsumingIterItem::Consider(root.clone())],
+ back_last: None,
+ back_stack: vec![ConsumingIterItem::Consider(root.clone())],
+ remaining: total,
+ }
+ }
+
+ fn push_node(stack: &mut Vec<ConsumingIterItem<A>>, maybe_node: Option<PoolRef<Node<A>>>) {
+ if let Some(node) = maybe_node {
+ stack.push(ConsumingIterItem::Consider(PoolRef::unwrap_or_clone(node)))
+ }
+ }
+
+ fn push(stack: &mut Vec<ConsumingIterItem<A>>, mut node: Node<A>) {
+ for _n in 0..node.keys.len() {
+ ConsumingIter::push_node(stack, node.children.pop_back());
+ stack.push(ConsumingIterItem::Yield(node.keys.pop_back()));
+ }
+ ConsumingIter::push_node(stack, node.children.pop_back());
+ }
+
+ fn push_fwd(&mut self, node: Node<A>) {
+ ConsumingIter::push(&mut self.fwd_stack, node)
+ }
+
+ fn push_node_back(&mut self, maybe_node: Option<PoolRef<Node<A>>>) {
+ if let Some(node) = maybe_node {
+ self.back_stack
+ .push(ConsumingIterItem::Consider(PoolRef::unwrap_or_clone(node)))
+ }
+ }
+
+ fn push_back(&mut self, mut node: Node<A>) {
+ for _i in 0..node.keys.len() {
+ self.push_node_back(node.children.pop_front());
+ self.back_stack
+ .push(ConsumingIterItem::Yield(node.keys.pop_front()));
+ }
+ self.push_node_back(node.children.pop_back());
+ }
+}
+
+impl<A> Iterator for ConsumingIter<A>
+where
+ A: BTreeValue + Clone,
+{
+ type Item = A;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ loop {
+ match self.fwd_stack.pop() {
+ None => {
+ self.remaining = 0;
+ return None;
+ }
+ Some(ConsumingIterItem::Consider(node)) => self.push_fwd(node),
+ Some(ConsumingIterItem::Yield(value)) => {
+ if let Some(ref last) = self.back_last {
+ if value.cmp_values(last) != Ordering::Less {
+ self.fwd_stack.clear();
+ self.back_stack.clear();
+ self.remaining = 0;
+ return None;
+ }
+ }
+ self.remaining -= 1;
+ self.fwd_last = Some(value.clone());
+ return Some(value);
+ }
+ }
+ }
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (self.remaining, Some(self.remaining))
+ }
+}
+
+impl<A> DoubleEndedIterator for ConsumingIter<A>
+where
+ A: BTreeValue + Clone,
+{
+ fn next_back(&mut self) -> Option<Self::Item> {
+ loop {
+ match self.back_stack.pop() {
+ None => {
+ self.remaining = 0;
+ return None;
+ }
+ Some(ConsumingIterItem::Consider(node)) => self.push_back(node),
+ Some(ConsumingIterItem::Yield(value)) => {
+ if let Some(ref last) = self.fwd_last {
+ if value.cmp_values(last) != Ordering::Greater {
+ self.fwd_stack.clear();
+ self.back_stack.clear();
+ self.remaining = 0;
+ return None;
+ }
+ }
+ self.remaining -= 1;
+ self.back_last = Some(value.clone());
+ return Some(value);
+ }
+ }
+ }
+ }
+}
+
+impl<A: BTreeValue + Clone> ExactSizeIterator for ConsumingIter<A> {}
+
+// DiffIter
+
+/// An iterator over the differences between two ordered sets.
+pub struct DiffIter<'a, A> {
+ old_stack: Vec<IterItem<'a, A>>,
+ new_stack: Vec<IterItem<'a, A>>,
+}
+
+/// A description of a difference between two ordered sets.
+#[derive(PartialEq, Eq, Debug)]
+pub enum DiffItem<'a, A> {
+ /// This value has been added to the new set.
+ Add(&'a A),
+ /// This value has been changed between the two sets.
+ Update {
+ /// The old value.
+ old: &'a A,
+ /// The new value.
+ new: &'a A,
+ },
+ /// This value has been removed from the new set.
+ Remove(&'a A),
+}
+
+enum IterItem<'a, A> {
+ Consider(&'a Node<A>),
+ Yield(&'a A),
+}
+
+impl<'a, A: 'a> DiffIter<'a, A> {
+ pub(crate) fn new(old: &'a Node<A>, new: &'a Node<A>) -> Self {
+ DiffIter {
+ old_stack: if old.keys.is_empty() {
+ Vec::new()
+ } else {
+ vec![IterItem::Consider(old)]
+ },
+ new_stack: if new.keys.is_empty() {
+ Vec::new()
+ } else {
+ vec![IterItem::Consider(new)]
+ },
+ }
+ }
+
+ fn push_node(stack: &mut Vec<IterItem<'a, A>>, maybe_node: &'a Option<PoolRef<Node<A>>>) {
+ if let Some(ref node) = *maybe_node {
+ stack.push(IterItem::Consider(node))
+ }
+ }
+
+ fn push(stack: &mut Vec<IterItem<'a, A>>, node: &'a Node<A>) {
+ for n in 0..node.keys.len() {
+ let i = node.keys.len() - n;
+ Self::push_node(stack, &node.children[i]);
+ stack.push(IterItem::Yield(&node.keys[i - 1]));
+ }
+ Self::push_node(stack, &node.children[0]);
+ }
+}
+
+impl<'a, A> Iterator for DiffIter<'a, A>
+where
+ A: 'a + BTreeValue + PartialEq,
+{
+ type Item = DiffItem<'a, A>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ loop {
+ match (self.old_stack.pop(), self.new_stack.pop()) {
+ (None, None) => return None,
+ (None, Some(new)) => match new {
+ IterItem::Consider(new) => Self::push(&mut self.new_stack, new),
+ IterItem::Yield(new) => return Some(DiffItem::Add(new)),
+ },
+ (Some(old), None) => match old {
+ IterItem::Consider(old) => Self::push(&mut self.old_stack, old),
+ IterItem::Yield(old) => return Some(DiffItem::Remove(old)),
+ },
+ (Some(old), Some(new)) => match (old, new) {
+ (IterItem::Consider(old), IterItem::Consider(new)) => {
+ if !std::ptr::eq(old, new) {
+ match old.keys[0].cmp_values(&new.keys[0]) {
+ Ordering::Less => {
+ Self::push(&mut self.old_stack, old);
+ self.new_stack.push(IterItem::Consider(new));
+ }
+ Ordering::Greater => {
+ self.old_stack.push(IterItem::Consider(old));
+ Self::push(&mut self.new_stack, new);
+ }
+ Ordering::Equal => {
+ Self::push(&mut self.old_stack, old);
+ Self::push(&mut self.new_stack, new);
+ }
+ }
+ }
+ }
+ (IterItem::Consider(old), IterItem::Yield(new)) => {
+ Self::push(&mut self.old_stack, old);
+ self.new_stack.push(IterItem::Yield(new));
+ }
+ (IterItem::Yield(old), IterItem::Consider(new)) => {
+ self.old_stack.push(IterItem::Yield(old));
+ Self::push(&mut self.new_stack, new);
+ }
+ (IterItem::Yield(old), IterItem::Yield(new)) => match old.cmp_values(new) {
+ Ordering::Less => {
+ self.new_stack.push(IterItem::Yield(new));
+ return Some(DiffItem::Remove(old));
+ }
+ Ordering::Equal => {
+ if old != new {
+ return Some(DiffItem::Update { old, new });
+ }
+ }
+ Ordering::Greater => {
+ self.old_stack.push(IterItem::Yield(old));
+ return Some(DiffItem::Add(new));
+ }
+ },
+ },
+ }
+ }
+ }
+}
diff --git a/vendor/im-rc/src/nodes/hamt.rs b/vendor/im-rc/src/nodes/hamt.rs
new file mode 100644
index 0000000..945068b
--- /dev/null
+++ b/vendor/im-rc/src/nodes/hamt.rs
@@ -0,0 +1,726 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use std::borrow::Borrow;
+use std::fmt;
+use std::hash::{BuildHasher, Hash, Hasher};
+use std::iter::FusedIterator;
+use std::slice::{Iter as SliceIter, IterMut as SliceIterMut};
+use std::{mem, ptr};
+
+use bitmaps::Bits;
+use sized_chunks::sparse_chunk::{Iter as ChunkIter, IterMut as ChunkIterMut, SparseChunk};
+use typenum::{Pow, Unsigned, U2};
+
+use crate::config::HashLevelSize;
+use crate::util::{clone_ref, Pool, PoolClone, PoolDefault, PoolRef, Ref};
+
+pub(crate) type HashWidth = <U2 as Pow<HashLevelSize>>::Output;
+pub(crate) type HashBits = <HashWidth as Bits>::Store; // a uint of HASH_SIZE bits
+pub(crate) const HASH_SHIFT: usize = HashLevelSize::USIZE;
+pub(crate) const HASH_WIDTH: usize = HashWidth::USIZE;
+pub(crate) const HASH_MASK: HashBits = (HASH_WIDTH - 1) as HashBits;
+
+pub(crate) fn hash_key<K: Hash + ?Sized, S: BuildHasher>(bh: &S, key: &K) -> HashBits {
+ let mut hasher = bh.build_hasher();
+ key.hash(&mut hasher);
+ hasher.finish() as HashBits
+}
+
+#[inline]
+fn mask(hash: HashBits, shift: usize) -> HashBits {
+ hash >> shift & HASH_MASK
+}
+
+pub trait HashValue {
+ type Key: Eq;
+
+ fn extract_key(&self) -> &Self::Key;
+ fn ptr_eq(&self, other: &Self) -> bool;
+}
+
+#[derive(Clone)]
+pub(crate) struct Node<A> {
+ data: SparseChunk<Entry<A>, HashWidth>,
+}
+
+#[allow(unsafe_code)]
+impl<A> PoolDefault for Node<A> {
+ #[cfg(feature = "pool")]
+ unsafe fn default_uninit(target: &mut mem::MaybeUninit<Self>) {
+ SparseChunk::default_uninit(
+ target
+ .as_mut_ptr()
+ .cast::<mem::MaybeUninit<SparseChunk<Entry<A>, HashWidth>>>()
+ .as_mut()
+ .unwrap(),
+ )
+ }
+}
+
+#[allow(unsafe_code)]
+impl<A> PoolClone for Node<A>
+where
+ A: Clone,
+{
+ #[cfg(feature = "pool")]
+ unsafe fn clone_uninit(&self, target: &mut mem::MaybeUninit<Self>) {
+ self.data.clone_uninit(
+ target
+ .as_mut_ptr()
+ .cast::<mem::MaybeUninit<SparseChunk<Entry<A>, HashWidth>>>()
+ .as_mut()
+ .unwrap(),
+ )
+ }
+}
+
+#[derive(Clone)]
+pub(crate) struct CollisionNode<A> {
+ hash: HashBits,
+ data: Vec<A>,
+}
+
+pub(crate) enum Entry<A> {
+ Value(A, HashBits),
+ Collision(Ref<CollisionNode<A>>),
+ Node(PoolRef<Node<A>>),
+}
+
+impl<A: Clone> Clone for Entry<A> {
+ fn clone(&self) -> Self {
+ match self {
+ Entry::Value(value, hash) => Entry::Value(value.clone(), *hash),
+ Entry::Collision(coll) => Entry::Collision(coll.clone()),
+ Entry::Node(node) => Entry::Node(node.clone()),
+ }
+ }
+}
+
+impl<A> Entry<A> {
+ fn is_value(&self) -> bool {
+ matches!(self, Entry::Value(_, _))
+ }
+
+ fn unwrap_value(self) -> A {
+ match self {
+ Entry::Value(a, _) => a,
+ _ => panic!("nodes::hamt::Entry::unwrap_value: unwrapped a non-value"),
+ }
+ }
+
+ fn from_node(pool: &Pool<Node<A>>, node: Node<A>) -> Self {
+ Entry::Node(PoolRef::new(pool, node))
+ }
+}
+
+impl<A> From<CollisionNode<A>> for Entry<A> {
+ fn from(node: CollisionNode<A>) -> Self {
+ Entry::Collision(Ref::new(node))
+ }
+}
+
+impl<A> Default for Node<A> {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl<A> Node<A> {
+ #[inline]
+ pub(crate) fn new() -> Self {
+ Node {
+ data: SparseChunk::new(),
+ }
+ }
+
+ #[inline]
+ fn len(&self) -> usize {
+ self.data.len()
+ }
+
+ #[inline]
+ pub(crate) fn unit(index: usize, value: Entry<A>) -> Self {
+ Node {
+ data: SparseChunk::unit(index, value),
+ }
+ }
+
+ #[inline]
+ pub(crate) fn pair(index1: usize, value1: Entry<A>, index2: usize, value2: Entry<A>) -> Self {
+ Node {
+ data: SparseChunk::pair(index1, value1, index2, value2),
+ }
+ }
+
+ #[inline]
+ pub(crate) fn single_child(pool: &Pool<Node<A>>, index: usize, node: Self) -> Self {
+ Node {
+ data: SparseChunk::unit(index, Entry::from_node(pool, node)),
+ }
+ }
+
+ fn pop(&mut self) -> Entry<A> {
+ self.data.pop().unwrap()
+ }
+}
+
+impl<A: HashValue> Node<A> {
+ fn merge_values(
+ pool: &Pool<Node<A>>,
+ value1: A,
+ hash1: HashBits,
+ value2: A,
+ hash2: HashBits,
+ shift: usize,
+ ) -> Self {
+ let index1 = mask(hash1, shift) as usize;
+ let index2 = mask(hash2, shift) as usize;
+ if index1 != index2 {
+ // Both values fit on the same level.
+ Node::pair(
+ index1,
+ Entry::Value(value1, hash1),
+ index2,
+ Entry::Value(value2, hash2),
+ )
+ } else if shift + HASH_SHIFT >= HASH_WIDTH {
+ // If we're at the bottom, we've got a collision.
+ Node::unit(
+ index1,
+ Entry::from(CollisionNode::new(hash1, value1, value2)),
+ )
+ } else {
+ // Pass the values down a level.
+ let node = Node::merge_values(pool, value1, hash1, value2, hash2, shift + HASH_SHIFT);
+ Node::single_child(pool, index1, node)
+ }
+ }
+
+ pub(crate) fn get<BK>(&self, hash: HashBits, shift: usize, key: &BK) -> Option<&A>
+ where
+ BK: Eq + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ let index = mask(hash, shift) as usize;
+ if let Some(entry) = self.data.get(index) {
+ match entry {
+ Entry::Value(ref value, _) => {
+ if key == value.extract_key().borrow() {
+ Some(value)
+ } else {
+ None
+ }
+ }
+ Entry::Collision(ref coll) => coll.get(key),
+ Entry::Node(ref child) => child.get(hash, shift + HASH_SHIFT, key),
+ }
+ } else {
+ None
+ }
+ }
+
+ pub(crate) fn get_mut<BK>(
+ &mut self,
+ pool: &Pool<Node<A>>,
+ hash: HashBits,
+ shift: usize,
+ key: &BK,
+ ) -> Option<&mut A>
+ where
+ A: Clone,
+ BK: Eq + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ let index = mask(hash, shift) as usize;
+ if let Some(entry) = self.data.get_mut(index) {
+ match entry {
+ Entry::Value(ref mut value, _) => {
+ if key == value.extract_key().borrow() {
+ Some(value)
+ } else {
+ None
+ }
+ }
+ Entry::Collision(ref mut coll_ref) => {
+ let coll = Ref::make_mut(coll_ref);
+ coll.get_mut(key)
+ }
+ Entry::Node(ref mut child_ref) => {
+ let child = PoolRef::make_mut(pool, child_ref);
+ child.get_mut(pool, hash, shift + HASH_SHIFT, key)
+ }
+ }
+ } else {
+ None
+ }
+ }
+
+ pub(crate) fn insert(
+ &mut self,
+ pool: &Pool<Node<A>>,
+ hash: HashBits,
+ shift: usize,
+ value: A,
+ ) -> Option<A>
+ where
+ A: Clone,
+ {
+ let index = mask(hash, shift) as usize;
+ if let Some(entry) = self.data.get_mut(index) {
+ let mut fallthrough = false;
+ // Value is here
+ match entry {
+ // Update value or create a subtree
+ Entry::Value(ref current, _) => {
+ if current.extract_key() == value.extract_key() {
+ // If we have a key match, fall through to the outer
+ // level where we replace the current value. If we
+ // don't, fall through to the inner level where we merge
+ // some nodes.
+ fallthrough = true;
+ }
+ }
+ // There's already a collision here.
+ Entry::Collision(ref mut collision) => {
+ let coll = Ref::make_mut(collision);
+ return coll.insert(value);
+ }
+ Entry::Node(ref mut child_ref) => {
+ // Child node
+ let child = PoolRef::make_mut(pool, child_ref);
+ return child.insert(pool, hash, shift + HASH_SHIFT, value);
+ }
+ }
+ if !fallthrough {
+ // If we get here, we're looking at a value entry that needs a merge.
+ // We're going to be unsafe and pry it out of the reference, trusting
+ // that we overwrite it with the merged node.
+ #[allow(unsafe_code)]
+ let old_entry = unsafe { ptr::read(entry) };
+ if shift + HASH_SHIFT >= HASH_WIDTH {
+ // We're at the lowest level, need to set up a collision node.
+ let coll = CollisionNode::new(hash, old_entry.unwrap_value(), value);
+ #[allow(unsafe_code)]
+ unsafe {
+ ptr::write(entry, Entry::from(coll))
+ };
+ } else if let Entry::Value(old_value, old_hash) = old_entry {
+ let node = Node::merge_values(
+ pool,
+ old_value,
+ old_hash,
+ value,
+ hash,
+ shift + HASH_SHIFT,
+ );
+ #[allow(unsafe_code)]
+ unsafe {
+ ptr::write(entry, Entry::from_node(pool, node))
+ };
+ } else {
+ unreachable!()
+ }
+ return None;
+ }
+ }
+ // If we get here, either we found nothing at this index, in which case
+ // we insert a new entry, or we hit a value entry with the same key, in
+ // which case we replace it.
+ self.data
+ .insert(index, Entry::Value(value, hash))
+ .map(Entry::unwrap_value)
+ }
+
+ pub(crate) fn remove<BK>(
+ &mut self,
+ pool: &Pool<Node<A>>,
+ hash: HashBits,
+ shift: usize,
+ key: &BK,
+ ) -> Option<A>
+ where
+ A: Clone,
+ BK: Eq + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ let index = mask(hash, shift) as usize;
+ let mut new_node = None;
+ let mut removed = None;
+ if let Some(entry) = self.data.get_mut(index) {
+ match entry {
+ Entry::Value(ref value, _) => {
+ if key != value.extract_key().borrow() {
+ // Key wasn't in the map.
+ return None;
+ } // Otherwise, fall through to the removal.
+ }
+ Entry::Collision(ref mut coll_ref) => {
+ let coll = Ref::make_mut(coll_ref);
+ removed = coll.remove(key);
+ if coll.len() == 1 {
+ new_node = Some(coll.pop());
+ } else {
+ return removed;
+ }
+ }
+ Entry::Node(ref mut child_ref) => {
+ let child = PoolRef::make_mut(pool, child_ref);
+ match child.remove(pool, hash, shift + HASH_SHIFT, key) {
+ None => {
+ return None;
+ }
+ Some(value) => {
+ if child.len() == 1
+ && child.data[child.data.first_index().unwrap()].is_value()
+ {
+ // If the child now contains only a single value node,
+ // pull it up one level and discard the child.
+ removed = Some(value);
+ new_node = Some(child.pop());
+ } else {
+ return Some(value);
+ }
+ }
+ }
+ }
+ }
+ }
+ if let Some(node) = new_node {
+ self.data.insert(index, node);
+ return removed;
+ }
+ self.data.remove(index).map(Entry::unwrap_value)
+ }
+}
+
+impl<A: HashValue> CollisionNode<A> {
+ fn new(hash: HashBits, value1: A, value2: A) -> Self {
+ CollisionNode {
+ hash,
+ data: vec![value1, value2],
+ }
+ }
+
+ #[inline]
+ fn len(&self) -> usize {
+ self.data.len()
+ }
+
+ fn get<BK>(&self, key: &BK) -> Option<&A>
+ where
+ BK: Eq + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ for entry in &self.data {
+ if key == entry.extract_key().borrow() {
+ return Some(entry);
+ }
+ }
+ None
+ }
+
+ fn get_mut<BK>(&mut self, key: &BK) -> Option<&mut A>
+ where
+ BK: Eq + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ for entry in &mut self.data {
+ if key == entry.extract_key().borrow() {
+ return Some(entry);
+ }
+ }
+ None
+ }
+
+ fn insert(&mut self, value: A) -> Option<A> {
+ for item in &mut self.data {
+ if value.extract_key() == item.extract_key() {
+ return Some(mem::replace(item, value));
+ }
+ }
+ self.data.push(value);
+ None
+ }
+
+ fn remove<BK>(&mut self, key: &BK) -> Option<A>
+ where
+ BK: Eq + ?Sized,
+ A::Key: Borrow<BK>,
+ {
+ let mut loc = None;
+ for (index, item) in self.data.iter().enumerate() {
+ if key == item.extract_key().borrow() {
+ loc = Some(index);
+ }
+ }
+ if let Some(index) = loc {
+ Some(self.data.remove(index))
+ } else {
+ None
+ }
+ }
+
+ fn pop(&mut self) -> Entry<A> {
+ Entry::Value(self.data.pop().unwrap(), self.hash)
+ }
+}
+
+// Ref iterator
+
+pub(crate) struct Iter<'a, A> {
+ count: usize,
+ stack: Vec<ChunkIter<'a, Entry<A>, HashWidth>>,
+ current: ChunkIter<'a, Entry<A>, HashWidth>,
+ collision: Option<(HashBits, SliceIter<'a, A>)>,
+}
+
+impl<'a, A> Iter<'a, A>
+where
+ A: 'a,
+{
+ pub(crate) fn new(root: &'a Node<A>, size: usize) -> Self {
+ Iter {
+ count: size,
+ stack: Vec::with_capacity((HASH_WIDTH / HASH_SHIFT) + 1),
+ current: root.data.iter(),
+ collision: None,
+ }
+ }
+}
+
+impl<'a, A> Iterator for Iter<'a, A>
+where
+ A: 'a,
+{
+ type Item = (&'a A, HashBits);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.count == 0 {
+ return None;
+ }
+ if self.collision.is_some() {
+ if let Some((hash, ref mut coll)) = self.collision {
+ match coll.next() {
+ None => {}
+ Some(value) => {
+ self.count -= 1;
+ return Some((value, hash));
+ }
+ }
+ }
+ self.collision = None;
+ return self.next();
+ }
+ match self.current.next() {
+ Some(Entry::Value(value, hash)) => {
+ self.count -= 1;
+ Some((value, *hash))
+ }
+ Some(Entry::Node(child)) => {
+ let current = mem::replace(&mut self.current, child.data.iter());
+ self.stack.push(current);
+ self.next()
+ }
+ Some(Entry::Collision(coll)) => {
+ self.collision = Some((coll.hash, coll.data.iter()));
+ self.next()
+ }
+ None => match self.stack.pop() {
+ None => None,
+ Some(iter) => {
+ self.current = iter;
+ self.next()
+ }
+ },
+ }
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (self.count, Some(self.count))
+ }
+}
+
+impl<'a, A> ExactSizeIterator for Iter<'a, A> where A: 'a {}
+
+impl<'a, A> FusedIterator for Iter<'a, A> where A: 'a {}
+
+// Mut ref iterator
+
+pub(crate) struct IterMut<'a, A> {
+ count: usize,
+ pool: Pool<Node<A>>,
+ stack: Vec<ChunkIterMut<'a, Entry<A>, HashWidth>>,
+ current: ChunkIterMut<'a, Entry<A>, HashWidth>,
+ collision: Option<(HashBits, SliceIterMut<'a, A>)>,
+}
+
+impl<'a, A> IterMut<'a, A>
+where
+ A: 'a,
+{
+ pub(crate) fn new(pool: &Pool<Node<A>>, root: &'a mut Node<A>, size: usize) -> Self {
+ IterMut {
+ count: size,
+ pool: pool.clone(),
+ stack: Vec::with_capacity((HASH_WIDTH / HASH_SHIFT) + 1),
+ current: root.data.iter_mut(),
+ collision: None,
+ }
+ }
+}
+
+impl<'a, A> Iterator for IterMut<'a, A>
+where
+ A: Clone + 'a,
+{
+ type Item = (&'a mut A, HashBits);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.count == 0 {
+ return None;
+ }
+ if self.collision.is_some() {
+ if let Some((hash, ref mut coll)) = self.collision {
+ match coll.next() {
+ None => {}
+ Some(value) => {
+ self.count -= 1;
+ return Some((value, hash));
+ }
+ }
+ }
+ self.collision = None;
+ return self.next();
+ }
+ match self.current.next() {
+ Some(Entry::Value(value, hash)) => {
+ self.count -= 1;
+ Some((value, *hash))
+ }
+ Some(Entry::Node(child_ref)) => {
+ let child = PoolRef::make_mut(&self.pool, child_ref);
+ let current = mem::replace(&mut self.current, child.data.iter_mut());
+ self.stack.push(current);
+ self.next()
+ }
+ Some(Entry::Collision(coll_ref)) => {
+ let coll = Ref::make_mut(coll_ref);
+ self.collision = Some((coll.hash, coll.data.iter_mut()));
+ self.next()
+ }
+ None => match self.stack.pop() {
+ None => None,
+ Some(iter) => {
+ self.current = iter;
+ self.next()
+ }
+ },
+ }
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (self.count, Some(self.count))
+ }
+}
+
+impl<'a, A> ExactSizeIterator for IterMut<'a, A> where A: Clone + 'a {}
+
+impl<'a, A> FusedIterator for IterMut<'a, A> where A: Clone + 'a {}
+
+// Consuming iterator
+
+pub(crate) struct Drain<A>
+where
+ A: HashValue,
+{
+ count: usize,
+ pool: Pool<Node<A>>,
+ stack: Vec<PoolRef<Node<A>>>,
+ current: PoolRef<Node<A>>,
+ collision: Option<CollisionNode<A>>,
+}
+
+impl<A> Drain<A>
+where
+ A: HashValue,
+{
+ pub(crate) fn new(pool: &Pool<Node<A>>, root: PoolRef<Node<A>>, size: usize) -> Self {
+ Drain {
+ count: size,
+ pool: pool.clone(),
+ stack: vec![],
+ current: root,
+ collision: None,
+ }
+ }
+}
+
+impl<A> Iterator for Drain<A>
+where
+ A: HashValue + Clone,
+{
+ type Item = (A, HashBits);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.count == 0 {
+ return None;
+ }
+ if self.collision.is_some() {
+ if let Some(ref mut coll) = self.collision {
+ if let Some(value) = coll.data.pop() {
+ self.count -= 1;
+ return Some((value, coll.hash));
+ }
+ }
+ self.collision = None;
+ return self.next();
+ }
+ match PoolRef::make_mut(&self.pool, &mut self.current).data.pop() {
+ Some(Entry::Value(value, hash)) => {
+ self.count -= 1;
+ Some((value, hash))
+ }
+ Some(Entry::Collision(coll_ref)) => {
+ self.collision = Some(clone_ref(coll_ref));
+ self.next()
+ }
+ Some(Entry::Node(child)) => {
+ let parent = mem::replace(&mut self.current, child);
+ self.stack.push(parent);
+ self.next()
+ }
+ None => match self.stack.pop() {
+ None => None,
+ Some(parent) => {
+ self.current = parent;
+ self.next()
+ }
+ },
+ }
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (self.count, Some(self.count))
+ }
+}
+
+impl<A: HashValue> ExactSizeIterator for Drain<A> where A: Clone {}
+
+impl<A: HashValue> FusedIterator for Drain<A> where A: Clone {}
+
+impl<A: HashValue + fmt::Debug> fmt::Debug for Node<A> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
+ write!(f, "Node[ ")?;
+ for i in self.data.indices() {
+ write!(f, "{}: ", i)?;
+ match &self.data[i] {
+ Entry::Value(v, h) => write!(f, "{:?} :: {}, ", v, h)?,
+ Entry::Collision(c) => write!(f, "Coll{:?} :: {}", c.data, c.hash)?,
+ Entry::Node(n) => write!(f, "{:?}, ", n)?,
+ }
+ }
+ write!(f, " ]")
+ }
+}
diff --git a/vendor/im-rc/src/nodes/mod.rs b/vendor/im-rc/src/nodes/mod.rs
new file mode 100644
index 0000000..24e7455
--- /dev/null
+++ b/vendor/im-rc/src/nodes/mod.rs
@@ -0,0 +1,16 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+pub(crate) mod btree;
+pub(crate) mod hamt;
+pub(crate) mod rrb;
+
+pub(crate) mod chunk {
+ use crate::config::VectorChunkSize;
+ use sized_chunks as sc;
+ use typenum::Unsigned;
+
+ pub(crate) type Chunk<A> = sc::sized_chunk::Chunk<A, VectorChunkSize>;
+ pub(crate) const CHUNK_SIZE: usize = VectorChunkSize::USIZE;
+}
diff --git a/vendor/im-rc/src/nodes/rrb.rs b/vendor/im-rc/src/nodes/rrb.rs
new file mode 100644
index 0000000..8809b84
--- /dev/null
+++ b/vendor/im-rc/src/nodes/rrb.rs
@@ -0,0 +1,1101 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use std::mem::replace;
+use std::ops::Range;
+
+use crate::nodes::chunk::{Chunk, CHUNK_SIZE};
+use crate::util::{
+ Pool, PoolRef,
+ Side::{self, Left, Right},
+};
+use crate::vector::RRBPool;
+
+use self::Entry::*;
+
+pub(crate) const NODE_SIZE: usize = CHUNK_SIZE;
+
+#[derive(Debug)]
+enum Size {
+ Size(usize),
+ Table(PoolRef<Chunk<usize>>),
+}
+
+impl Clone for Size {
+ fn clone(&self) -> Self {
+ match *self {
+ Size::Size(size) => Size::Size(size),
+ Size::Table(ref table) => Size::Table(table.clone()),
+ }
+ }
+}
+
+impl Size {
+ fn size(&self) -> usize {
+ match self {
+ Size::Size(s) => *s,
+ Size::Table(sizes) => *sizes.last().unwrap_or(&0),
+ }
+ }
+
+ fn is_size(&self) -> bool {
+ match self {
+ Size::Size(_) => true,
+ Size::Table(_) => false,
+ }
+ }
+
+ fn table_from_size(pool: &Pool<Chunk<usize>>, level: usize, size: usize) -> Self {
+ let mut chunk = Chunk::new();
+ let mut remaining = size;
+ if let Some(child_size) = NODE_SIZE.checked_pow(level as u32) {
+ while remaining > child_size {
+ let next_value = chunk.last().unwrap_or(&0) + child_size;
+ chunk.push_back(next_value);
+ remaining -= child_size;
+ }
+ }
+ if remaining > 0 {
+ let next_value = chunk.last().unwrap_or(&0) + remaining;
+ chunk.push_back(next_value);
+ }
+ Size::Table(PoolRef::new(pool, chunk))
+ }
+
+ fn push(&mut self, pool: &Pool<Chunk<usize>>, side: Side, level: usize, value: usize) {
+ let size = match self {
+ Size::Size(ref mut size) => match side {
+ Left => *size,
+ Right => {
+ *size += value;
+ return;
+ }
+ },
+ Size::Table(ref mut size_ref) => {
+ let size_table = PoolRef::make_mut(pool, size_ref);
+ debug_assert!(size_table.len() < NODE_SIZE);
+ match side {
+ Left => {
+ for entry in size_table.iter_mut() {
+ *entry += value;
+ }
+ size_table.push_front(value);
+ }
+ Right => {
+ let prev = *(size_table.last().unwrap_or(&0));
+ size_table.push_back(value + prev);
+ }
+ }
+ return;
+ }
+ };
+ *self = Size::table_from_size(pool, level, size);
+ self.push(pool, side, level, value);
+ }
+
+ fn pop(&mut self, pool: &Pool<Chunk<usize>>, side: Side, level: usize, value: usize) {
+ let size = match self {
+ Size::Size(ref mut size) => match side {
+ Left => *size,
+ Right => {
+ *size -= value;
+ return;
+ }
+ },
+ Size::Table(ref mut size_ref) => {
+ let size_table = PoolRef::make_mut(pool, size_ref);
+ match side {
+ Left => {
+ let first = size_table.pop_front();
+ debug_assert_eq!(value, first);
+ for entry in size_table.iter_mut() {
+ *entry -= value;
+ }
+ }
+ Right => {
+ let pop = size_table.pop_back();
+ let last = size_table.last().unwrap_or(&0);
+ debug_assert_eq!(value, pop - last);
+ }
+ }
+ return;
+ }
+ };
+ *self = Size::table_from_size(pool, level, size);
+ self.pop(pool, side, level, value);
+ }
+
+ fn update(&mut self, pool: &Pool<Chunk<usize>>, index: usize, level: usize, value: isize) {
+ let size = match self {
+ Size::Size(ref size) => *size,
+ Size::Table(ref mut size_ref) => {
+ let size_table = PoolRef::make_mut(pool, size_ref);
+ for entry in size_table.iter_mut().skip(index) {
+ *entry = (*entry as isize + value) as usize;
+ }
+ return;
+ }
+ };
+ *self = Size::table_from_size(pool, level, size);
+ self.update(pool, index, level, value);
+ }
+}
+
+pub(crate) enum PushResult<A> {
+ Full(A, usize),
+ Done,
+}
+
+pub(crate) enum PopResult<A> {
+ Done(A),
+ Drained(A),
+ Empty,
+}
+
+pub(crate) enum SplitResult {
+ Dropped(usize),
+ OutOfBounds,
+}
+
+// Invariants: Nodes only at level > 0, Values/Empty only at level = 0
+enum Entry<A> {
+ Nodes(Size, PoolRef<Chunk<Node<A>>>),
+ Values(PoolRef<Chunk<A>>),
+ Empty,
+}
+
+impl<A: Clone> Clone for Entry<A> {
+ fn clone(&self) -> Self {
+ match *self {
+ Nodes(ref size, ref nodes) => Nodes(size.clone(), nodes.clone()),
+ Values(ref values) => Values(values.clone()),
+ Empty => Empty,
+ }
+ }
+}
+
+impl<A: Clone> Entry<A> {
+ fn len(&self) -> usize {
+ match self {
+ Nodes(_, ref nodes) => nodes.len(),
+ Values(ref values) => values.len(),
+ Empty => 0,
+ }
+ }
+
+ fn is_full(&self) -> bool {
+ match self {
+ Nodes(_, ref nodes) => nodes.is_full(),
+ Values(ref values) => values.is_full(),
+ Empty => false,
+ }
+ }
+
+ fn unwrap_values(&self) -> &Chunk<A> {
+ match self {
+ Values(ref values) => values,
+ _ => panic!("rrb::Entry::unwrap_values: expected values, found nodes"),
+ }
+ }
+
+ fn unwrap_nodes(&self) -> &Chunk<Node<A>> {
+ match self {
+ Nodes(_, ref nodes) => nodes,
+ _ => panic!("rrb::Entry::unwrap_nodes: expected nodes, found values"),
+ }
+ }
+
+ fn unwrap_values_mut(&mut self, pool: &RRBPool<A>) -> &mut Chunk<A> {
+ match self {
+ Values(ref mut values) => PoolRef::make_mut(&pool.value_pool, values),
+ _ => panic!("rrb::Entry::unwrap_values_mut: expected values, found nodes"),
+ }
+ }
+
+ fn unwrap_nodes_mut(&mut self, pool: &RRBPool<A>) -> &mut Chunk<Node<A>> {
+ match self {
+ Nodes(_, ref mut nodes) => PoolRef::make_mut(&pool.node_pool, nodes),
+ _ => panic!("rrb::Entry::unwrap_nodes_mut: expected nodes, found values"),
+ }
+ }
+
+ fn values(self) -> Chunk<A> {
+ match self {
+ Values(values) => PoolRef::unwrap_or_clone(values),
+ _ => panic!("rrb::Entry::values: expected values, found nodes"),
+ }
+ }
+
+ fn nodes(self) -> Chunk<Node<A>> {
+ match self {
+ Nodes(_, nodes) => PoolRef::unwrap_or_clone(nodes),
+ _ => panic!("rrb::Entry::nodes: expected nodes, found values"),
+ }
+ }
+
+ fn is_empty_node(&self) -> bool {
+ matches!(self, Empty)
+ }
+}
+
+// Node
+
+pub(crate) struct Node<A> {
+ children: Entry<A>,
+}
+
+impl<A: Clone> Clone for Node<A> {
+ fn clone(&self) -> Self {
+ Node {
+ children: self.children.clone(),
+ }
+ }
+}
+
+impl<A: Clone> Default for Node<A> {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl<A: Clone> Node<A> {
+ pub(crate) fn new() -> Self {
+ Node { children: Empty }
+ }
+
+ pub(crate) fn parent(pool: &RRBPool<A>, level: usize, children: Chunk<Self>) -> Self {
+ let size = {
+ let mut size = Size::Size(0);
+ let mut it = children.iter().peekable();
+ loop {
+ match it.next() {
+ None => break,
+ Some(child) => {
+ if size.is_size()
+ && !child.is_completely_dense(level - 1)
+ && it.peek().is_some()
+ {
+ size = Size::table_from_size(&pool.size_pool, level, size.size());
+ }
+ size.push(&pool.size_pool, Right, level, child.len())
+ }
+ }
+ }
+ size
+ };
+ Node {
+ children: Nodes(size, PoolRef::new(&pool.node_pool, children)),
+ }
+ }
+
+ pub(crate) fn clear_node(&mut self) {
+ self.children = Empty;
+ }
+
+ pub(crate) fn from_chunk(pool: &RRBPool<A>, level: usize, chunk: PoolRef<Chunk<A>>) -> Self {
+ let node = Node {
+ children: Values(chunk),
+ };
+ node.elevate(pool, level)
+ }
+
+ pub(crate) fn single_parent(pool: &RRBPool<A>, node: Self) -> Self {
+ let size = if node.is_dense() {
+ Size::Size(node.len())
+ } else {
+ let size_table = Chunk::unit(node.len());
+ Size::Table(PoolRef::new(&pool.size_pool, size_table))
+ };
+ let children = PoolRef::new(&pool.node_pool, Chunk::unit(node));
+ Node {
+ children: Nodes(size, children),
+ }
+ }
+
+ pub(crate) fn join_dense(pool: &RRBPool<A>, left: Self, right: Self) -> Self {
+ let left_len = left.len();
+ let right_len = right.len();
+ Node {
+ children: {
+ let children = PoolRef::new(&pool.node_pool, Chunk::pair(left, right));
+ Nodes(Size::Size(left_len + right_len), children)
+ },
+ }
+ }
+
+ pub(crate) fn elevate(self, pool: &RRBPool<A>, level_increment: usize) -> Self {
+ if level_increment > 0 {
+ Self::single_parent(pool, self.elevate(pool, level_increment - 1))
+ } else {
+ self
+ }
+ }
+
+ pub(crate) fn join_branches(self, pool: &RRBPool<A>, right: Self, level: usize) -> Self {
+ let left_len = self.len();
+ let right_len = right.len();
+ let size = if self.is_completely_dense(level) && right.is_dense() {
+ Size::Size(left_len + right_len)
+ } else {
+ let size_table = Chunk::pair(left_len, left_len + right_len);
+ Size::Table(PoolRef::new(&pool.size_pool, size_table))
+ };
+ Node {
+ children: {
+ let children = Chunk::pair(self, right);
+ Nodes(size, PoolRef::new(&pool.node_pool, children))
+ },
+ }
+ }
+
+ pub(crate) fn len(&self) -> usize {
+ match self.children {
+ Entry::Nodes(Size::Size(size), _) => size,
+ Entry::Nodes(Size::Table(ref size_table), _) => *(size_table.last().unwrap_or(&0)),
+ Entry::Values(ref values) => values.len(),
+ Entry::Empty => 0,
+ }
+ }
+
+ pub(crate) fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ pub(crate) fn is_single(&self) -> bool {
+ self.children.len() == 1
+ }
+
+ pub(crate) fn is_full(&self) -> bool {
+ self.children.is_full()
+ }
+
+ #[allow(dead_code)] // this is only used by tests
+ pub(crate) fn number_of_children(&self) -> usize {
+ self.children.len()
+ }
+
+ pub(crate) fn first_child(&self) -> &Self {
+ self.children.unwrap_nodes().first().unwrap()
+ }
+
+ /// True if the node is dense and so doesn't have a size table
+ fn is_dense(&self) -> bool {
+ !matches!(self.children, Entry::Nodes(Size::Table(_), _))
+ }
+
+ /// True if the node and its children are dense and at capacity
+ // TODO can use this technique to quickly test if a Size::Table
+ // should be converted back to a Size::Size
+ fn is_completely_dense(&self, level: usize) -> bool {
+ // Size of a full node is NODE_SIZE at level 0, NODE_SIZE² at
+ // level 1, etc.
+ if let Some(expected_size) = NODE_SIZE.checked_pow(level as u32 + 1) {
+ self.size() == expected_size
+ } else {
+ // We overflowed a usize, there's no way we can be completely dense as we know the size
+ // fits in a usize.
+ false
+ }
+ }
+
+ #[inline]
+ fn size(&self) -> usize {
+ match self.children {
+ Entry::Nodes(ref size, _) => size.size(),
+ Entry::Values(ref values) => values.len(),
+ Entry::Empty => 0,
+ }
+ }
+
+ #[inline]
+ fn push_size(&mut self, pool: &RRBPool<A>, side: Side, level: usize, value: usize) {
+ if let Entry::Nodes(ref mut size, _) = self.children {
+ size.push(&pool.size_pool, side, level, value)
+ }
+ }
+
+ #[inline]
+ fn pop_size(&mut self, pool: &RRBPool<A>, side: Side, level: usize, value: usize) {
+ if let Entry::Nodes(ref mut size, _) = self.children {
+ size.pop(&pool.size_pool, side, level, value)
+ }
+ }
+
+ #[inline]
+ fn update_size(&mut self, pool: &RRBPool<A>, index: usize, level: usize, value: isize) {
+ if let Entry::Nodes(ref mut size, _) = self.children {
+ size.update(&pool.size_pool, index, level, value)
+ }
+ }
+
+ fn size_up_to(&self, level: usize, index: usize) -> usize {
+ if let Entry::Nodes(ref size, _) = self.children {
+ if index == 0 {
+ 0
+ } else {
+ match size {
+ Size::Table(ref size_table) => size_table[index - 1],
+ Size::Size(_) => index * NODE_SIZE.pow(level as u32),
+ }
+ }
+ } else {
+ index
+ }
+ }
+
+ fn index_in(&self, level: usize, index: usize) -> Option<usize> {
+ let mut target_idx = if let Some(child_size) = NODE_SIZE.checked_pow(level as u32) {
+ index / child_size
+ } else {
+ 0
+ };
+ if target_idx >= self.children.len() {
+ return None;
+ }
+ if let Entry::Nodes(Size::Table(ref size_table), _) = self.children {
+ while size_table[target_idx] <= index {
+ target_idx += 1;
+ if target_idx >= size_table.len() {
+ return None;
+ }
+ }
+ }
+ Some(target_idx)
+ }
+
+ pub(crate) fn index(&self, level: usize, index: usize) -> &A {
+ if level == 0 {
+ &self.children.unwrap_values()[index]
+ } else {
+ let target_idx = self.index_in(level, index).unwrap();
+ self.children.unwrap_nodes()[target_idx]
+ .index(level - 1, index - self.size_up_to(level, target_idx))
+ }
+ }
+
+ pub(crate) fn index_mut(&mut self, pool: &RRBPool<A>, level: usize, index: usize) -> &mut A {
+ if level == 0 {
+ &mut self.children.unwrap_values_mut(pool)[index]
+ } else {
+ let target_idx = self.index_in(level, index).unwrap();
+ let offset = index - self.size_up_to(level, target_idx);
+ let child = &mut self.children.unwrap_nodes_mut(pool)[target_idx];
+ child.index_mut(pool, level - 1, offset)
+ }
+ }
+
+ pub(crate) fn lookup_chunk(
+ &self,
+ level: usize,
+ base: usize,
+ index: usize,
+ ) -> (Range<usize>, *const Chunk<A>) {
+ if level == 0 {
+ (
+ base..(base + self.children.len()),
+ self.children.unwrap_values() as *const Chunk<A>,
+ )
+ } else {
+ let target_idx = self.index_in(level, index).unwrap();
+ let offset = self.size_up_to(level, target_idx);
+ let child_base = base + offset;
+ let children = self.children.unwrap_nodes();
+ let child = &children[target_idx];
+ child.lookup_chunk(level - 1, child_base, index - offset)
+ }
+ }
+
+ pub(crate) fn lookup_chunk_mut(
+ &mut self,
+ pool: &RRBPool<A>,
+ level: usize,
+ base: usize,
+ index: usize,
+ ) -> (Range<usize>, *mut Chunk<A>) {
+ if level == 0 {
+ (
+ base..(base + self.children.len()),
+ self.children.unwrap_values_mut(pool) as *mut Chunk<A>,
+ )
+ } else {
+ let target_idx = self.index_in(level, index).unwrap();
+ let offset = self.size_up_to(level, target_idx);
+ let child_base = base + offset;
+ let children = self.children.unwrap_nodes_mut(pool);
+ let child = &mut children[target_idx];
+ child.lookup_chunk_mut(pool, level - 1, child_base, index - offset)
+ }
+ }
+
+ fn push_child_node(&mut self, pool: &RRBPool<A>, side: Side, child: Node<A>) {
+ let children = self.children.unwrap_nodes_mut(pool);
+ match side {
+ Left => children.push_front(child),
+ Right => children.push_back(child),
+ }
+ }
+
+ fn pop_child_node(&mut self, pool: &RRBPool<A>, side: Side) -> Node<A> {
+ let children = self.children.unwrap_nodes_mut(pool);
+ match side {
+ Left => children.pop_front(),
+ Right => children.pop_back(),
+ }
+ }
+
+ pub(crate) fn push_chunk(
+ &mut self,
+ pool: &RRBPool<A>,
+ level: usize,
+ side: Side,
+ mut chunk: PoolRef<Chunk<A>>,
+ ) -> PushResult<PoolRef<Chunk<A>>> {
+ if chunk.is_empty() {
+ return PushResult::Done;
+ }
+ let is_full = self.is_full();
+ if level == 0 {
+ if self.children.is_empty_node() {
+ self.push_size(pool, side, level, chunk.len());
+ self.children = Values(chunk);
+ PushResult::Done
+ } else {
+ let values = self.children.unwrap_values_mut(pool);
+ if values.len() + chunk.len() <= NODE_SIZE {
+ let chunk = PoolRef::make_mut(&pool.value_pool, &mut chunk);
+ match side {
+ Side::Left => {
+ chunk.append(values);
+ values.append(chunk);
+ }
+ Side::Right => values.append(chunk),
+ }
+ PushResult::Done
+ } else {
+ PushResult::Full(chunk, 0)
+ }
+ }
+ } else if level == 1 {
+ // If rightmost existing node has any room, merge as much as
+ // possible over from the new node.
+ let num_drained = match side {
+ Side::Right => {
+ if let Entry::Nodes(ref mut size, ref mut children) = self.children {
+ let rightmost = PoolRef::make_mut(&pool.node_pool, children)
+ .last_mut()
+ .unwrap();
+ let old_size = rightmost.len();
+ let chunk = PoolRef::make_mut(&pool.value_pool, &mut chunk);
+ let values = rightmost.children.unwrap_values_mut(pool);
+ let to_drain = chunk.len().min(NODE_SIZE - values.len());
+ values.drain_from_front(chunk, to_drain);
+ size.pop(&pool.size_pool, Side::Right, level, old_size);
+ size.push(&pool.size_pool, Side::Right, level, values.len());
+ to_drain
+ } else {
+ 0
+ }
+ }
+ Side::Left => {
+ if let Entry::Nodes(ref mut size, ref mut children) = self.children {
+ let leftmost = PoolRef::make_mut(&pool.node_pool, children)
+ .first_mut()
+ .unwrap();
+ let old_size = leftmost.len();
+ let chunk = PoolRef::make_mut(&pool.value_pool, &mut chunk);
+ let values = leftmost.children.unwrap_values_mut(pool);
+ let to_drain = chunk.len().min(NODE_SIZE - values.len());
+ values.drain_from_back(chunk, to_drain);
+ size.pop(&pool.size_pool, Side::Left, level, old_size);
+ size.push(&pool.size_pool, Side::Left, level, values.len());
+ to_drain
+ } else {
+ 0
+ }
+ }
+ };
+ if is_full {
+ PushResult::Full(chunk, num_drained)
+ } else {
+ // If the chunk is empty after being drained, there might be
+ // more space in existing chunks. To keep the middle dense, we
+ // do not add it here.
+ if !chunk.is_empty() {
+ if side == Left && chunk.len() < NODE_SIZE {
+ if let Entry::Nodes(ref mut size, _) = self.children {
+ if let Size::Size(value) = *size {
+ *size = Size::table_from_size(&pool.size_pool, level, value);
+ }
+ }
+ }
+ self.push_size(pool, side, level, chunk.len());
+ self.push_child_node(pool, side, Node::from_chunk(pool, 0, chunk));
+ }
+ PushResult::Done
+ }
+ } else {
+ let chunk_size = chunk.len();
+ let index = match side {
+ Right => self.children.len() - 1,
+ Left => 0,
+ };
+ let new_child = {
+ let children = self.children.unwrap_nodes_mut(pool);
+ let child = &mut children[index];
+ match child.push_chunk(pool, level - 1, side, chunk) {
+ PushResult::Done => None,
+ PushResult::Full(chunk, num_drained) => {
+ // Our chunk was too large for `child`, so it could not
+ // be pushed there. However, exactly `num_drained`
+ // elements were added to the child. We need to reflect
+ // that change in the size field of the node.
+ match side {
+ Right => match self.children {
+ Entry::Nodes(Size::Table(ref mut sizes), _) => {
+ let sizes = PoolRef::make_mut(&pool.size_pool, sizes);
+ sizes[index] += num_drained;
+ }
+ Entry::Nodes(Size::Size(ref mut size), _) => {
+ *size += num_drained;
+ }
+ Entry::Values(_) | Entry::Empty => (),
+ },
+ Left => {
+ self.update_size(pool, 0, level, num_drained as isize);
+ }
+ }
+ if is_full {
+ return PushResult::Full(chunk, 0);
+ } else {
+ Some(Node::from_chunk(pool, level - 1, chunk))
+ }
+ }
+ }
+ };
+ match new_child {
+ None => {
+ self.update_size(pool, index, level, chunk_size as isize);
+ PushResult::Done
+ }
+ Some(child) => {
+ if side == Left && chunk_size < NODE_SIZE {
+ if let Entry::Nodes(ref mut size, _) = self.children {
+ if let Size::Size(value) = *size {
+ *size = Size::table_from_size(&pool.size_pool, level, value);
+ }
+ }
+ }
+ self.push_size(pool, side, level, child.len());
+ self.push_child_node(pool, side, child);
+ PushResult::Done
+ }
+ }
+ }
+ }
+
+ pub(crate) fn pop_chunk(
+ &mut self,
+ pool: &RRBPool<A>,
+ level: usize,
+ side: Side,
+ ) -> PopResult<PoolRef<Chunk<A>>> {
+ if self.is_empty() {
+ return PopResult::Empty;
+ }
+ if level == 0 {
+ // should only get here if the tree is just one leaf node
+ match replace(&mut self.children, Empty) {
+ Values(chunk) => PopResult::Drained(chunk),
+ Empty => panic!("rrb::Node::pop_chunk: non-empty tree with Empty leaf"),
+ Nodes(_, _) => panic!("rrb::Node::pop_chunk: branch node at leaf"),
+ }
+ } else if level == 1 {
+ let child_node = self.pop_child_node(pool, side);
+ self.pop_size(pool, side, level, child_node.len());
+ let chunk = match child_node.children {
+ Values(ref chunk) => chunk.clone(),
+ Empty => panic!("rrb::Node::pop_chunk: non-empty tree with Empty leaf"),
+ Nodes(_, _) => panic!("rrb::Node::pop_chunk: branch node at leaf"),
+ };
+ if self.is_empty() {
+ PopResult::Drained(chunk)
+ } else {
+ PopResult::Done(chunk)
+ }
+ } else {
+ let index = match side {
+ Right => self.children.len() - 1,
+ Left => 0,
+ };
+ let mut drained = false;
+ let chunk = {
+ let children = self.children.unwrap_nodes_mut(pool);
+ let child = &mut children[index];
+ match child.pop_chunk(pool, level - 1, side) {
+ PopResult::Empty => return PopResult::Empty,
+ PopResult::Done(chunk) => chunk,
+ PopResult::Drained(chunk) => {
+ drained = true;
+ chunk
+ }
+ }
+ };
+ if drained {
+ self.pop_size(pool, side, level, chunk.len());
+ self.pop_child_node(pool, side);
+ if self.is_empty() {
+ PopResult::Drained(chunk)
+ } else {
+ PopResult::Done(chunk)
+ }
+ } else {
+ self.update_size(pool, index, level, -(chunk.len() as isize));
+ PopResult::Done(chunk)
+ }
+ }
+ }
+
+ pub(crate) fn split(
+ &mut self,
+ pool: &RRBPool<A>,
+ level: usize,
+ drop_side: Side,
+ index: usize,
+ ) -> SplitResult {
+ if index == 0 && drop_side == Side::Left {
+ // Dropped nothing
+ return SplitResult::Dropped(0);
+ }
+ if level > 0 && index == 0 && drop_side == Side::Right {
+ // Dropped everything
+ let dropped = if let Entry::Nodes(ref size, _) = self.children {
+ size.size()
+ } else {
+ panic!("leaf node at non-leaf level!");
+ };
+ self.children = Entry::Empty;
+ return SplitResult::Dropped(dropped);
+ }
+ let mut dropped;
+ if level == 0 {
+ let len = self.children.len();
+ if index >= len {
+ return SplitResult::OutOfBounds;
+ }
+ let children = self.children.unwrap_values_mut(pool);
+ match drop_side {
+ Side::Left => children.drop_left(index),
+ Side::Right => children.drop_right(index),
+ }
+ SplitResult::Dropped(match drop_side {
+ Left => index,
+ Right => len - index,
+ })
+ } else if let Some(target_idx) = self.index_in(level, index) {
+ let size_up_to = self.size_up_to(level, target_idx);
+ let (size, children) =
+ if let Entry::Nodes(ref mut size, ref mut children) = self.children {
+ (size, PoolRef::make_mut(&pool.node_pool, children))
+ } else {
+ unreachable!()
+ };
+ let child_gone = 0 == {
+ let child_node = &mut children[target_idx];
+ match child_node.split(pool, level - 1, drop_side, index - size_up_to) {
+ SplitResult::OutOfBounds => return SplitResult::OutOfBounds,
+ SplitResult::Dropped(amount) => dropped = amount,
+ }
+ child_node.len()
+ };
+ match drop_side {
+ Left => {
+ let mut drop_from = target_idx;
+ if child_gone {
+ drop_from += 1;
+ }
+ children.drop_left(drop_from);
+ if let Size::Size(value) = *size {
+ *size = Size::table_from_size(&pool.size_pool, level, value);
+ }
+ let size_table = if let Size::Table(ref mut size_ref) = size {
+ PoolRef::make_mut(&pool.size_pool, size_ref)
+ } else {
+ unreachable!()
+ };
+ let dropped_size = if target_idx > 0 {
+ size_table[target_idx - 1]
+ } else {
+ 0
+ };
+ dropped += dropped_size;
+ size_table.drop_left(drop_from);
+ for i in size_table.iter_mut() {
+ *i -= dropped;
+ }
+ }
+ Right => {
+ let at_last = target_idx == children.len() - 1;
+ let mut drop_from = target_idx + 1;
+ if child_gone {
+ drop_from -= 1;
+ }
+ if drop_from < children.len() {
+ children.drop_right(drop_from);
+ }
+ match size {
+ Size::Size(ref mut size) if at_last => {
+ *size -= dropped;
+ }
+ Size::Size(ref mut size) => {
+ let size_per_child = NODE_SIZE.pow(level as u32);
+ let remainder = (target_idx + 1) * size_per_child;
+ let new_size = remainder - dropped;
+ if new_size < *size {
+ dropped = *size - new_size;
+ *size = new_size;
+ } else {
+ unreachable!(
+ "this means node is empty, should be caught at start of method"
+ );
+ }
+ }
+ Size::Table(ref mut size_ref) => {
+ let size_table = PoolRef::make_mut(&pool.size_pool, size_ref);
+ let dropped_size =
+ size_table[size_table.len() - 1] - size_table[target_idx];
+ if drop_from < size_table.len() {
+ size_table.drop_right(drop_from);
+ }
+ if !child_gone {
+ size_table[target_idx] -= dropped;
+ }
+ dropped += dropped_size;
+ }
+ }
+ }
+ }
+ SplitResult::Dropped(dropped)
+ } else {
+ SplitResult::OutOfBounds
+ }
+ }
+
+ fn merge_leaves(pool: &RRBPool<A>, mut left: Self, mut right: Self) -> Self {
+ if left.children.is_empty_node() {
+ // Left is empty, just use right
+ Self::single_parent(pool, right)
+ } else if right.children.is_empty_node() {
+ // Right is empty, just use left
+ Self::single_parent(pool, left)
+ } else {
+ {
+ let left_vals = left.children.unwrap_values_mut(pool);
+ let left_len = left_vals.len();
+ let right_vals = right.children.unwrap_values_mut(pool);
+ let right_len = right_vals.len();
+ if left_len + right_len <= NODE_SIZE {
+ left_vals.append(right_vals);
+ } else {
+ let count = right_len.min(NODE_SIZE - left_len);
+ left_vals.drain_from_front(right_vals, count);
+ }
+ }
+ if right.is_empty() {
+ Self::single_parent(pool, left)
+ } else {
+ Self::join_dense(pool, left, right)
+ }
+ }
+ }
+
+ fn merge_rebalance(
+ pool: &RRBPool<A>,
+ level: usize,
+ left: Self,
+ middle: Self,
+ right: Self,
+ ) -> Self {
+ let left_nodes = left.children.nodes().into_iter();
+ let middle_nodes = middle.children.nodes().into_iter();
+ let right_nodes = right.children.nodes().into_iter();
+ let mut subtree_still_balanced = true;
+ let mut next_leaf = Chunk::new();
+ let mut next_node = Chunk::new();
+ let mut next_subtree = Chunk::new();
+ let mut root = Chunk::new();
+
+ for subtree in left_nodes.chain(middle_nodes).chain(right_nodes) {
+ if subtree.is_empty() {
+ continue;
+ }
+ if subtree.is_completely_dense(level) && subtree_still_balanced {
+ root.push_back(subtree);
+ continue;
+ }
+ subtree_still_balanced = false;
+
+ if level == 1 {
+ for value in subtree.children.values() {
+ next_leaf.push_back(value);
+ if next_leaf.is_full() {
+ let new_node =
+ Node::from_chunk(pool, 0, PoolRef::new(&pool.value_pool, next_leaf));
+ next_subtree.push_back(new_node);
+ next_leaf = Chunk::new();
+ if next_subtree.is_full() {
+ let new_subtree = Node::parent(pool, level, next_subtree);
+ root.push_back(new_subtree);
+ next_subtree = Chunk::new();
+ }
+ }
+ }
+ } else {
+ for node in subtree.children.nodes() {
+ next_node.push_back(node);
+ if next_node.is_full() {
+ let new_node = Node::parent(pool, level - 1, next_node);
+ next_subtree.push_back(new_node);
+ next_node = Chunk::new();
+ if next_subtree.is_full() {
+ let new_subtree = Node::parent(pool, level, next_subtree);
+ root.push_back(new_subtree);
+ next_subtree = Chunk::new();
+ }
+ }
+ }
+ }
+ }
+ if !next_leaf.is_empty() {
+ let new_node = Node::from_chunk(pool, 0, PoolRef::new(&pool.value_pool, next_leaf));
+ next_subtree.push_back(new_node);
+ }
+ if !next_node.is_empty() {
+ let new_node = Node::parent(pool, level - 1, next_node);
+ next_subtree.push_back(new_node);
+ }
+ if !next_subtree.is_empty() {
+ let new_subtree = Node::parent(pool, level, next_subtree);
+ root.push_back(new_subtree);
+ }
+ Node::parent(pool, level + 1, root)
+ }
+
+ pub(crate) fn merge(pool: &RRBPool<A>, mut left: Self, mut right: Self, level: usize) -> Self {
+ if level == 0 {
+ Self::merge_leaves(pool, left, right)
+ } else {
+ let merged = {
+ if level == 1 {
+ // We're going to rebalance all the leaves anyway, there's
+ // no need for a middle at level 1
+ Node::parent(pool, 0, Chunk::new())
+ } else {
+ let left_last =
+ if let Entry::Nodes(ref mut size, ref mut children) = left.children {
+ let node = PoolRef::make_mut(&pool.node_pool, children).pop_back();
+ if !node.is_empty() {
+ size.pop(&pool.size_pool, Side::Right, level, node.len());
+ }
+ node
+ } else {
+ panic!("expected nodes, found entries or empty");
+ };
+ let right_first =
+ if let Entry::Nodes(ref mut size, ref mut children) = right.children {
+ let node = PoolRef::make_mut(&pool.node_pool, children).pop_front();
+ if !node.is_empty() {
+ size.pop(&pool.size_pool, Side::Left, level, node.len());
+ }
+ node
+ } else {
+ panic!("expected nodes, found entries or empty");
+ };
+ Self::merge(pool, left_last, right_first, level - 1)
+ }
+ };
+ Self::merge_rebalance(pool, level, left, merged, right)
+ }
+ }
+
+ #[cfg(any(test, feature = "debug"))]
+ pub(crate) fn assert_invariants(&self, level: usize) -> usize {
+ // Verifies that the size table matches reality.
+ match self.children {
+ Entry::Empty => 0,
+ Entry::Values(ref values) => {
+ // An empty value node is pointless and should never occur.
+ assert_ne!(0, values.len());
+ // Value nodes should only occur at level 0.
+ assert_eq!(0, level);
+ values.len()
+ }
+ Entry::Nodes(ref size, ref children) => {
+ // A parent node with no children should never occur.
+ assert_ne!(0, children.len());
+ // Parent nodes should never occur at level 0.
+ assert_ne!(0, level);
+ let mut lengths = Vec::new();
+ let should_be_dense = matches!(size, Size::Size(_));
+ for (index, child) in children.iter().enumerate() {
+ let len = child.assert_invariants(level - 1);
+ if should_be_dense && index < children.len() - 1 {
+ // Assert that non-end nodes without size tables are full.
+ assert_eq!(len, NODE_SIZE.pow(level as u32));
+ }
+ lengths.push(len);
+ }
+ match size {
+ Size::Size(size) => {
+ let total: usize = lengths.iter().sum();
+ assert_eq!(*size, total);
+ }
+ Size::Table(ref table) => {
+ assert_eq!(table.iter().len(), children.len());
+ for (index, current) in table.iter().enumerate() {
+ let expected: usize = lengths.iter().take(index + 1).sum();
+ assert_eq!(expected, *current);
+ }
+ }
+ }
+ lengths.iter().sum()
+ }
+ }
+ }
+
+ // pub fn print<W>(&self, f: &mut W, indent: usize, level: usize) -> Result<(), fmt::Error>
+ // where
+ // W: fmt::Write,
+ // A: fmt::Debug,
+ // {
+ // print_indent(f, indent)?;
+ // if level == 0 {
+ // if self.children.is_empty_node() {
+ // writeln!(f, "Leaf: EMPTY")
+ // } else {
+ // writeln!(f, "Leaf: {:?}", self.children.unwrap_values())
+ // }
+ // } else {
+ // match &self.children {
+ // Entry::Nodes(size, children) => {
+ // writeln!(f, "Node level {} size_table {:?}", level, size)?;
+ // for child in children.iter() {
+ // child.print(f, indent + 4, level - 1)?;
+ // }
+ // Ok(())
+ // }
+ // _ => unreachable!(),
+ // }
+ // }
+ // }
+}
+
+// fn print_indent<W>(f: &mut W, indent: usize) -> Result<(), fmt::Error>
+// where
+// W: fmt::Write,
+// {
+// for _i in 0..indent {
+// write!(f, " ")?;
+// }
+// Ok(())
+// }
diff --git a/vendor/im-rc/src/ord/map.rs b/vendor/im-rc/src/ord/map.rs
new file mode 100644
index 0000000..ad87932
--- /dev/null
+++ b/vendor/im-rc/src/ord/map.rs
@@ -0,0 +1,2649 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+//! An ordered map.
+//!
+//! An immutable ordered map implemented as a [B-tree] [1].
+//!
+//! Most operations on this type of map are O(log n). A
+//! [`HashMap`][hashmap::HashMap] is usually a better choice for
+//! performance, but the `OrdMap` has the advantage of only requiring
+//! an [`Ord`][std::cmp::Ord] constraint on the key, and of being
+//! ordered, so that keys always come out from lowest to highest,
+//! where a [`HashMap`][hashmap::HashMap] has no guaranteed ordering.
+//!
+//! [1]: https://en.wikipedia.org/wiki/B-tree
+//! [hashmap::HashMap]: ../hashmap/struct.HashMap.html
+//! [std::cmp::Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html
+
+use std::borrow::Borrow;
+use std::cmp::Ordering;
+use std::collections;
+use std::fmt::{Debug, Error, Formatter};
+use std::hash::{BuildHasher, Hash, Hasher};
+use std::iter::{FromIterator, Iterator, Sum};
+use std::mem;
+use std::ops::{Add, Index, IndexMut, RangeBounds};
+
+use crate::hashmap::HashMap;
+use crate::nodes::btree::{BTreeValue, Insert, Node, Remove};
+#[cfg(has_specialisation)]
+use crate::util::linear_search_by;
+use crate::util::{Pool, PoolRef};
+
+pub use crate::nodes::btree::{
+ ConsumingIter, DiffItem as NodeDiffItem, DiffIter as NodeDiffIter, Iter as RangedIter,
+};
+
+/// Construct a map from a sequence of key/value pairs.
+///
+/// # Examples
+///
+/// ```
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::ordmap::OrdMap;
+/// # fn main() {
+/// assert_eq!(
+/// ordmap!{
+/// 1 => 11,
+/// 2 => 22,
+/// 3 => 33
+/// },
+/// OrdMap::from(vec![(1, 11), (2, 22), (3, 33)])
+/// );
+/// # }
+/// ```
+#[macro_export]
+macro_rules! ordmap {
+ () => { $crate::ordmap::OrdMap::new() };
+
+ ( $( $key:expr => $value:expr ),* ) => {{
+ let mut map = $crate::ordmap::OrdMap::new();
+ $({
+ map.insert($key, $value);
+ })*;
+ map
+ }};
+}
+
+#[cfg(not(has_specialisation))]
+impl<K: Ord, V> BTreeValue for (K, V) {
+ type Key = K;
+
+ fn ptr_eq(&self, _other: &Self) -> bool {
+ false
+ }
+
+ fn search_key<BK>(slice: &[Self], key: &BK) -> Result<usize, usize>
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ slice.binary_search_by(|value| Self::Key::borrow(&value.0).cmp(key))
+ }
+
+ fn search_value(slice: &[Self], key: &Self) -> Result<usize, usize> {
+ slice.binary_search_by(|value| value.0.cmp(&key.0))
+ }
+
+ fn cmp_keys<BK>(&self, other: &BK) -> Ordering
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ Self::Key::borrow(&self.0).cmp(other)
+ }
+
+ fn cmp_values(&self, other: &Self) -> Ordering {
+ self.0.cmp(&other.0)
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<K: Ord, V> BTreeValue for (K, V) {
+ type Key = K;
+
+ fn ptr_eq(&self, _other: &Self) -> bool {
+ false
+ }
+
+ default fn search_key<BK>(slice: &[Self], key: &BK) -> Result<usize, usize>
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ slice.binary_search_by(|value| Self::Key::borrow(&value.0).cmp(key))
+ }
+
+ default fn search_value(slice: &[Self], key: &Self) -> Result<usize, usize> {
+ slice.binary_search_by(|value| value.0.cmp(&key.0))
+ }
+
+ fn cmp_keys<BK>(&self, other: &BK) -> Ordering
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ Self::Key::borrow(&self.0).cmp(other)
+ }
+
+ fn cmp_values(&self, other: &Self) -> Ordering {
+ self.0.cmp(&other.0)
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<K: Ord + Copy, V> BTreeValue for (K, V) {
+ fn search_key<BK>(slice: &[Self], key: &BK) -> Result<usize, usize>
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ linear_search_by(slice, |value| Self::Key::borrow(&value.0).cmp(key))
+ }
+
+ fn search_value(slice: &[Self], key: &Self) -> Result<usize, usize> {
+ linear_search_by(slice, |value| value.0.cmp(&key.0))
+ }
+}
+
+def_pool!(OrdMapPool<K, V>, Node<(K, V)>);
+
+/// An ordered map.
+///
+/// An immutable ordered map implemented as a B-tree.
+///
+/// Most operations on this type of map are O(log n). A
+/// [`HashMap`][hashmap::HashMap] is usually a better choice for
+/// performance, but the `OrdMap` has the advantage of only requiring
+/// an [`Ord`][std::cmp::Ord] constraint on the key, and of being
+/// ordered, so that keys always come out from lowest to highest,
+/// where a [`HashMap`][hashmap::HashMap] has no guaranteed ordering.
+///
+/// [hashmap::HashMap]: ../hashmap/struct.HashMap.html
+/// [std::cmp::Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html
+pub struct OrdMap<K, V> {
+ size: usize,
+ pool: OrdMapPool<K, V>,
+ root: PoolRef<Node<(K, V)>>,
+}
+
+impl<K, V> OrdMap<K, V> {
+ /// Construct an empty map.
+ #[must_use]
+ pub fn new() -> Self {
+ let pool = OrdMapPool::default();
+ let root = PoolRef::default(&pool.0);
+ OrdMap {
+ size: 0,
+ pool,
+ root,
+ }
+ }
+
+ /// Construct an empty map using a specific memory pool.
+ #[cfg(feature = "pool")]
+ #[must_use]
+ pub fn with_pool(pool: &OrdMapPool<K, V>) -> Self {
+ let root = PoolRef::default(&pool.0);
+ OrdMap {
+ size: 0,
+ pool: pool.clone(),
+ root,
+ }
+ }
+
+ /// Construct a map with a single mapping.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map = OrdMap::unit(123, "onetwothree");
+ /// assert_eq!(
+ /// map.get(&123),
+ /// Some(&"onetwothree")
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn unit(key: K, value: V) -> Self {
+ let pool = OrdMapPool::default();
+ let root = PoolRef::new(&pool.0, Node::unit((key, value)));
+ OrdMap {
+ size: 1,
+ pool,
+ root,
+ }
+ }
+
+ /// Test whether a map is empty.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// assert!(
+ /// !ordmap!{1 => 2}.is_empty()
+ /// );
+ /// assert!(
+ /// OrdMap::<i32, i32>::new().is_empty()
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ /// Test whether two maps refer to the same content in memory.
+ ///
+ /// This is true if the two sides are references to the same map,
+ /// or if the two maps refer to the same root node.
+ ///
+ /// This would return true if you're comparing a map to itself, or
+ /// if you're comparing a map to a fresh clone of itself.
+ ///
+ /// Time: O(1)
+ pub fn ptr_eq(&self, other: &Self) -> bool {
+ std::ptr::eq(self, other) || PoolRef::ptr_eq(&self.root, &other.root)
+ }
+
+ /// Get the size of a map.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// assert_eq!(3, ordmap!{
+ /// 1 => 11,
+ /// 2 => 22,
+ /// 3 => 33
+ /// }.len());
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn len(&self) -> usize {
+ self.size
+ }
+
+ /// Get a reference to the memory pool used by this map.
+ ///
+ /// Note that if you didn't specifically construct it with a pool, you'll
+ /// get back a reference to a pool of size 0.
+ #[cfg(feature = "pool")]
+ pub fn pool(&self) -> &OrdMapPool<K, V> {
+ &self.pool
+ }
+
+ /// Discard all elements from the map.
+ ///
+ /// This leaves you with an empty map, and all elements that
+ /// were previously inside it are dropped.
+ ///
+ /// Time: O(n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::OrdMap;
+ /// let mut map = ordmap![1=>1, 2=>2, 3=>3];
+ /// map.clear();
+ /// assert!(map.is_empty());
+ /// ```
+ pub fn clear(&mut self) {
+ if !self.is_empty() {
+ self.root = PoolRef::default(&self.pool.0);
+ self.size = 0;
+ }
+ }
+}
+
+impl<K, V> OrdMap<K, V>
+where
+ K: Ord,
+{
+ /// Get the largest key in a map, along with its value. If the map
+ /// is empty, return `None`.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// assert_eq!(Some(&(3, 33)), ordmap!{
+ /// 1 => 11,
+ /// 2 => 22,
+ /// 3 => 33
+ /// }.get_max());
+ /// ```
+ #[must_use]
+ pub fn get_max(&self) -> Option<&(K, V)> {
+ self.root.max()
+ }
+
+ /// Get the smallest key in a map, along with its value. If the
+ /// map is empty, return `None`.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// assert_eq!(Some(&(1, 11)), ordmap!{
+ /// 1 => 11,
+ /// 2 => 22,
+ /// 3 => 33
+ /// }.get_min());
+ /// ```
+ #[must_use]
+ pub fn get_min(&self) -> Option<&(K, V)> {
+ self.root.min()
+ }
+
+ /// Get an iterator over the key/value pairs of a map.
+ #[must_use]
+ pub fn iter(&self) -> Iter<'_, K, V> {
+ Iter {
+ it: RangedIter::new(&self.root, self.size, ..),
+ }
+ }
+
+ /// Create an iterator over a range of key/value pairs.
+ #[must_use]
+ pub fn range<R, BK>(&self, range: R) -> Iter<'_, K, V>
+ where
+ R: RangeBounds<BK>,
+ K: Borrow<BK>,
+ BK: Ord + ?Sized,
+ {
+ Iter {
+ it: RangedIter::new(&self.root, self.size, range),
+ }
+ }
+
+ /// Get an iterator over a map's keys.
+ #[must_use]
+ pub fn keys(&self) -> Keys<'_, K, V> {
+ Keys { it: self.iter() }
+ }
+
+ /// Get an iterator over a map's values.
+ #[must_use]
+ pub fn values(&self) -> Values<'_, K, V> {
+ Values { it: self.iter() }
+ }
+
+ /// Get an iterator over the differences between this map and
+ /// another, i.e. the set of entries to add, update, or remove to
+ /// this map in order to make it equal to the other map.
+ ///
+ /// This function will avoid visiting nodes which are shared
+ /// between the two maps, meaning that even very large maps can be
+ /// compared quickly if most of their structure is shared.
+ ///
+ /// Time: O(n) (where n is the number of unique elements across
+ /// the two maps, minus the number of elements belonging to nodes
+ /// shared between them)
+ #[must_use]
+ pub fn diff<'a>(&'a self, other: &'a Self) -> DiffIter<'a, K, V> {
+ DiffIter {
+ it: NodeDiffIter::new(&self.root, &other.root),
+ }
+ }
+
+ /// Get the value for a key from a map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map = ordmap!{123 => "lol"};
+ /// assert_eq!(
+ /// map.get(&123),
+ /// Some(&"lol")
+ /// );
+ /// ```
+ #[must_use]
+ pub fn get<BK>(&self, key: &BK) -> Option<&V>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.root.lookup(key).map(|(_, v)| v)
+ }
+
+ /// Get the key/value pair for a key from a map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map = ordmap!{123 => "lol"};
+ /// assert_eq!(
+ /// map.get_key_value(&123),
+ /// Some((&123, &"lol"))
+ /// );
+ /// ```
+ #[must_use]
+ pub fn get_key_value<BK>(&self, key: &BK) -> Option<(&K, &V)>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.root.lookup(key).map(|&(ref k, ref v)| (k, v))
+ }
+
+ /// Get the closest smaller entry in a map to a given key
+ /// as a mutable reference.
+ ///
+ /// If the map contains the given key, this is returned.
+ /// Otherwise, the closest key in the map smaller than the
+ /// given value is returned. If the smallest key in the map
+ /// is larger than the given key, `None` is returned.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::OrdMap;
+ /// let map = ordmap![1 => 1, 3 => 3, 5 => 5];
+ /// assert_eq!(Some((&3, &3)), map.get_prev(&4));
+ /// ```
+ #[must_use]
+ pub fn get_prev<BK>(&self, key: &BK) -> Option<(&K, &V)>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.root.lookup_prev(key).map(|(k, v)| (k, v))
+ }
+
+ /// Get the closest larger entry in a map to a given key
+ /// as a mutable reference.
+ ///
+ /// If the set contains the given value, this is returned.
+ /// Otherwise, the closest value in the set larger than the
+ /// given value is returned. If the largest value in the set
+ /// is smaller than the given value, `None` is returned.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::OrdMap;
+ /// let map = ordmap![1 => 1, 3 => 3, 5 => 5];
+ /// assert_eq!(Some((&5, &5)), map.get_next(&4));
+ /// ```
+ #[must_use]
+ pub fn get_next<BK>(&self, key: &BK) -> Option<(&K, &V)>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.root.lookup_next(key).map(|(k, v)| (k, v))
+ }
+
+ /// Test for the presence of a key in a map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map = ordmap!{123 => "lol"};
+ /// assert!(
+ /// map.contains_key(&123)
+ /// );
+ /// assert!(
+ /// !map.contains_key(&321)
+ /// );
+ /// ```
+ #[must_use]
+ pub fn contains_key<BK>(&self, k: &BK) -> bool
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.get(k).is_some()
+ }
+
+ /// Test whether a map is a submap of another map, meaning that
+ /// all keys in our map must also be in the other map, with the
+ /// same values.
+ ///
+ /// Use the provided function to decide whether values are equal.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn is_submap_by<B, RM, F>(&self, other: RM, mut cmp: F) -> bool
+ where
+ F: FnMut(&V, &B) -> bool,
+ RM: Borrow<OrdMap<K, B>>,
+ {
+ self.iter()
+ .all(|(k, v)| other.borrow().get(k).map(|ov| cmp(v, ov)).unwrap_or(false))
+ }
+
+ /// Test whether a map is a proper submap of another map, meaning
+ /// that all keys in our map must also be in the other map, with
+ /// the same values. To be a proper submap, ours must also contain
+ /// fewer keys than the other map.
+ ///
+ /// Use the provided function to decide whether values are equal.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn is_proper_submap_by<B, RM, F>(&self, other: RM, cmp: F) -> bool
+ where
+ F: FnMut(&V, &B) -> bool,
+ RM: Borrow<OrdMap<K, B>>,
+ {
+ self.len() != other.borrow().len() && self.is_submap_by(other, cmp)
+ }
+
+ /// Test whether a map is a submap of another map, meaning that
+ /// all keys in our map must also be in the other map, with the
+ /// same values.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 2 => 2};
+ /// let map2 = ordmap!{1 => 1, 2 => 2, 3 => 3};
+ /// assert!(map1.is_submap(map2));
+ /// ```
+ #[must_use]
+ pub fn is_submap<RM>(&self, other: RM) -> bool
+ where
+ V: PartialEq,
+ RM: Borrow<Self>,
+ {
+ self.is_submap_by(other.borrow(), PartialEq::eq)
+ }
+
+ /// Test whether a map is a proper submap of another map, meaning
+ /// that all keys in our map must also be in the other map, with
+ /// the same values. To be a proper submap, ours must also contain
+ /// fewer keys than the other map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 2 => 2};
+ /// let map2 = ordmap!{1 => 1, 2 => 2, 3 => 3};
+ /// assert!(map1.is_proper_submap(map2));
+ ///
+ /// let map3 = ordmap!{1 => 1, 2 => 2};
+ /// let map4 = ordmap!{1 => 1, 2 => 2};
+ /// assert!(!map3.is_proper_submap(map4));
+ /// ```
+ #[must_use]
+ pub fn is_proper_submap<RM>(&self, other: RM) -> bool
+ where
+ V: PartialEq,
+ RM: Borrow<Self>,
+ {
+ self.is_proper_submap_by(other.borrow(), PartialEq::eq)
+ }
+}
+
+impl<K, V> OrdMap<K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ /// Get a mutable reference to the value for a key from a map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let mut map = ordmap!{123 => "lol"};
+ /// if let Some(value) = map.get_mut(&123) {
+ /// *value = "omg";
+ /// }
+ /// assert_eq!(
+ /// map.get(&123),
+ /// Some(&"omg")
+ /// );
+ /// ```
+ #[must_use]
+ pub fn get_mut<BK>(&mut self, key: &BK) -> Option<&mut V>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ root.lookup_mut(&self.pool.0, key).map(|(_, v)| v)
+ }
+
+ /// Get the closest smaller entry in a map to a given key
+ /// as a mutable reference.
+ ///
+ /// If the map contains the given key, this is returned.
+ /// Otherwise, the closest key in the map smaller than the
+ /// given value is returned. If the smallest key in the map
+ /// is larger than the given key, `None` is returned.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::OrdMap;
+ /// let mut map = ordmap![1 => 1, 3 => 3, 5 => 5];
+ /// if let Some((key, value)) = map.get_prev_mut(&4) {
+ /// *value = 4;
+ /// }
+ /// assert_eq!(ordmap![1 => 1, 3 => 4, 5 => 5], map);
+ /// ```
+ #[must_use]
+ pub fn get_prev_mut<BK>(&mut self, key: &BK) -> Option<(&K, &mut V)>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ let pool = &self.pool.0;
+ PoolRef::make_mut(pool, &mut self.root)
+ .lookup_prev_mut(pool, key)
+ .map(|(ref k, ref mut v)| (k, v))
+ }
+
+ /// Get the closest larger entry in a map to a given key
+ /// as a mutable reference.
+ ///
+ /// If the set contains the given value, this is returned.
+ /// Otherwise, the closest value in the set larger than the
+ /// given value is returned. If the largest value in the set
+ /// is smaller than the given value, `None` is returned.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::OrdMap;
+ /// let mut map = ordmap![1 => 1, 3 => 3, 5 => 5];
+ /// if let Some((key, value)) = map.get_next_mut(&4) {
+ /// *value = 4;
+ /// }
+ /// assert_eq!(ordmap![1 => 1, 3 => 3, 5 => 4], map);
+ /// ```
+ #[must_use]
+ pub fn get_next_mut<BK>(&mut self, key: &BK) -> Option<(&K, &mut V)>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ let pool = &self.pool.0;
+ PoolRef::make_mut(pool, &mut self.root)
+ .lookup_next_mut(pool, key)
+ .map(|(ref k, ref mut v)| (k, v))
+ }
+
+ /// Insert a key/value mapping into a map.
+ ///
+ /// This is a copy-on-write operation, so that the parts of the
+ /// map's structure which are shared with other maps will be
+ /// safely copied before mutating.
+ ///
+ /// If the map already has a mapping for the given key, the
+ /// previous value is overwritten.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let mut map = ordmap!{};
+ /// map.insert(123, "123");
+ /// map.insert(456, "456");
+ /// assert_eq!(
+ /// map,
+ /// ordmap!{123 => "123", 456 => "456"}
+ /// );
+ /// ```
+ ///
+ /// [insert]: #method.insert
+ #[inline]
+ pub fn insert(&mut self, key: K, value: V) -> Option<V> {
+ let new_root = {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ match root.insert(&self.pool.0, (key, value)) {
+ Insert::Replaced((_, old_value)) => return Some(old_value),
+ Insert::Added => {
+ self.size += 1;
+ return None;
+ }
+ Insert::Split(left, median, right) => PoolRef::new(
+ &self.pool.0,
+ Node::new_from_split(&self.pool.0, left, median, right),
+ ),
+ }
+ };
+ self.size += 1;
+ self.root = new_root;
+ None
+ }
+
+ /// Remove a key/value mapping from a map if it exists.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let mut map = ordmap!{123 => "123", 456 => "456"};
+ /// map.remove(&123);
+ /// map.remove(&456);
+ /// assert!(map.is_empty());
+ /// ```
+ ///
+ /// [remove]: #method.remove
+ #[inline]
+ pub fn remove<BK>(&mut self, k: &BK) -> Option<V>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.remove_with_key(k).map(|(_, v)| v)
+ }
+
+ /// Remove a key/value pair from a map, if it exists, and return
+ /// the removed key and value.
+ ///
+ /// Time: O(log n)
+ pub fn remove_with_key<BK>(&mut self, k: &BK) -> Option<(K, V)>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ let (new_root, removed_value) = {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ match root.remove(&self.pool.0, k) {
+ Remove::NoChange => return None,
+ Remove::Removed(pair) => {
+ self.size -= 1;
+ return Some(pair);
+ }
+ Remove::Update(pair, root) => (PoolRef::new(&self.pool.0, root), Some(pair)),
+ }
+ };
+ self.size -= 1;
+ self.root = new_root;
+ removed_value
+ }
+
+ /// Construct a new map by inserting a key/value mapping into a
+ /// map.
+ ///
+ /// If the map already has a mapping for the given key, the
+ /// previous value is overwritten.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map = ordmap!{};
+ /// assert_eq!(
+ /// map.update(123, "123"),
+ /// ordmap!{123 => "123"}
+ /// );
+ /// ```
+ #[must_use]
+ pub fn update(&self, key: K, value: V) -> Self {
+ let mut out = self.clone();
+ out.insert(key, value);
+ out
+ }
+
+ /// Construct a new map by inserting a key/value mapping into a
+ /// map.
+ ///
+ /// If the map already has a mapping for the given key, we call
+ /// the provided function with the old value and the new value,
+ /// and insert the result as the new value.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn update_with<F>(self, k: K, v: V, f: F) -> Self
+ where
+ F: FnOnce(V, V) -> V,
+ {
+ self.update_with_key(k, v, |_, v1, v2| f(v1, v2))
+ }
+
+ /// Construct a new map by inserting a key/value mapping into a
+ /// map.
+ ///
+ /// If the map already has a mapping for the given key, we call
+ /// the provided function with the key, the old value and the new
+ /// value, and insert the result as the new value.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn update_with_key<F>(self, k: K, v: V, f: F) -> Self
+ where
+ F: FnOnce(&K, V, V) -> V,
+ {
+ match self.extract_with_key(&k) {
+ None => self.update(k, v),
+ Some((_, v2, m)) => {
+ let out_v = f(&k, v2, v);
+ m.update(k, out_v)
+ }
+ }
+ }
+
+ /// Construct a new map by inserting a key/value mapping into a
+ /// map, returning the old value for the key as well as the new
+ /// map.
+ ///
+ /// If the map already has a mapping for the given key, we call
+ /// the provided function with the key, the old value and the new
+ /// value, and insert the result as the new value.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn update_lookup_with_key<F>(self, k: K, v: V, f: F) -> (Option<V>, Self)
+ where
+ F: FnOnce(&K, &V, V) -> V,
+ {
+ match self.extract_with_key(&k) {
+ None => (None, self.update(k, v)),
+ Some((_, v2, m)) => {
+ let out_v = f(&k, &v2, v);
+ (Some(v2), m.update(k, out_v))
+ }
+ }
+ }
+
+ /// Update the value for a given key by calling a function with
+ /// the current value and overwriting it with the function's
+ /// return value.
+ ///
+ /// The function gets an [`Option<V>`][std::option::Option] and
+ /// returns the same, so that it can decide to delete a mapping
+ /// instead of updating the value, and decide what to do if the
+ /// key isn't in the map.
+ ///
+ /// Time: O(log n)
+ ///
+ /// [std::option::Option]: https://doc.rust-lang.org/std/option/enum.Option.html
+ #[must_use]
+ pub fn alter<F>(&self, f: F, k: K) -> Self
+ where
+ F: FnOnce(Option<V>) -> Option<V>,
+ {
+ let pop = self.extract_with_key(&k);
+ match (f(pop.as_ref().map(|&(_, ref v, _)| v.clone())), pop) {
+ (None, None) => self.clone(),
+ (Some(v), None) => self.update(k, v),
+ (None, Some((_, _, m))) => m,
+ (Some(v), Some((_, _, m))) => m.update(k, v),
+ }
+ }
+
+ /// Remove a key/value pair from a map, if it exists.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn without<BK>(&self, k: &BK) -> Self
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.extract(k)
+ .map(|(_, m)| m)
+ .unwrap_or_else(|| self.clone())
+ }
+
+ /// Remove a key/value pair from a map, if it exists, and return
+ /// the removed value as well as the updated list.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn extract<BK>(&self, k: &BK) -> Option<(V, Self)>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ self.extract_with_key(k).map(|(_, v, m)| (v, m))
+ }
+
+ /// Remove a key/value pair from a map, if it exists, and return
+ /// the removed key and value as well as the updated list.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn extract_with_key<BK>(&self, k: &BK) -> Option<(K, V, Self)>
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ let mut out = self.clone();
+ let result = out.remove_with_key(k);
+ result.map(|(k, v)| (k, v, out))
+ }
+
+ /// Construct the union of two maps, keeping the values in the
+ /// current map when keys exist in both maps.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 3};
+ /// let map2 = ordmap!{2 => 2, 3 => 4};
+ /// let expected = ordmap!{1 => 1, 2 => 2, 3 => 3};
+ /// assert_eq!(expected, map1.union(map2));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn union(self, other: Self) -> Self {
+ let (mut to_mutate, to_consume) = if self.len() >= other.len() {
+ (self, other)
+ } else {
+ (other, self)
+ };
+ for (k, v) in to_consume {
+ to_mutate.entry(k).or_insert(v);
+ }
+ to_mutate
+ }
+
+ /// Construct the union of two maps, using a function to decide
+ /// what to do with the value when a key is in both maps.
+ ///
+ /// The function is called when a value exists in both maps, and
+ /// receives the value from the current map as its first argument,
+ /// and the value from the other map as the second. It should
+ /// return the value to be inserted in the resulting map.
+ ///
+ /// Time: O(n log n)
+ #[inline]
+ #[must_use]
+ pub fn union_with<F>(self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(V, V) -> V,
+ {
+ self.union_with_key(other, |_, v1, v2| f(v1, v2))
+ }
+
+ /// Construct the union of two maps, using a function to decide
+ /// what to do with the value when a key is in both maps.
+ ///
+ /// The function is called when a value exists in both maps, and
+ /// receives a reference to the key as its first argument, the
+ /// value from the current map as the second argument, and the
+ /// value from the other map as the third argument. It should
+ /// return the value to be inserted in the resulting map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 4};
+ /// let map2 = ordmap!{2 => 2, 3 => 5};
+ /// let expected = ordmap!{1 => 1, 2 => 2, 3 => 9};
+ /// assert_eq!(expected, map1.union_with_key(
+ /// map2,
+ /// |key, left, right| left + right
+ /// ));
+ /// ```
+ #[must_use]
+ pub fn union_with_key<F>(self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(&K, V, V) -> V,
+ {
+ if self.len() >= other.len() {
+ self.union_with_key_inner(other, f)
+ } else {
+ other.union_with_key_inner(self, |key, other_value, self_value| {
+ f(key, self_value, other_value)
+ })
+ }
+ }
+
+ fn union_with_key_inner<F>(mut self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(&K, V, V) -> V,
+ {
+ for (key, right_value) in other {
+ match self.remove(&key) {
+ None => {
+ self.insert(key, right_value);
+ }
+ Some(left_value) => {
+ let final_value = f(&key, left_value, right_value);
+ self.insert(key, final_value);
+ }
+ }
+ }
+ self
+ }
+
+ /// Construct the union of a sequence of maps, selecting the value
+ /// of the leftmost when a key appears in more than one map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 3};
+ /// let map2 = ordmap!{2 => 2};
+ /// let expected = ordmap!{1 => 1, 2 => 2, 3 => 3};
+ /// assert_eq!(expected, OrdMap::unions(vec![map1, map2]));
+ /// ```
+ #[must_use]
+ pub fn unions<I>(i: I) -> Self
+ where
+ I: IntoIterator<Item = Self>,
+ {
+ i.into_iter().fold(Self::default(), Self::union)
+ }
+
+ /// Construct the union of a sequence of maps, using a function to
+ /// decide what to do with the value when a key is in more than
+ /// one map.
+ ///
+ /// The function is called when a value exists in multiple maps,
+ /// and receives the value from the current map as its first
+ /// argument, and the value from the next map as the second. It
+ /// should return the value to be inserted in the resulting map.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn unions_with<I, F>(i: I, f: F) -> Self
+ where
+ I: IntoIterator<Item = Self>,
+ F: Fn(V, V) -> V,
+ {
+ i.into_iter()
+ .fold(Self::default(), |a, b| a.union_with(b, &f))
+ }
+
+ /// Construct the union of a sequence of maps, using a function to
+ /// decide what to do with the value when a key is in more than
+ /// one map.
+ ///
+ /// The function is called when a value exists in multiple maps,
+ /// and receives a reference to the key as its first argument, the
+ /// value from the current map as the second argument, and the
+ /// value from the next map as the third argument. It should
+ /// return the value to be inserted in the resulting map.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn unions_with_key<I, F>(i: I, f: F) -> Self
+ where
+ I: IntoIterator<Item = Self>,
+ F: Fn(&K, V, V) -> V,
+ {
+ i.into_iter()
+ .fold(Self::default(), |a, b| a.union_with_key(b, &f))
+ }
+
+ /// Construct the symmetric difference between two maps by discarding keys
+ /// which occur in both maps.
+ ///
+ /// This is an alias for the
+ /// [`symmetric_difference`][symmetric_difference] method.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 4};
+ /// let map2 = ordmap!{2 => 2, 3 => 5};
+ /// let expected = ordmap!{1 => 1, 2 => 2};
+ /// assert_eq!(expected, map1.difference(map2));
+ /// ```
+ ///
+ /// [symmetric_difference]: #method.symmetric_difference
+ #[inline]
+ #[must_use]
+ pub fn difference(self, other: Self) -> Self {
+ self.symmetric_difference(other)
+ }
+
+ /// Construct the symmetric difference between two maps by discarding keys
+ /// which occur in both maps.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 4};
+ /// let map2 = ordmap!{2 => 2, 3 => 5};
+ /// let expected = ordmap!{1 => 1, 2 => 2};
+ /// assert_eq!(expected, map1.symmetric_difference(map2));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn symmetric_difference(self, other: Self) -> Self {
+ self.symmetric_difference_with_key(other, |_, _, _| None)
+ }
+
+ /// Construct the symmetric difference between two maps by using a function
+ /// to decide what to do if a key occurs in both.
+ ///
+ /// This is an alias for the
+ /// [`symmetric_difference_with`][symmetric_difference_with] method.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// [symmetric_difference_with]: #method.symmetric_difference_with
+ #[inline]
+ #[must_use]
+ pub fn difference_with<F>(self, other: Self, f: F) -> Self
+ where
+ F: FnMut(V, V) -> Option<V>,
+ {
+ self.symmetric_difference_with(other, f)
+ }
+
+ /// Construct the symmetric difference between two maps by using a function
+ /// to decide what to do if a key occurs in both.
+ ///
+ /// Time: O(n log n)
+ #[inline]
+ #[must_use]
+ pub fn symmetric_difference_with<F>(self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(V, V) -> Option<V>,
+ {
+ self.symmetric_difference_with_key(other, |_, a, b| f(a, b))
+ }
+
+ /// Construct the symmetric difference between two maps by using a function
+ /// to decide what to do if a key occurs in both. The function
+ /// receives the key as well as both values.
+ ///
+ /// This is an alias for the
+ /// [`symmetric_difference_with_key`][symmetric_difference_with_key]
+ /// method.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 4};
+ /// let map2 = ordmap!{2 => 2, 3 => 5};
+ /// let expected = ordmap!{1 => 1, 2 => 2, 3 => 9};
+ /// assert_eq!(expected, map1.difference_with_key(
+ /// map2,
+ /// |key, left, right| Some(left + right)
+ /// ));
+ /// ```
+ /// [symmetric_difference_with_key]: #method.symmetric_difference_with_key
+ #[must_use]
+ pub fn difference_with_key<F>(self, other: Self, f: F) -> Self
+ where
+ F: FnMut(&K, V, V) -> Option<V>,
+ {
+ self.symmetric_difference_with_key(other, f)
+ }
+
+ /// Construct the symmetric difference between two maps by using a function
+ /// to decide what to do if a key occurs in both. The function
+ /// receives the key as well as both values.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 4};
+ /// let map2 = ordmap!{2 => 2, 3 => 5};
+ /// let expected = ordmap!{1 => 1, 2 => 2, 3 => 9};
+ /// assert_eq!(expected, map1.symmetric_difference_with_key(
+ /// map2,
+ /// |key, left, right| Some(left + right)
+ /// ));
+ /// ```
+ #[must_use]
+ pub fn symmetric_difference_with_key<F>(mut self, other: Self, mut f: F) -> Self
+ where
+ F: FnMut(&K, V, V) -> Option<V>,
+ {
+ let mut out = Self::default();
+ for (key, right_value) in other {
+ match self.remove(&key) {
+ None => {
+ out.insert(key, right_value);
+ }
+ Some(left_value) => {
+ if let Some(final_value) = f(&key, left_value, right_value) {
+ out.insert(key, final_value);
+ }
+ }
+ }
+ }
+ out.union(self)
+ }
+
+ /// Construct the relative complement between two maps by discarding keys
+ /// which occur in `other`.
+ ///
+ /// Time: O(m log n) where m is the size of the other map
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 3 => 4};
+ /// let map2 = ordmap!{2 => 2, 3 => 5};
+ /// let expected = ordmap!{1 => 1};
+ /// assert_eq!(expected, map1.relative_complement(map2));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn relative_complement(mut self, other: Self) -> Self {
+ for (key, _) in other {
+ let _ = self.remove(&key);
+ }
+ self
+ }
+
+ /// Construct the intersection of two maps, keeping the values
+ /// from the current map.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 2 => 2};
+ /// let map2 = ordmap!{2 => 3, 3 => 4};
+ /// let expected = ordmap!{2 => 2};
+ /// assert_eq!(expected, map1.intersection(map2));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn intersection(self, other: Self) -> Self {
+ self.intersection_with_key(other, |_, v, _| v)
+ }
+
+ /// Construct the intersection of two maps, calling a function
+ /// with both values for each key and using the result as the
+ /// value for the key.
+ ///
+ /// Time: O(n log n)
+ #[inline]
+ #[must_use]
+ pub fn intersection_with<B, C, F>(self, other: OrdMap<K, B>, mut f: F) -> OrdMap<K, C>
+ where
+ B: Clone,
+ C: Clone,
+ F: FnMut(V, B) -> C,
+ {
+ self.intersection_with_key(other, |_, v1, v2| f(v1, v2))
+ }
+
+ /// Construct the intersection of two maps, calling a function
+ /// with the key and both values for each key and using the result
+ /// as the value for the key.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordmap::OrdMap;
+ /// let map1 = ordmap!{1 => 1, 2 => 2};
+ /// let map2 = ordmap!{2 => 3, 3 => 4};
+ /// let expected = ordmap!{2 => 5};
+ /// assert_eq!(expected, map1.intersection_with_key(
+ /// map2,
+ /// |key, left, right| left + right
+ /// ));
+ /// ```
+ #[must_use]
+ pub fn intersection_with_key<B, C, F>(mut self, other: OrdMap<K, B>, mut f: F) -> OrdMap<K, C>
+ where
+ B: Clone,
+ C: Clone,
+ F: FnMut(&K, V, B) -> C,
+ {
+ let mut out = OrdMap::<K, C>::default();
+ for (key, right_value) in other {
+ match self.remove(&key) {
+ None => (),
+ Some(left_value) => {
+ let result = f(&key, left_value, right_value);
+ out.insert(key, result);
+ }
+ }
+ }
+ out
+ }
+
+ /// Split a map into two, with the left hand map containing keys
+ /// which are smaller than `split`, and the right hand map
+ /// containing keys which are larger than `split`.
+ ///
+ /// The `split` mapping is discarded.
+ #[must_use]
+ pub fn split<BK>(&self, split: &BK) -> (Self, Self)
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ let (l, _, r) = self.split_lookup(split);
+ (l, r)
+ }
+
+ /// Split a map into two, with the left hand map containing keys
+ /// which are smaller than `split`, and the right hand map
+ /// containing keys which are larger than `split`.
+ ///
+ /// Returns both the two maps and the value of `split`.
+ #[must_use]
+ pub fn split_lookup<BK>(&self, split: &BK) -> (Self, Option<V>, Self)
+ where
+ BK: Ord + ?Sized,
+ K: Borrow<BK>,
+ {
+ // TODO this is atrociously slow, got to be a better way
+ self.iter()
+ .fold((ordmap![], None, ordmap![]), |(l, m, r), (k, v)| {
+ match k.borrow().cmp(split) {
+ Ordering::Less => (l.update(k.clone(), v.clone()), m, r),
+ Ordering::Equal => (l, Some(v.clone()), r),
+ Ordering::Greater => (l, m, r.update(k.clone(), v.clone())),
+ }
+ })
+ }
+
+ /// Construct a map with only the `n` smallest keys from a given
+ /// map.
+ #[must_use]
+ pub fn take(&self, n: usize) -> Self {
+ self.iter()
+ .take(n)
+ .map(|(k, v)| (k.clone(), v.clone()))
+ .collect()
+ }
+
+ /// Construct a map with the `n` smallest keys removed from a
+ /// given map.
+ #[must_use]
+ pub fn skip(&self, n: usize) -> Self {
+ self.iter()
+ .skip(n)
+ .map(|(k, v)| (k.clone(), v.clone()))
+ .collect()
+ }
+
+ /// Remove the smallest key from a map, and return its value as
+ /// well as the updated map.
+ #[must_use]
+ pub fn without_min(&self) -> (Option<V>, Self) {
+ let (pop, next) = self.without_min_with_key();
+ (pop.map(|(_, v)| v), next)
+ }
+
+ /// Remove the smallest key from a map, and return that key, its
+ /// value as well as the updated map.
+ #[must_use]
+ pub fn without_min_with_key(&self) -> (Option<(K, V)>, Self) {
+ match self.get_min() {
+ None => (None, self.clone()),
+ Some((k, _)) => {
+ let (key, value, next) = self.extract_with_key(k).unwrap();
+ (Some((key, value)), next)
+ }
+ }
+ }
+
+ /// Remove the largest key from a map, and return its value as
+ /// well as the updated map.
+ #[must_use]
+ pub fn without_max(&self) -> (Option<V>, Self) {
+ let (pop, next) = self.without_max_with_key();
+ (pop.map(|(_, v)| v), next)
+ }
+
+ /// Remove the largest key from a map, and return that key, its
+ /// value as well as the updated map.
+ #[must_use]
+ pub fn without_max_with_key(&self) -> (Option<(K, V)>, Self) {
+ match self.get_max() {
+ None => (None, self.clone()),
+ Some((k, _)) => {
+ let (key, value, next) = self.extract_with_key(k).unwrap();
+ (Some((key, value)), next)
+ }
+ }
+ }
+
+ /// Get the [`Entry`][Entry] for a key in the map for in-place manipulation.
+ ///
+ /// Time: O(log n)
+ ///
+ /// [Entry]: enum.Entry.html
+ #[must_use]
+ pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
+ if self.contains_key(&key) {
+ Entry::Occupied(OccupiedEntry { map: self, key })
+ } else {
+ Entry::Vacant(VacantEntry { map: self, key })
+ }
+ }
+}
+
+// Entries
+
+/// A handle for a key and its associated value.
+pub enum Entry<'a, K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ /// An entry which exists in the map.
+ Occupied(OccupiedEntry<'a, K, V>),
+ /// An entry which doesn't exist in the map.
+ Vacant(VacantEntry<'a, K, V>),
+}
+
+impl<'a, K, V> Entry<'a, K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ /// Insert the default value provided if there was no value
+ /// already, and return a mutable reference to the value.
+ pub fn or_insert(self, default: V) -> &'a mut V {
+ self.or_insert_with(|| default)
+ }
+
+ /// Insert the default value from the provided function if there
+ /// was no value already, and return a mutable reference to the
+ /// value.
+ pub fn or_insert_with<F>(self, default: F) -> &'a mut V
+ where
+ F: FnOnce() -> V,
+ {
+ match self {
+ Entry::Occupied(entry) => entry.into_mut(),
+ Entry::Vacant(entry) => entry.insert(default()),
+ }
+ }
+
+ /// Insert a default value if there was no value already, and
+ /// return a mutable reference to the value.
+ pub fn or_default(self) -> &'a mut V
+ where
+ V: Default,
+ {
+ self.or_insert_with(Default::default)
+ }
+
+ /// Get the key for this entry.
+ #[must_use]
+ pub fn key(&self) -> &K {
+ match self {
+ Entry::Occupied(entry) => entry.key(),
+ Entry::Vacant(entry) => entry.key(),
+ }
+ }
+
+ /// Call the provided function to modify the value if the value
+ /// exists.
+ pub fn and_modify<F>(mut self, f: F) -> Self
+ where
+ F: FnOnce(&mut V),
+ {
+ match &mut self {
+ Entry::Occupied(ref mut entry) => f(entry.get_mut()),
+ Entry::Vacant(_) => (),
+ }
+ self
+ }
+}
+
+/// An entry for a mapping that already exists in the map.
+pub struct OccupiedEntry<'a, K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ map: &'a mut OrdMap<K, V>,
+ key: K,
+}
+
+impl<'a, K, V> OccupiedEntry<'a, K, V>
+where
+ K: 'a + Ord + Clone,
+ V: 'a + Clone,
+{
+ /// Get the key for this entry.
+ #[must_use]
+ pub fn key(&self) -> &K {
+ &self.key
+ }
+
+ /// Remove this entry from the map and return the removed mapping.
+ pub fn remove_entry(self) -> (K, V) {
+ self.map
+ .remove_with_key(&self.key)
+ .expect("ordmap::OccupiedEntry::remove_entry: key has vanished!")
+ }
+
+ /// Get the current value.
+ #[must_use]
+ pub fn get(&self) -> &V {
+ self.map.get(&self.key).unwrap()
+ }
+
+ /// Get a mutable reference to the current value.
+ #[must_use]
+ pub fn get_mut(&mut self) -> &mut V {
+ self.map.get_mut(&self.key).unwrap()
+ }
+
+ /// Convert this entry into a mutable reference.
+ #[must_use]
+ pub fn into_mut(self) -> &'a mut V {
+ self.map.get_mut(&self.key).unwrap()
+ }
+
+ /// Overwrite the current value.
+ pub fn insert(&mut self, value: V) -> V {
+ mem::replace(self.get_mut(), value)
+ }
+
+ /// Remove this entry from the map and return the removed value.
+ pub fn remove(self) -> V {
+ self.remove_entry().1
+ }
+}
+
+/// An entry for a mapping that does not already exist in the map.
+pub struct VacantEntry<'a, K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ map: &'a mut OrdMap<K, V>,
+ key: K,
+}
+
+impl<'a, K, V> VacantEntry<'a, K, V>
+where
+ K: 'a + Ord + Clone,
+ V: 'a + Clone,
+{
+ /// Get the key for this entry.
+ #[must_use]
+ pub fn key(&self) -> &K {
+ &self.key
+ }
+
+ /// Convert this entry into its key.
+ #[must_use]
+ pub fn into_key(self) -> K {
+ self.key
+ }
+
+ /// Insert a value into this entry.
+ pub fn insert(self, value: V) -> &'a mut V {
+ self.map.insert(self.key.clone(), value);
+ // TODO insert_mut ought to return this reference
+ self.map.get_mut(&self.key).unwrap()
+ }
+}
+
+// Core traits
+
+impl<K, V> Clone for OrdMap<K, V> {
+ /// Clone a map.
+ ///
+ /// Time: O(1)
+ #[inline]
+ fn clone(&self) -> Self {
+ OrdMap {
+ size: self.size,
+ pool: self.pool.clone(),
+ root: self.root.clone(),
+ }
+ }
+}
+
+#[cfg(not(has_specialisation))]
+impl<K, V> PartialEq for OrdMap<K, V>
+where
+ K: Ord + PartialEq,
+ V: PartialEq,
+{
+ fn eq(&self, other: &Self) -> bool {
+ self.len() == other.len() && self.diff(other).next().is_none()
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<K, V> PartialEq for OrdMap<K, V>
+where
+ K: Ord + PartialEq,
+ V: PartialEq,
+{
+ default fn eq(&self, other: &Self) -> bool {
+ self.len() == other.len() && self.diff(other).next().is_none()
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<K, V> PartialEq for OrdMap<K, V>
+where
+ K: Ord + Eq,
+ V: Eq,
+{
+ fn eq(&self, other: &Self) -> bool {
+ PoolRef::ptr_eq(&self.root, &other.root)
+ || (self.len() == other.len() && self.diff(other).next().is_none())
+ }
+}
+
+impl<K: Ord + Eq, V: Eq> Eq for OrdMap<K, V> {}
+
+impl<K, V> PartialOrd for OrdMap<K, V>
+where
+ K: Ord,
+ V: PartialOrd,
+{
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ self.iter().partial_cmp(other.iter())
+ }
+}
+
+impl<K, V> Ord for OrdMap<K, V>
+where
+ K: Ord,
+ V: Ord,
+{
+ fn cmp(&self, other: &Self) -> Ordering {
+ self.iter().cmp(other.iter())
+ }
+}
+
+impl<K, V> Hash for OrdMap<K, V>
+where
+ K: Ord + Hash,
+ V: Hash,
+{
+ fn hash<H>(&self, state: &mut H)
+ where
+ H: Hasher,
+ {
+ for i in self.iter() {
+ i.hash(state);
+ }
+ }
+}
+
+impl<K, V> Default for OrdMap<K, V> {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl<'a, K, V> Add for &'a OrdMap<K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ type Output = OrdMap<K, V>;
+
+ fn add(self, other: Self) -> Self::Output {
+ self.clone().union(other.clone())
+ }
+}
+
+impl<K, V> Add for OrdMap<K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ type Output = OrdMap<K, V>;
+
+ fn add(self, other: Self) -> Self::Output {
+ self.union(other)
+ }
+}
+
+impl<K, V> Sum for OrdMap<K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ fn sum<I>(it: I) -> Self
+ where
+ I: Iterator<Item = Self>,
+ {
+ it.fold(Self::default(), |a, b| a + b)
+ }
+}
+
+impl<K, V, RK, RV> Extend<(RK, RV)> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<RK>,
+ V: Clone + From<RV>,
+{
+ fn extend<I>(&mut self, iter: I)
+ where
+ I: IntoIterator<Item = (RK, RV)>,
+ {
+ for (key, value) in iter {
+ self.insert(From::from(key), From::from(value));
+ }
+ }
+}
+
+impl<'a, BK, K, V> Index<&'a BK> for OrdMap<K, V>
+where
+ BK: Ord + ?Sized,
+ K: Ord + Borrow<BK>,
+{
+ type Output = V;
+
+ fn index(&self, key: &BK) -> &Self::Output {
+ match self.root.lookup(key) {
+ None => panic!("OrdMap::index: invalid key"),
+ Some(&(_, ref value)) => value,
+ }
+ }
+}
+
+impl<'a, BK, K, V> IndexMut<&'a BK> for OrdMap<K, V>
+where
+ BK: Ord + ?Sized,
+ K: Ord + Clone + Borrow<BK>,
+ V: Clone,
+{
+ fn index_mut(&mut self, key: &BK) -> &mut Self::Output {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ match root.lookup_mut(&self.pool.0, key) {
+ None => panic!("OrdMap::index: invalid key"),
+ Some(&mut (_, ref mut value)) => value,
+ }
+ }
+}
+
+impl<K, V> Debug for OrdMap<K, V>
+where
+ K: Ord + Debug,
+ V: Debug,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ let mut d = f.debug_map();
+ for (k, v) in self.iter() {
+ d.entry(k, v);
+ }
+ d.finish()
+ }
+}
+
+// Iterators
+
+/// An iterator over the key/value pairs of a map.
+pub struct Iter<'a, K, V> {
+ it: RangedIter<'a, (K, V)>,
+}
+
+impl<'a, K, V> Iterator for Iter<'a, K, V>
+where
+ (K, V): 'a + BTreeValue,
+{
+ type Item = (&'a K, &'a V);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|(k, v)| (k, v))
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (self.it.remaining, Some(self.it.remaining))
+ }
+}
+
+impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V>
+where
+ (K, V): 'a + BTreeValue,
+{
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.it.next_back().map(|(k, v)| (k, v))
+ }
+}
+
+impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> where (K, V): 'a + BTreeValue {}
+
+/// An iterator over the differences between two maps.
+pub struct DiffIter<'a, K, V> {
+ it: NodeDiffIter<'a, (K, V)>,
+}
+
+/// A description of a difference between two ordered maps.
+#[derive(PartialEq, Eq, Debug)]
+pub enum DiffItem<'a, K, V> {
+ /// This value has been added to the new map.
+ Add(&'a K, &'a V),
+ /// This value has been changed between the two maps.
+ Update {
+ /// The old value.
+ old: (&'a K, &'a V),
+ /// The new value.
+ new: (&'a K, &'a V),
+ },
+ /// This value has been removed from the new map.
+ Remove(&'a K, &'a V),
+}
+
+impl<'a, K, V> Iterator for DiffIter<'a, K, V>
+where
+ (K, V): 'a + BTreeValue + PartialEq,
+{
+ type Item = DiffItem<'a, K, V>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|item| match item {
+ NodeDiffItem::Add((k, v)) => DiffItem::Add(k, v),
+ NodeDiffItem::Update {
+ old: (oldk, oldv),
+ new: (newk, newv),
+ } => DiffItem::Update {
+ old: (oldk, oldv),
+ new: (newk, newv),
+ },
+ NodeDiffItem::Remove((k, v)) => DiffItem::Remove(k, v),
+ })
+ }
+}
+
+/// An iterator ove the keys of a map.
+pub struct Keys<'a, K, V> {
+ it: Iter<'a, K, V>,
+}
+
+impl<'a, K, V> Iterator for Keys<'a, K, V>
+where
+ K: 'a + Ord,
+ V: 'a,
+{
+ type Item = &'a K;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|(k, _)| k)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V>
+where
+ K: 'a + Ord,
+ V: 'a,
+{
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.it.next_back().map(|(k, _)| k)
+ }
+}
+
+impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V>
+where
+ K: 'a + Ord,
+ V: 'a,
+{
+}
+
+/// An iterator over the values of a map.
+pub struct Values<'a, K, V> {
+ it: Iter<'a, K, V>,
+}
+
+impl<'a, K, V> Iterator for Values<'a, K, V>
+where
+ K: 'a + Ord,
+ V: 'a,
+{
+ type Item = &'a V;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|(_, v)| v)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V>
+where
+ K: 'a + Ord,
+ V: 'a,
+{
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.it.next_back().map(|(_, v)| v)
+ }
+}
+
+impl<'a, K, V> ExactSizeIterator for Values<'a, K, V>
+where
+ K: 'a + Ord,
+ V: 'a,
+{
+}
+
+impl<K, V, RK, RV> FromIterator<(RK, RV)> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<RK>,
+ V: Clone + From<RV>,
+{
+ fn from_iter<T>(i: T) -> Self
+ where
+ T: IntoIterator<Item = (RK, RV)>,
+ {
+ let mut m = OrdMap::default();
+ for (k, v) in i {
+ m.insert(From::from(k), From::from(v));
+ }
+ m
+ }
+}
+
+impl<'a, K, V> IntoIterator for &'a OrdMap<K, V>
+where
+ K: Ord,
+{
+ type Item = (&'a K, &'a V);
+ type IntoIter = Iter<'a, K, V>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
+impl<K, V> IntoIterator for OrdMap<K, V>
+where
+ K: Ord + Clone,
+ V: Clone,
+{
+ type Item = (K, V);
+ type IntoIter = ConsumingIter<(K, V)>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ ConsumingIter::new(&self.root, self.size)
+ }
+}
+
+// Conversions
+
+impl<K, V> AsRef<OrdMap<K, V>> for OrdMap<K, V> {
+ fn as_ref(&self) -> &Self {
+ self
+ }
+}
+
+impl<'m, 'k, 'v, K, V, OK, OV> From<&'m OrdMap<&'k K, &'v V>> for OrdMap<OK, OV>
+where
+ K: Ord + ToOwned<Owned = OK> + ?Sized,
+ V: ToOwned<Owned = OV> + ?Sized,
+ OK: Ord + Clone + Borrow<K>,
+ OV: Clone + Borrow<V>,
+{
+ fn from(m: &OrdMap<&K, &V>) -> Self {
+ m.iter()
+ .map(|(k, v)| ((*k).to_owned(), (*v).to_owned()))
+ .collect()
+ }
+}
+
+impl<'a, K, V, RK, RV, OK, OV> From<&'a [(RK, RV)]> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<OK>,
+ V: Clone + From<OV>,
+ OK: Borrow<RK>,
+ OV: Borrow<RV>,
+ RK: ToOwned<Owned = OK>,
+ RV: ToOwned<Owned = OV>,
+{
+ fn from(m: &'a [(RK, RV)]) -> OrdMap<K, V> {
+ m.iter()
+ .map(|&(ref k, ref v)| (k.to_owned(), v.to_owned()))
+ .collect()
+ }
+}
+
+impl<K, V, RK, RV> From<Vec<(RK, RV)>> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<RK>,
+ V: Clone + From<RV>,
+{
+ fn from(m: Vec<(RK, RV)>) -> OrdMap<K, V> {
+ m.into_iter().collect()
+ }
+}
+
+impl<'a, K: Ord, V, RK, RV, OK, OV> From<&'a Vec<(RK, RV)>> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<OK>,
+ V: Clone + From<OV>,
+ OK: Borrow<RK>,
+ OV: Borrow<RV>,
+ RK: ToOwned<Owned = OK>,
+ RV: ToOwned<Owned = OV>,
+{
+ fn from(m: &'a Vec<(RK, RV)>) -> OrdMap<K, V> {
+ m.iter()
+ .map(|&(ref k, ref v)| (k.to_owned(), v.to_owned()))
+ .collect()
+ }
+}
+
+impl<K: Ord, V, RK: Eq + Hash, RV> From<collections::HashMap<RK, RV>> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<RK>,
+ V: Clone + From<RV>,
+{
+ fn from(m: collections::HashMap<RK, RV>) -> OrdMap<K, V> {
+ m.into_iter().collect()
+ }
+}
+
+impl<'a, K, V, OK, OV, RK, RV> From<&'a collections::HashMap<RK, RV>> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<OK>,
+ V: Clone + From<OV>,
+ OK: Borrow<RK>,
+ OV: Borrow<RV>,
+ RK: Hash + Eq + ToOwned<Owned = OK>,
+ RV: ToOwned<Owned = OV>,
+{
+ fn from(m: &'a collections::HashMap<RK, RV>) -> OrdMap<K, V> {
+ m.iter()
+ .map(|(k, v)| (k.to_owned(), v.to_owned()))
+ .collect()
+ }
+}
+
+impl<K: Ord, V, RK, RV> From<collections::BTreeMap<RK, RV>> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<RK>,
+ V: Clone + From<RV>,
+{
+ fn from(m: collections::BTreeMap<RK, RV>) -> OrdMap<K, V> {
+ m.into_iter().collect()
+ }
+}
+
+impl<'a, K: Ord, V, RK, RV, OK, OV> From<&'a collections::BTreeMap<RK, RV>> for OrdMap<K, V>
+where
+ K: Ord + Clone + From<OK>,
+ V: Clone + From<OV>,
+ OK: Borrow<RK>,
+ OV: Borrow<RV>,
+ RK: Ord + ToOwned<Owned = OK>,
+ RV: ToOwned<Owned = OV>,
+{
+ fn from(m: &'a collections::BTreeMap<RK, RV>) -> OrdMap<K, V> {
+ m.iter()
+ .map(|(k, v)| (k.to_owned(), v.to_owned()))
+ .collect()
+ }
+}
+
+impl<K: Ord + Hash + Eq + Clone, V: Clone, S: BuildHasher> From<HashMap<K, V, S>> for OrdMap<K, V> {
+ fn from(m: HashMap<K, V, S>) -> Self {
+ m.into_iter().collect()
+ }
+}
+
+impl<'a, K: Ord + Hash + Eq + Clone, V: Clone, S: BuildHasher> From<&'a HashMap<K, V, S>>
+ for OrdMap<K, V>
+{
+ fn from(m: &'a HashMap<K, V, S>) -> Self {
+ m.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
+ }
+}
+
+// Proptest
+#[cfg(any(test, feature = "proptest"))]
+#[doc(hidden)]
+pub mod proptest {
+ #[deprecated(
+ since = "14.3.0",
+ note = "proptest strategies have moved to im::proptest"
+ )]
+ pub use crate::proptest::ord_map;
+}
+
+// Tests
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ use crate::proptest::*;
+ use crate::test::is_sorted;
+ use ::proptest::num::{i16, usize};
+ use ::proptest::{bool, collection, proptest};
+
+ #[test]
+ fn iterates_in_order() {
+ let map = ordmap! {
+ 2 => 22,
+ 1 => 11,
+ 3 => 33,
+ 8 => 88,
+ 9 => 99,
+ 4 => 44,
+ 5 => 55,
+ 7 => 77,
+ 6 => 66
+ };
+ let mut it = map.iter();
+ assert_eq!(it.next(), Some((&1, &11)));
+ assert_eq!(it.next(), Some((&2, &22)));
+ assert_eq!(it.next(), Some((&3, &33)));
+ assert_eq!(it.next(), Some((&4, &44)));
+ assert_eq!(it.next(), Some((&5, &55)));
+ assert_eq!(it.next(), Some((&6, &66)));
+ assert_eq!(it.next(), Some((&7, &77)));
+ assert_eq!(it.next(), Some((&8, &88)));
+ assert_eq!(it.next(), Some((&9, &99)));
+ assert_eq!(it.next(), None);
+ }
+
+ #[test]
+ fn into_iter() {
+ let map = ordmap! {
+ 2 => 22,
+ 1 => 11,
+ 3 => 33,
+ 8 => 88,
+ 9 => 99,
+ 4 => 44,
+ 5 => 55,
+ 7 => 77,
+ 6 => 66
+ };
+ let mut vec = vec![];
+ for (k, v) in map {
+ assert_eq!(k * 11, v);
+ vec.push(k)
+ }
+ assert_eq!(vec, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
+ }
+
+ #[test]
+ fn deletes_correctly() {
+ let map = ordmap! {
+ 2 => 22,
+ 1 => 11,
+ 3 => 33,
+ 8 => 88,
+ 9 => 99,
+ 4 => 44,
+ 5 => 55,
+ 7 => 77,
+ 6 => 66
+ };
+ assert_eq!(map.extract(&11), None);
+ let (popped, less) = map.extract(&5).unwrap();
+ assert_eq!(popped, 55);
+ let mut it = less.iter();
+ assert_eq!(it.next(), Some((&1, &11)));
+ assert_eq!(it.next(), Some((&2, &22)));
+ assert_eq!(it.next(), Some((&3, &33)));
+ assert_eq!(it.next(), Some((&4, &44)));
+ assert_eq!(it.next(), Some((&6, &66)));
+ assert_eq!(it.next(), Some((&7, &77)));
+ assert_eq!(it.next(), Some((&8, &88)));
+ assert_eq!(it.next(), Some((&9, &99)));
+ assert_eq!(it.next(), None);
+ }
+
+ #[test]
+ fn debug_output() {
+ assert_eq!(
+ format!("{:?}", ordmap! { 3 => 4, 5 => 6, 1 => 2 }),
+ "{1: 2, 3: 4, 5: 6}"
+ );
+ }
+
+ #[test]
+ fn equality2() {
+ let v1 = "1".to_string();
+ let v2 = "1".to_string();
+ assert_eq!(v1, v2);
+ let p1 = Vec::<String>::new();
+ let p2 = Vec::<String>::new();
+ assert_eq!(p1, p2);
+ let c1 = OrdMap::unit(v1, p1);
+ let c2 = OrdMap::unit(v2, p2);
+ assert_eq!(c1, c2);
+ }
+
+ #[test]
+ fn insert_remove_single_mut() {
+ let mut m = OrdMap::new();
+ m.insert(0, 0);
+ assert_eq!(OrdMap::unit(0, 0), m);
+ m.remove(&0);
+ assert_eq!(OrdMap::new(), m);
+ }
+
+ #[test]
+ fn double_ended_iterator_1() {
+ let m = ordmap! {1 => 1, 2 => 2, 3 => 3, 4 => 4};
+ let mut it = m.iter();
+ assert_eq!(Some((&1, &1)), it.next());
+ assert_eq!(Some((&4, &4)), it.next_back());
+ assert_eq!(Some((&2, &2)), it.next());
+ assert_eq!(Some((&3, &3)), it.next_back());
+ assert_eq!(None, it.next());
+ }
+
+ #[test]
+ fn double_ended_iterator_2() {
+ let m = ordmap! {1 => 1, 2 => 2, 3 => 3, 4 => 4};
+ let mut it = m.iter();
+ assert_eq!(Some((&1, &1)), it.next());
+ assert_eq!(Some((&4, &4)), it.next_back());
+ assert_eq!(Some((&2, &2)), it.next());
+ assert_eq!(Some((&3, &3)), it.next_back());
+ assert_eq!(None, it.next_back());
+ }
+
+ #[test]
+ fn safe_mutation() {
+ let v1 = (0..131_072).map(|i| (i, i)).collect::<OrdMap<_, _>>();
+ let mut v2 = v1.clone();
+ v2.insert(131_000, 23);
+ assert_eq!(Some(&23), v2.get(&131_000));
+ assert_eq!(Some(&131_000), v1.get(&131_000));
+ }
+
+ #[test]
+ fn index_operator() {
+ let mut map = ordmap! {1 => 2, 3 => 4, 5 => 6};
+ assert_eq!(4, map[&3]);
+ map[&3] = 8;
+ assert_eq!(ordmap! {1 => 2, 3 => 8, 5 => 6}, map);
+ }
+
+ #[test]
+ fn entry_api() {
+ let mut map = ordmap! {"bar" => 5};
+ map.entry("foo").and_modify(|v| *v += 5).or_insert(1);
+ assert_eq!(1, map[&"foo"]);
+ map.entry("foo").and_modify(|v| *v += 5).or_insert(1);
+ assert_eq!(6, map[&"foo"]);
+ map.entry("bar").and_modify(|v| *v += 5).or_insert(1);
+ assert_eq!(10, map[&"bar"]);
+ assert_eq!(
+ 10,
+ match map.entry("bar") {
+ Entry::Occupied(entry) => entry.remove(),
+ _ => panic!(),
+ }
+ );
+ assert!(!map.contains_key(&"bar"));
+ }
+
+ #[test]
+ fn match_string_keys_with_string_slices() {
+ let mut map: OrdMap<String, i32> =
+ From::from(&ordmap! { "foo" => &1, "bar" => &2, "baz" => &3 });
+ assert_eq!(Some(&1), map.get("foo"));
+ map = map.without("foo");
+ assert_eq!(Some(3), map.remove("baz"));
+ map["bar"] = 8;
+ assert_eq!(8, map["bar"]);
+ }
+
+ #[test]
+ fn ranged_iter() {
+ let map: OrdMap<i32, i32> = ordmap![1=>2, 2=>3, 3=>4, 4=>5, 5=>6, 7=>8];
+ let range: Vec<(i32, i32)> = map.range(..).map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (7, 8)], range);
+ let range: Vec<(i32, i32)> = map.range(..).rev().map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(7, 8), (5, 6), (4, 5), (3, 4), (2, 3), (1, 2)], range);
+ let range: Vec<(i32, i32)> = map.range(2..5).map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(2, 3), (3, 4), (4, 5)], range);
+ let range: Vec<(i32, i32)> = map.range(2..5).rev().map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(4, 5), (3, 4), (2, 3)], range);
+ let range: Vec<(i32, i32)> = map.range(3..).map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(3, 4), (4, 5), (5, 6), (7, 8)], range);
+ let range: Vec<(i32, i32)> = map.range(3..).rev().map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(7, 8), (5, 6), (4, 5), (3, 4)], range);
+ let range: Vec<(i32, i32)> = map.range(..4).map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(1, 2), (2, 3), (3, 4)], range);
+ let range: Vec<(i32, i32)> = map.range(..4).rev().map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(3, 4), (2, 3), (1, 2)], range);
+ let range: Vec<(i32, i32)> = map.range(..=3).map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(1, 2), (2, 3), (3, 4)], range);
+ let range: Vec<(i32, i32)> = map.range(..=3).rev().map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(3, 4), (2, 3), (1, 2)], range);
+ let range: Vec<(i32, i32)> = map.range(..6).map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)], range);
+ let range: Vec<(i32, i32)> = map.range(..=6).map(|(k, v)| (*k, *v)).collect();
+ assert_eq!(vec![(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)], range);
+ }
+
+ #[test]
+ fn range_iter_big() {
+ use crate::nodes::btree::NODE_SIZE;
+ use std::ops::Bound::Included;
+ const N: usize = NODE_SIZE * NODE_SIZE * 5; // enough for a sizeable 3 level tree
+
+ let data = (1usize..N).filter(|i| i % 2 == 0).map(|i| (i, ()));
+ let bmap = data
+ .clone()
+ .collect::<std::collections::BTreeMap<usize, ()>>();
+ let omap = data.collect::<OrdMap<usize, ()>>();
+
+ for i in (0..NODE_SIZE * 5).chain(N - NODE_SIZE * 5..=N + 1) {
+ assert_eq!(omap.range(i..).count(), bmap.range(i..).count());
+ assert_eq!(omap.range(..i).count(), bmap.range(..i).count());
+ assert_eq!(omap.range(i..i + 7).count(), bmap.range(i..i + 7).count());
+ assert_eq!(omap.range(i..=i + 7).count(), bmap.range(i..=i + 7).count());
+ assert_eq!(
+ omap.range((Included(i), Included(i + 7))).count(),
+ bmap.range((Included(i), Included(i + 7))).count(),
+ );
+ }
+ }
+
+ #[test]
+ fn issue_124() {
+ let mut map = OrdMap::new();
+ let contents = include_str!("test-fixtures/issue_124.txt");
+ for line in contents.lines() {
+ if line.starts_with("insert ") {
+ map.insert(line[7..].parse::<u32>().unwrap(), 0);
+ } else if line.starts_with("remove ") {
+ map.remove(&line[7..].parse::<u32>().unwrap());
+ }
+ }
+ }
+
+ proptest! {
+ #[test]
+ fn length(ref input in collection::btree_map(i16::ANY, i16::ANY, 0..1000)) {
+ let map: OrdMap<i32, i32> = OrdMap::from(input.clone());
+ assert_eq!(input.len(), map.len());
+ }
+
+ #[test]
+ fn order(ref input in collection::hash_map(i16::ANY, i16::ANY, 0..1000)) {
+ let map: OrdMap<i32, i32> = OrdMap::from(input.clone());
+ assert!(is_sorted(map.keys()));
+ }
+
+ #[test]
+ fn overwrite_values(ref vec in collection::vec((i16::ANY, i16::ANY), 1..1000), index_rand in usize::ANY, new_val in i16::ANY) {
+ let index = vec[index_rand % vec.len()].0;
+ let map1 = OrdMap::from_iter(vec.clone());
+ let map2 = map1.update(index, new_val);
+ for (k, v) in map2 {
+ if k == index {
+ assert_eq!(v, new_val);
+ } else {
+ match map1.get(&k) {
+ None => panic!("map1 didn't have key {:?}", k),
+ Some(other_v) => {
+ assert_eq!(v, *other_v);
+ }
+ }
+ }
+ }
+ }
+
+ #[test]
+ fn delete_values(ref vec in collection::vec((usize::ANY, usize::ANY), 1..1000), index_rand in usize::ANY) {
+ let index = vec[index_rand % vec.len()].0;
+ let map1: OrdMap<usize, usize> = OrdMap::from_iter(vec.clone());
+ let map2 = map1.without(&index);
+ assert_eq!(map1.len(), map2.len() + 1);
+ for k in map2.keys() {
+ assert_ne!(*k, index);
+ }
+ }
+
+ #[test]
+ fn insert_and_delete_values(
+ ref input in ord_map(0usize..64, 0usize..64, 1..1000),
+ ref ops in collection::vec((bool::ANY, usize::ANY, usize::ANY), 1..1000)
+ ) {
+ let mut map = input.clone();
+ let mut tree: collections::BTreeMap<usize, usize> = input.iter().map(|(k, v)| (*k, *v)).collect();
+ for (ins, key, val) in ops {
+ if *ins {
+ tree.insert(*key, *val);
+ map = map.update(*key, *val)
+ } else {
+ tree.remove(key);
+ map = map.without(key)
+ }
+ }
+ assert!(map.iter().map(|(k, v)| (*k, *v)).eq(tree.iter().map(|(k, v)| (*k, *v))));
+ }
+
+ #[test]
+ fn proptest_works(ref m in ord_map(0..9999, ".*", 10..100)) {
+ assert!(m.len() < 100);
+ assert!(m.len() >= 10);
+ }
+
+ #[test]
+ fn insert_and_length(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..1000)) {
+ let mut map: OrdMap<i16, i16> = OrdMap::new();
+ for (k, v) in m.iter() {
+ map = map.update(*k, *v)
+ }
+ assert_eq!(m.len(), map.len());
+ }
+
+ #[test]
+ fn from_iterator(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..1000)) {
+ let map: OrdMap<i16, i16> =
+ FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ assert_eq!(m.len(), map.len());
+ }
+
+ #[test]
+ fn iterate_over(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..1000)) {
+ let map: OrdMap<i16, i16> =
+ FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ assert_eq!(m.len(), map.iter().count());
+ }
+
+ #[test]
+ fn equality(ref m in collection::hash_map(i16::ANY, i16::ANY, 0..1000)) {
+ let map1: OrdMap<i16, i16> =
+ FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ let map2: OrdMap<i16, i16> =
+ FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ assert_eq!(map1, map2);
+ }
+
+ #[test]
+ fn lookup(ref m in ord_map(i16::ANY, i16::ANY, 0..1000)) {
+ let map: OrdMap<i16, i16> =
+ FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ for (k, v) in m.iter() {
+ assert_eq!(Some(*v), map.get(k).cloned());
+ }
+ }
+
+ #[test]
+ fn remove(ref m in ord_map(i16::ANY, i16::ANY, 0..1000)) {
+ let mut map: OrdMap<i16, i16> =
+ FromIterator::from_iter(m.iter().map(|(k, v)| (*k, *v)));
+ for k in m.keys() {
+ let l = map.len();
+ assert_eq!(m.get(k).cloned(), map.get(k).cloned());
+ map = map.without(k);
+ assert_eq!(None, map.get(k));
+ assert_eq!(l - 1, map.len());
+ }
+ }
+
+ #[test]
+ fn insert_mut(ref m in ord_map(i16::ANY, i16::ANY, 0..1000)) {
+ let mut mut_map = OrdMap::new();
+ let mut map = OrdMap::new();
+ for (k, v) in m.iter() {
+ map = map.update(*k, *v);
+ mut_map.insert(*k, *v);
+ }
+ assert_eq!(map, mut_map);
+ }
+
+ #[test]
+ fn remove_mut(ref orig in ord_map(i16::ANY, i16::ANY, 0..1000)) {
+ let mut map = orig.clone();
+ for key in orig.keys() {
+ let len = map.len();
+ assert_eq!(orig.get(key), map.get(key));
+ assert_eq!(orig.get(key).cloned(), map.remove(key));
+ assert_eq!(None, map.get(key));
+ assert_eq!(len - 1, map.len());
+ }
+ }
+
+ #[test]
+ fn remove_alien(ref orig in collection::hash_map(i16::ANY, i16::ANY, 0..1000)) {
+ let mut map = OrdMap::<i16, i16>::from(orig.clone());
+ for key in orig.keys() {
+ let len = map.len();
+ assert_eq!(orig.get(key), map.get(key));
+ assert_eq!(orig.get(key).cloned(), map.remove(key));
+ assert_eq!(None, map.get(key));
+ assert_eq!(len - 1, map.len());
+ }
+ }
+
+ #[test]
+ fn delete_and_reinsert(
+ ref input in collection::hash_map(i16::ANY, i16::ANY, 1..1000),
+ index_rand in usize::ANY
+ ) {
+ let index = *input.keys().nth(index_rand % input.len()).unwrap();
+ let map1 = OrdMap::from_iter(input.clone());
+ let (val, map2): (i16, _) = map1.extract(&index).unwrap();
+ let map3 = map2.update(index, val);
+ for key in map2.keys() {
+ assert!(*key != index);
+ }
+ assert_eq!(map1.len(), map2.len() + 1);
+ assert_eq!(map1, map3);
+ }
+
+ #[test]
+ fn exact_size_iterator(ref m in ord_map(i16::ANY, i16::ANY, 1..1000)) {
+ let mut should_be = m.len();
+ let mut it = m.iter();
+ loop {
+ assert_eq!(should_be, it.len());
+ match it.next() {
+ None => break,
+ Some(_) => should_be -= 1,
+ }
+ }
+ assert_eq!(0, it.len());
+ }
+
+ #[test]
+ fn diff_all_values(a in collection::vec((usize::ANY, usize::ANY), 1..1000), b in collection::vec((usize::ANY, usize::ANY), 1..1000)) {
+ let a: OrdMap<usize, usize> = OrdMap::from(a);
+ let b: OrdMap<usize, usize> = OrdMap::from(b);
+
+ let diff: Vec<_> = a.diff(&b).collect();
+ let union = b.clone().union(a.clone());
+ let expected: Vec<_> = union.iter().filter_map(|(k, v)| {
+ if a.contains_key(k) {
+ if b.contains_key(k) {
+ let old = a.get(k).unwrap();
+ if old != v {
+ Some(DiffItem::Update {
+ old: (k, old),
+ new: (k, v),
+ })
+ } else {
+ None
+ }
+ } else {
+ Some(DiffItem::Remove(k, v))
+ }
+ } else {
+ Some(DiffItem::Add(k, v))
+ }
+ }).collect();
+ assert_eq!(expected, diff);
+ }
+ }
+}
diff --git a/vendor/im-rc/src/ord/mod.rs b/vendor/im-rc/src/ord/mod.rs
new file mode 100644
index 0000000..27a56a5
--- /dev/null
+++ b/vendor/im-rc/src/ord/mod.rs
@@ -0,0 +1,8 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#[macro_use]
+pub mod map;
+#[macro_use]
+pub mod set;
diff --git a/vendor/im-rc/src/ord/set.rs b/vendor/im-rc/src/ord/set.rs
new file mode 100644
index 0000000..60ad6ad
--- /dev/null
+++ b/vendor/im-rc/src/ord/set.rs
@@ -0,0 +1,1243 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+//! An ordered set.
+//!
+//! An immutable ordered set implemented as a [B-tree] [1].
+//!
+//! Most operations on this type of set are O(log n). A
+//! [`HashSet`][hashset::HashSet] is usually a better choice for
+//! performance, but the `OrdSet` has the advantage of only requiring
+//! an [`Ord`][std::cmp::Ord] constraint on its values, and of being
+//! ordered, so values always come out from lowest to highest, where a
+//! [`HashSet`][hashset::HashSet] has no guaranteed ordering.
+//!
+//! [1]: https://en.wikipedia.org/wiki/B-tree
+//! [hashset::HashSet]: ./struct.HashSet.html
+//! [std::cmp::Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html
+
+use std::borrow::Borrow;
+use std::cmp::Ordering;
+use std::collections;
+use std::fmt::{Debug, Error, Formatter};
+use std::hash::{BuildHasher, Hash, Hasher};
+use std::iter::{FromIterator, IntoIterator, Sum};
+use std::ops::{Add, Deref, Mul, RangeBounds};
+
+use crate::hashset::HashSet;
+use crate::nodes::btree::{
+ BTreeValue, ConsumingIter as ConsumingNodeIter, DiffIter as NodeDiffIter, Insert,
+ Iter as NodeIter, Node, Remove,
+};
+#[cfg(has_specialisation)]
+use crate::util::linear_search_by;
+use crate::util::{Pool, PoolRef};
+
+pub use crate::nodes::btree::DiffItem;
+
+/// Construct a set from a sequence of values.
+///
+/// # Examples
+///
+/// ```
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::ordset::OrdSet;
+/// # fn main() {
+/// assert_eq!(
+/// ordset![1, 2, 3],
+/// OrdSet::from(vec![1, 2, 3])
+/// );
+/// # }
+/// ```
+#[macro_export]
+macro_rules! ordset {
+ () => { $crate::ordset::OrdSet::new() };
+
+ ( $($x:expr),* ) => {{
+ let mut l = $crate::ordset::OrdSet::new();
+ $(
+ l.insert($x);
+ )*
+ l
+ }};
+}
+
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)]
+struct Value<A>(A);
+
+impl<A> Deref for Value<A> {
+ type Target = A;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+// FIXME lacking specialisation, we can't simply implement `BTreeValue`
+// for `A`, we have to use the `Value<A>` indirection.
+#[cfg(not(has_specialisation))]
+impl<A: Ord> BTreeValue for Value<A> {
+ type Key = A;
+
+ fn ptr_eq(&self, _other: &Self) -> bool {
+ false
+ }
+
+ fn search_key<BK>(slice: &[Self], key: &BK) -> Result<usize, usize>
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ slice.binary_search_by(|value| Self::Key::borrow(value).cmp(key))
+ }
+
+ fn search_value(slice: &[Self], key: &Self) -> Result<usize, usize> {
+ slice.binary_search_by(|value| value.cmp(key))
+ }
+
+ fn cmp_keys<BK>(&self, other: &BK) -> Ordering
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ Self::Key::borrow(self).cmp(other)
+ }
+
+ fn cmp_values(&self, other: &Self) -> Ordering {
+ self.cmp(other)
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<A: Ord> BTreeValue for Value<A> {
+ type Key = A;
+
+ fn ptr_eq(&self, _other: &Self) -> bool {
+ false
+ }
+
+ default fn search_key<BK>(slice: &[Self], key: &BK) -> Result<usize, usize>
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ slice.binary_search_by(|value| Self::Key::borrow(value).cmp(key))
+ }
+
+ default fn search_value(slice: &[Self], key: &Self) -> Result<usize, usize> {
+ slice.binary_search_by(|value| value.cmp(key))
+ }
+
+ fn cmp_keys<BK>(&self, other: &BK) -> Ordering
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ Self::Key::borrow(self).cmp(other)
+ }
+
+ fn cmp_values(&self, other: &Self) -> Ordering {
+ self.cmp(other)
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<A: Ord + Copy> BTreeValue for Value<A> {
+ fn search_key<BK>(slice: &[Self], key: &BK) -> Result<usize, usize>
+ where
+ BK: Ord + ?Sized,
+ Self::Key: Borrow<BK>,
+ {
+ linear_search_by(slice, |value| Self::Key::borrow(value).cmp(key))
+ }
+
+ fn search_value(slice: &[Self], key: &Self) -> Result<usize, usize> {
+ linear_search_by(slice, |value| value.cmp(key))
+ }
+}
+
+def_pool!(OrdSetPool<A>, Node<Value<A>>);
+
+/// An ordered set.
+///
+/// An immutable ordered set implemented as a [B-tree] [1].
+///
+/// Most operations on this type of set are O(log n). A
+/// [`HashSet`][hashset::HashSet] is usually a better choice for
+/// performance, but the `OrdSet` has the advantage of only requiring
+/// an [`Ord`][std::cmp::Ord] constraint on its values, and of being
+/// ordered, so values always come out from lowest to highest, where a
+/// [`HashSet`][hashset::HashSet] has no guaranteed ordering.
+///
+/// [1]: https://en.wikipedia.org/wiki/B-tree
+/// [hashset::HashSet]: ./struct.HashSet.html
+/// [std::cmp::Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html
+pub struct OrdSet<A> {
+ size: usize,
+ pool: OrdSetPool<A>,
+ root: PoolRef<Node<Value<A>>>,
+}
+
+impl<A> OrdSet<A> {
+ /// Construct an empty set.
+ #[must_use]
+ pub fn new() -> Self {
+ let pool = OrdSetPool::default();
+ let root = PoolRef::default(&pool.0);
+ OrdSet {
+ size: 0,
+ pool,
+ root,
+ }
+ }
+
+ /// Construct an empty set using a specific memory pool.
+ #[cfg(feature = "pool")]
+ #[must_use]
+ pub fn with_pool(pool: &OrdSetPool<A>) -> Self {
+ let root = PoolRef::default(&pool.0);
+ OrdSet {
+ size: 0,
+ pool: pool.clone(),
+ root,
+ }
+ }
+
+ /// Construct a set with a single value.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let set = OrdSet::unit(123);
+ /// assert!(set.contains(&123));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn unit(a: A) -> Self {
+ let pool = OrdSetPool::default();
+ let root = PoolRef::new(&pool.0, Node::unit(Value(a)));
+ OrdSet {
+ size: 1,
+ pool,
+ root,
+ }
+ }
+
+ /// Test whether a set is empty.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// assert!(
+ /// !ordset![1, 2, 3].is_empty()
+ /// );
+ /// assert!(
+ /// OrdSet::<i32>::new().is_empty()
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ /// Get the size of a set.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// assert_eq!(3, ordset![1, 2, 3].len());
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn len(&self) -> usize {
+ self.size
+ }
+
+ /// Test whether two sets refer to the same content in memory.
+ ///
+ /// This is true if the two sides are references to the same set,
+ /// or if the two sets refer to the same root node.
+ ///
+ /// This would return true if you're comparing a set to itself, or
+ /// if you're comparing a set to a fresh clone of itself.
+ ///
+ /// Time: O(1)
+ pub fn ptr_eq(&self, other: &Self) -> bool {
+ std::ptr::eq(self, other) || PoolRef::ptr_eq(&self.root, &other.root)
+ }
+
+ /// Get a reference to the memory pool used by this set.
+ ///
+ /// Note that if you didn't specifically construct it with a pool, you'll
+ /// get back a reference to a pool of size 0.
+ #[cfg(feature = "pool")]
+ pub fn pool(&self) -> &OrdSetPool<A> {
+ &self.pool
+ }
+
+ /// Discard all elements from the set.
+ ///
+ /// This leaves you with an empty set, and all elements that
+ /// were previously inside it are dropped.
+ ///
+ /// Time: O(n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::OrdSet;
+ /// let mut set = ordset![1, 2, 3];
+ /// set.clear();
+ /// assert!(set.is_empty());
+ /// ```
+ pub fn clear(&mut self) {
+ if !self.is_empty() {
+ self.root = PoolRef::default(&self.pool.0);
+ self.size = 0;
+ }
+ }
+}
+
+impl<A> OrdSet<A>
+where
+ A: Ord,
+{
+ /// Get the smallest value in a set.
+ ///
+ /// If the set is empty, returns `None`.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn get_min(&self) -> Option<&A> {
+ self.root.min().map(Deref::deref)
+ }
+
+ /// Get the largest value in a set.
+ ///
+ /// If the set is empty, returns `None`.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn get_max(&self) -> Option<&A> {
+ self.root.max().map(Deref::deref)
+ }
+
+ /// Create an iterator over the contents of the set.
+ #[must_use]
+ pub fn iter(&self) -> Iter<'_, A> {
+ Iter {
+ it: NodeIter::new(&self.root, self.size, ..),
+ }
+ }
+
+ /// Create an iterator over a range inside the set.
+ #[must_use]
+ pub fn range<R, BA>(&self, range: R) -> RangedIter<'_, A>
+ where
+ R: RangeBounds<BA>,
+ A: Borrow<BA>,
+ BA: Ord + ?Sized,
+ {
+ RangedIter {
+ it: NodeIter::new(&self.root, self.size, range),
+ }
+ }
+
+ /// Get an iterator over the differences between this set and
+ /// another, i.e. the set of entries to add or remove to this set
+ /// in order to make it equal to the other set.
+ ///
+ /// This function will avoid visiting nodes which are shared
+ /// between the two sets, meaning that even very large sets can be
+ /// compared quickly if most of their structure is shared.
+ ///
+ /// Time: O(n) (where n is the number of unique elements across
+ /// the two sets, minus the number of elements belonging to nodes
+ /// shared between them)
+ #[must_use]
+ pub fn diff<'a>(&'a self, other: &'a Self) -> DiffIter<'_, A> {
+ DiffIter {
+ it: NodeDiffIter::new(&self.root, &other.root),
+ }
+ }
+
+ /// Test if a value is part of a set.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let mut set = ordset!{1, 2, 3};
+ /// assert!(set.contains(&1));
+ /// assert!(!set.contains(&4));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn contains<BA>(&self, a: &BA) -> bool
+ where
+ BA: Ord + ?Sized,
+ A: Borrow<BA>,
+ {
+ self.root.lookup(a).is_some()
+ }
+
+ /// Get the closest smaller value in a set to a given value.
+ ///
+ /// If the set contains the given value, this is returned.
+ /// Otherwise, the closest value in the set smaller than the
+ /// given value is returned. If the smallest value in the set
+ /// is larger than the given value, `None` is returned.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::OrdSet;
+ /// let set = ordset![1, 3, 5, 7, 9];
+ /// assert_eq!(Some(&5), set.get_prev(&6));
+ /// ```
+ #[must_use]
+ pub fn get_prev(&self, key: &A) -> Option<&A> {
+ self.root.lookup_prev(key).map(|v| &v.0)
+ }
+
+ /// Get the closest larger value in a set to a given value.
+ ///
+ /// If the set contains the given value, this is returned.
+ /// Otherwise, the closest value in the set larger than the
+ /// given value is returned. If the largest value in the set
+ /// is smaller than the given value, `None` is returned.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::OrdSet;
+ /// let set = ordset![1, 3, 5, 7, 9];
+ /// assert_eq!(Some(&5), set.get_next(&4));
+ /// ```
+ #[must_use]
+ pub fn get_next(&self, key: &A) -> Option<&A> {
+ self.root.lookup_next(key).map(|v| &v.0)
+ }
+
+ /// Test whether a set is a subset of another set, meaning that
+ /// all values in our set must also be in the other set.
+ ///
+ /// Time: O(n log m) where m is the size of the other set
+ #[must_use]
+ pub fn is_subset<RS>(&self, other: RS) -> bool
+ where
+ RS: Borrow<Self>,
+ {
+ let other = other.borrow();
+ if other.len() < self.len() {
+ return false;
+ }
+ self.iter().all(|a| other.contains(a))
+ }
+
+ /// Test whether a set is a proper subset of another set, meaning
+ /// that all values in our set must also be in the other set. A
+ /// proper subset must also be smaller than the other set.
+ ///
+ /// Time: O(n log m) where m is the size of the other set
+ #[must_use]
+ pub fn is_proper_subset<RS>(&self, other: RS) -> bool
+ where
+ RS: Borrow<Self>,
+ {
+ self.len() != other.borrow().len() && self.is_subset(other)
+ }
+}
+
+impl<A> OrdSet<A>
+where
+ A: Ord + Clone,
+{
+ /// Insert a value into a set.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let mut set = ordset!{};
+ /// set.insert(123);
+ /// set.insert(456);
+ /// assert_eq!(
+ /// set,
+ /// ordset![123, 456]
+ /// );
+ /// ```
+ #[inline]
+ pub fn insert(&mut self, a: A) -> Option<A> {
+ let new_root = {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ match root.insert(&self.pool.0, Value(a)) {
+ Insert::Replaced(Value(old_value)) => return Some(old_value),
+ Insert::Added => {
+ self.size += 1;
+ return None;
+ }
+ Insert::Split(left, median, right) => PoolRef::new(
+ &self.pool.0,
+ Node::new_from_split(&self.pool.0, left, median, right),
+ ),
+ }
+ };
+ self.size += 1;
+ self.root = new_root;
+ None
+ }
+
+ /// Remove a value from a set.
+ ///
+ /// Time: O(log n)
+ #[inline]
+ pub fn remove<BA>(&mut self, a: &BA) -> Option<A>
+ where
+ BA: Ord + ?Sized,
+ A: Borrow<BA>,
+ {
+ let (new_root, removed_value) = {
+ let root = PoolRef::make_mut(&self.pool.0, &mut self.root);
+ match root.remove(&self.pool.0, a) {
+ Remove::Update(value, root) => (PoolRef::new(&self.pool.0, root), Some(value.0)),
+ Remove::Removed(value) => {
+ self.size -= 1;
+ return Some(value.0);
+ }
+ Remove::NoChange => return None,
+ }
+ };
+ self.size -= 1;
+ self.root = new_root;
+ removed_value
+ }
+
+ /// Remove the smallest value from a set.
+ ///
+ /// Time: O(log n)
+ pub fn remove_min(&mut self) -> Option<A> {
+ // FIXME implement this at the node level for better efficiency
+ let key = match self.get_min() {
+ None => return None,
+ Some(v) => v,
+ }
+ .clone();
+ self.remove(&key)
+ }
+
+ /// Remove the largest value from a set.
+ ///
+ /// Time: O(log n)
+ pub fn remove_max(&mut self) -> Option<A> {
+ // FIXME implement this at the node level for better efficiency
+ let key = match self.get_max() {
+ None => return None,
+ Some(v) => v,
+ }
+ .clone();
+ self.remove(&key)
+ }
+
+ /// Construct a new set from the current set with the given value
+ /// added.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let set = ordset![456];
+ /// assert_eq!(
+ /// set.update(123),
+ /// ordset![123, 456]
+ /// );
+ /// ```
+ #[must_use]
+ pub fn update(&self, a: A) -> Self {
+ let mut out = self.clone();
+ out.insert(a);
+ out
+ }
+
+ /// Construct a new set with the given value removed if it's in
+ /// the set.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn without<BA>(&self, a: &BA) -> Self
+ where
+ BA: Ord + ?Sized,
+ A: Borrow<BA>,
+ {
+ let mut out = self.clone();
+ out.remove(a);
+ out
+ }
+
+ /// Remove the smallest value from a set, and return that value as
+ /// well as the updated set.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn without_min(&self) -> (Option<A>, Self) {
+ match self.get_min() {
+ Some(v) => (Some(v.clone()), self.without(v)),
+ None => (None, self.clone()),
+ }
+ }
+
+ /// Remove the largest value from a set, and return that value as
+ /// well as the updated set.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn without_max(&self) -> (Option<A>, Self) {
+ match self.get_max() {
+ Some(v) => (Some(v.clone()), self.without(v)),
+ None => (None, self.clone()),
+ }
+ }
+
+ /// Construct the union of two sets.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let set1 = ordset!{1, 2};
+ /// let set2 = ordset!{2, 3};
+ /// let expected = ordset!{1, 2, 3};
+ /// assert_eq!(expected, set1.union(set2));
+ /// ```
+ #[must_use]
+ pub fn union(self, other: Self) -> Self {
+ let (mut to_mutate, to_consume) = if self.len() >= other.len() {
+ (self, other)
+ } else {
+ (other, self)
+ };
+ for value in to_consume {
+ to_mutate.insert(value);
+ }
+ to_mutate
+ }
+
+ /// Construct the union of multiple sets.
+ ///
+ /// Time: O(n log n)
+ #[must_use]
+ pub fn unions<I>(i: I) -> Self
+ where
+ I: IntoIterator<Item = Self>,
+ {
+ i.into_iter().fold(Self::default(), Self::union)
+ }
+
+ /// Construct the symmetric difference between two sets.
+ ///
+ /// This is an alias for the
+ /// [`symmetric_difference`][symmetric_difference] method.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let set1 = ordset!{1, 2};
+ /// let set2 = ordset!{2, 3};
+ /// let expected = ordset!{1, 3};
+ /// assert_eq!(expected, set1.difference(set2));
+ /// ```
+ ///
+ /// [symmetric_difference]: #method.symmetric_difference
+ #[must_use]
+ pub fn difference(self, other: Self) -> Self {
+ self.symmetric_difference(other)
+ }
+
+ /// Construct the symmetric difference between two sets.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let set1 = ordset!{1, 2};
+ /// let set2 = ordset!{2, 3};
+ /// let expected = ordset!{1, 3};
+ /// assert_eq!(expected, set1.symmetric_difference(set2));
+ /// ```
+ #[must_use]
+ pub fn symmetric_difference(mut self, other: Self) -> Self {
+ for value in other {
+ if self.remove(&value).is_none() {
+ self.insert(value);
+ }
+ }
+ self
+ }
+
+ /// Construct the relative complement between two sets, that is the set
+ /// of values in `self` that do not occur in `other`.
+ ///
+ /// Time: O(m log n) where m is the size of the other set
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let set1 = ordset!{1, 2};
+ /// let set2 = ordset!{2, 3};
+ /// let expected = ordset!{1};
+ /// assert_eq!(expected, set1.relative_complement(set2));
+ /// ```
+ #[must_use]
+ pub fn relative_complement(mut self, other: Self) -> Self {
+ for value in other {
+ let _ = self.remove(&value);
+ }
+ self
+ }
+
+ /// Construct the intersection of two sets.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::ordset::OrdSet;
+ /// let set1 = ordset!{1, 2};
+ /// let set2 = ordset!{2, 3};
+ /// let expected = ordset!{2};
+ /// assert_eq!(expected, set1.intersection(set2));
+ /// ```
+ #[must_use]
+ pub fn intersection(self, other: Self) -> Self {
+ let mut out = Self::default();
+ for value in other {
+ if self.contains(&value) {
+ out.insert(value);
+ }
+ }
+ out
+ }
+
+ /// Split a set into two, with the left hand set containing values
+ /// which are smaller than `split`, and the right hand set
+ /// containing values which are larger than `split`.
+ ///
+ /// The `split` value itself is discarded.
+ ///
+ /// Time: O(n)
+ #[must_use]
+ pub fn split<BA>(self, split: &BA) -> (Self, Self)
+ where
+ BA: Ord + ?Sized,
+ A: Borrow<BA>,
+ {
+ let (left, _, right) = self.split_member(split);
+ (left, right)
+ }
+
+ /// Split a set into two, with the left hand set containing values
+ /// which are smaller than `split`, and the right hand set
+ /// containing values which are larger than `split`.
+ ///
+ /// Returns a tuple of the two sets and a boolean which is true if
+ /// the `split` value existed in the original set, and false
+ /// otherwise.
+ ///
+ /// Time: O(n)
+ #[must_use]
+ pub fn split_member<BA>(self, split: &BA) -> (Self, bool, Self)
+ where
+ BA: Ord + ?Sized,
+ A: Borrow<BA>,
+ {
+ let mut left = Self::default();
+ let mut right = Self::default();
+ let mut present = false;
+ for value in self {
+ match value.borrow().cmp(split) {
+ Ordering::Less => {
+ left.insert(value);
+ }
+ Ordering::Equal => {
+ present = true;
+ }
+ Ordering::Greater => {
+ right.insert(value);
+ }
+ }
+ }
+ (left, present, right)
+ }
+
+ /// Construct a set with only the `n` smallest values from a given
+ /// set.
+ ///
+ /// Time: O(n)
+ #[must_use]
+ pub fn take(&self, n: usize) -> Self {
+ self.iter().take(n).cloned().collect()
+ }
+
+ /// Construct a set with the `n` smallest values removed from a
+ /// given set.
+ ///
+ /// Time: O(n)
+ #[must_use]
+ pub fn skip(&self, n: usize) -> Self {
+ self.iter().skip(n).cloned().collect()
+ }
+}
+
+// Core traits
+
+impl<A> Clone for OrdSet<A> {
+ /// Clone a set.
+ ///
+ /// Time: O(1)
+ #[inline]
+ fn clone(&self) -> Self {
+ OrdSet {
+ size: self.size,
+ pool: self.pool.clone(),
+ root: self.root.clone(),
+ }
+ }
+}
+
+impl<A: Ord> PartialEq for OrdSet<A> {
+ fn eq(&self, other: &Self) -> bool {
+ PoolRef::ptr_eq(&self.root, &other.root)
+ || (self.len() == other.len() && self.diff(other).next().is_none())
+ }
+}
+
+impl<A: Ord + Eq> Eq for OrdSet<A> {}
+
+impl<A: Ord> PartialOrd for OrdSet<A> {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ self.iter().partial_cmp(other.iter())
+ }
+}
+
+impl<A: Ord> Ord for OrdSet<A> {
+ fn cmp(&self, other: &Self) -> Ordering {
+ self.iter().cmp(other.iter())
+ }
+}
+
+impl<A: Ord + Hash> Hash for OrdSet<A> {
+ fn hash<H>(&self, state: &mut H)
+ where
+ H: Hasher,
+ {
+ for i in self.iter() {
+ i.hash(state);
+ }
+ }
+}
+
+impl<A> Default for OrdSet<A> {
+ fn default() -> Self {
+ OrdSet::new()
+ }
+}
+
+impl<A: Ord + Clone> Add for OrdSet<A> {
+ type Output = OrdSet<A>;
+
+ fn add(self, other: Self) -> Self::Output {
+ self.union(other)
+ }
+}
+
+impl<'a, A: Ord + Clone> Add for &'a OrdSet<A> {
+ type Output = OrdSet<A>;
+
+ fn add(self, other: Self) -> Self::Output {
+ self.clone().union(other.clone())
+ }
+}
+
+impl<A: Ord + Clone> Mul for OrdSet<A> {
+ type Output = OrdSet<A>;
+
+ fn mul(self, other: Self) -> Self::Output {
+ self.intersection(other)
+ }
+}
+
+impl<'a, A: Ord + Clone> Mul for &'a OrdSet<A> {
+ type Output = OrdSet<A>;
+
+ fn mul(self, other: Self) -> Self::Output {
+ self.clone().intersection(other.clone())
+ }
+}
+
+impl<A: Ord + Clone> Sum for OrdSet<A> {
+ fn sum<I>(it: I) -> Self
+ where
+ I: Iterator<Item = Self>,
+ {
+ it.fold(Self::new(), |a, b| a + b)
+ }
+}
+
+impl<A, R> Extend<R> for OrdSet<A>
+where
+ A: Ord + Clone + From<R>,
+{
+ fn extend<I>(&mut self, iter: I)
+ where
+ I: IntoIterator<Item = R>,
+ {
+ for value in iter {
+ self.insert(From::from(value));
+ }
+ }
+}
+
+impl<A: Ord + Debug> Debug for OrdSet<A> {
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ f.debug_set().entries(self.iter()).finish()
+ }
+}
+
+// Iterators
+
+/// An iterator over the elements of a set.
+pub struct Iter<'a, A> {
+ it: NodeIter<'a, Value<A>>,
+}
+
+impl<'a, A> Iterator for Iter<'a, A>
+where
+ A: 'a + Ord,
+{
+ type Item = &'a A;
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(Deref::deref)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (self.it.remaining, Some(self.it.remaining))
+ }
+}
+
+impl<'a, A> DoubleEndedIterator for Iter<'a, A>
+where
+ A: 'a + Ord,
+{
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.it.next_back().map(Deref::deref)
+ }
+}
+
+impl<'a, A> ExactSizeIterator for Iter<'a, A> where A: 'a + Ord {}
+
+/// A ranged iterator over the elements of a set.
+///
+/// The only difference from `Iter` is that this one doesn't implement
+/// `ExactSizeIterator` because we can't know the size of the range without first
+/// iterating over it to count.
+pub struct RangedIter<'a, A> {
+ it: NodeIter<'a, Value<A>>,
+}
+
+impl<'a, A> Iterator for RangedIter<'a, A>
+where
+ A: 'a + Ord,
+{
+ type Item = &'a A;
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(Deref::deref)
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.it.size_hint()
+ }
+}
+
+impl<'a, A> DoubleEndedIterator for RangedIter<'a, A>
+where
+ A: 'a + Ord,
+{
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.it.next_back().map(Deref::deref)
+ }
+}
+
+/// A consuming iterator over the elements of a set.
+pub struct ConsumingIter<A> {
+ it: ConsumingNodeIter<Value<A>>,
+}
+
+impl<A> Iterator for ConsumingIter<A>
+where
+ A: Ord + Clone,
+{
+ type Item = A;
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|v| v.0)
+ }
+}
+
+/// An iterator over the difference between two sets.
+pub struct DiffIter<'a, A> {
+ it: NodeDiffIter<'a, Value<A>>,
+}
+
+impl<'a, A> Iterator for DiffIter<'a, A>
+where
+ A: Ord + PartialEq,
+{
+ type Item = DiffItem<'a, A>;
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ self.it.next().map(|item| match item {
+ DiffItem::Add(v) => DiffItem::Add(v.deref()),
+ DiffItem::Update { old, new } => DiffItem::Update {
+ old: old.deref(),
+ new: new.deref(),
+ },
+ DiffItem::Remove(v) => DiffItem::Remove(v.deref()),
+ })
+ }
+}
+
+impl<A, R> FromIterator<R> for OrdSet<A>
+where
+ A: Ord + Clone + From<R>,
+{
+ fn from_iter<T>(i: T) -> Self
+ where
+ T: IntoIterator<Item = R>,
+ {
+ let mut out = Self::new();
+ for item in i {
+ out.insert(From::from(item));
+ }
+ out
+ }
+}
+
+impl<'a, A> IntoIterator for &'a OrdSet<A>
+where
+ A: 'a + Ord,
+{
+ type Item = &'a A;
+ type IntoIter = Iter<'a, A>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
+impl<A> IntoIterator for OrdSet<A>
+where
+ A: Ord + Clone,
+{
+ type Item = A;
+ type IntoIter = ConsumingIter<A>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ ConsumingIter {
+ it: ConsumingNodeIter::new(&self.root, self.size),
+ }
+ }
+}
+
+// Conversions
+
+impl<'s, 'a, A, OA> From<&'s OrdSet<&'a A>> for OrdSet<OA>
+where
+ A: ToOwned<Owned = OA> + Ord + ?Sized,
+ OA: Borrow<A> + Ord + Clone,
+{
+ fn from(set: &OrdSet<&A>) -> Self {
+ set.iter().map(|a| (*a).to_owned()).collect()
+ }
+}
+
+impl<'a, A> From<&'a [A]> for OrdSet<A>
+where
+ A: Ord + Clone,
+{
+ fn from(slice: &'a [A]) -> Self {
+ slice.iter().cloned().collect()
+ }
+}
+
+impl<A: Ord + Clone> From<Vec<A>> for OrdSet<A> {
+ fn from(vec: Vec<A>) -> Self {
+ vec.into_iter().collect()
+ }
+}
+
+impl<'a, A: Ord + Clone> From<&'a Vec<A>> for OrdSet<A> {
+ fn from(vec: &Vec<A>) -> Self {
+ vec.iter().cloned().collect()
+ }
+}
+
+impl<A: Eq + Hash + Ord + Clone> From<collections::HashSet<A>> for OrdSet<A> {
+ fn from(hash_set: collections::HashSet<A>) -> Self {
+ hash_set.into_iter().collect()
+ }
+}
+
+impl<'a, A: Eq + Hash + Ord + Clone> From<&'a collections::HashSet<A>> for OrdSet<A> {
+ fn from(hash_set: &collections::HashSet<A>) -> Self {
+ hash_set.iter().cloned().collect()
+ }
+}
+
+impl<A: Ord + Clone> From<collections::BTreeSet<A>> for OrdSet<A> {
+ fn from(btree_set: collections::BTreeSet<A>) -> Self {
+ btree_set.into_iter().collect()
+ }
+}
+
+impl<'a, A: Ord + Clone> From<&'a collections::BTreeSet<A>> for OrdSet<A> {
+ fn from(btree_set: &collections::BTreeSet<A>) -> Self {
+ btree_set.iter().cloned().collect()
+ }
+}
+
+impl<A: Hash + Eq + Ord + Clone, S: BuildHasher> From<HashSet<A, S>> for OrdSet<A> {
+ fn from(hashset: HashSet<A, S>) -> Self {
+ hashset.into_iter().collect()
+ }
+}
+
+impl<'a, A: Hash + Eq + Ord + Clone, S: BuildHasher> From<&'a HashSet<A, S>> for OrdSet<A> {
+ fn from(hashset: &HashSet<A, S>) -> Self {
+ hashset.into_iter().cloned().collect()
+ }
+}
+
+// Proptest
+#[cfg(any(test, feature = "proptest"))]
+#[doc(hidden)]
+pub mod proptest {
+ #[deprecated(
+ since = "14.3.0",
+ note = "proptest strategies have moved to im::proptest"
+ )]
+ pub use crate::proptest::ord_set;
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ use crate::proptest::*;
+ use ::proptest::proptest;
+
+ #[test]
+ fn match_strings_with_string_slices() {
+ let mut set: OrdSet<String> = From::from(&ordset!["foo", "bar"]);
+ set = set.without("bar");
+ assert!(!set.contains("bar"));
+ set.remove("foo");
+ assert!(!set.contains("foo"));
+ }
+
+ #[test]
+ fn ranged_iter() {
+ let set: OrdSet<i32> = ordset![1, 2, 3, 4, 5];
+ let range: Vec<i32> = set.range(..).cloned().collect();
+ assert_eq!(vec![1, 2, 3, 4, 5], range);
+ let range: Vec<i32> = set.range(..).rev().cloned().collect();
+ assert_eq!(vec![5, 4, 3, 2, 1], range);
+ let range: Vec<i32> = set.range(2..5).cloned().collect();
+ assert_eq!(vec![2, 3, 4], range);
+ let range: Vec<i32> = set.range(2..5).rev().cloned().collect();
+ assert_eq!(vec![4, 3, 2], range);
+ let range: Vec<i32> = set.range(3..).cloned().collect();
+ assert_eq!(vec![3, 4, 5], range);
+ let range: Vec<i32> = set.range(3..).rev().cloned().collect();
+ assert_eq!(vec![5, 4, 3], range);
+ let range: Vec<i32> = set.range(..4).cloned().collect();
+ assert_eq!(vec![1, 2, 3], range);
+ let range: Vec<i32> = set.range(..4).rev().cloned().collect();
+ assert_eq!(vec![3, 2, 1], range);
+ let range: Vec<i32> = set.range(..=3).cloned().collect();
+ assert_eq!(vec![1, 2, 3], range);
+ let range: Vec<i32> = set.range(..=3).rev().cloned().collect();
+ assert_eq!(vec![3, 2, 1], range);
+ }
+
+ proptest! {
+ #[test]
+ fn proptest_a_set(ref s in ord_set(".*", 10..100)) {
+ assert!(s.len() < 100);
+ assert!(s.len() >= 10);
+ }
+
+ #[test]
+ fn long_ranged_iter(max in 1..1000) {
+ let range = 0..max;
+ let expected: Vec<i32> = range.clone().collect();
+ let set: OrdSet<i32> = range.clone().collect::<OrdSet<_>>();
+ let result: Vec<i32> = set.range(..).cloned().collect();
+ assert_eq!(expected, result);
+
+ let expected: Vec<i32> = range.clone().rev().collect();
+ let set: OrdSet<i32> = range.collect::<OrdSet<_>>();
+ let result: Vec<i32> = set.range(..).rev().cloned().collect();
+ assert_eq!(expected, result);
+ }
+ }
+}
diff --git a/vendor/im-rc/src/ord/test-fixtures/issue_124.txt b/vendor/im-rc/src/ord/test-fixtures/issue_124.txt
new file mode 100644
index 0000000..5178617
--- /dev/null
+++ b/vendor/im-rc/src/ord/test-fixtures/issue_124.txt
@@ -0,0 +1,3492 @@
+insert 1495
+insert 1568
+insert 1313
+insert 824
+insert 926
+insert 3031
+insert 872
+insert 1330
+insert 2356
+insert 298
+insert 1957
+insert 2133
+insert 3295
+insert 1139
+insert 2895
+insert 2442
+insert 553
+insert 2637
+insert 2571
+insert 352
+insert 1076
+insert 1611
+insert 902
+insert 480
+insert 1489
+insert 3223
+insert 169
+insert 2912
+insert 2276
+insert 1512
+insert 291
+insert 137
+insert 2917
+insert 2509
+insert 1729
+insert 62
+insert 1381
+insert 647
+insert 1647
+insert 2064
+insert 1847
+insert 1618
+insert 528
+insert 431
+insert 639
+insert 1910
+insert 1764
+insert 114
+insert 2872
+insert 2911
+insert 999
+insert 15
+insert 53
+insert 1924
+insert 2195
+insert 1134
+insert 269
+insert 2903
+insert 432
+insert 149
+insert 1241
+insert 3266
+insert 1975
+insert 2095
+insert 1384
+insert 2858
+insert 2814
+insert 2735
+insert 2779
+insert 991
+insert 1725
+insert 1804
+insert 959
+insert 1395
+insert 720
+insert 1758
+insert 1459
+insert 925
+insert 860
+insert 1035
+insert 1310
+insert 2892
+insert 3129
+insert 891
+insert 913
+insert 2136
+insert 45
+insert 255
+insert 2980
+insert 2918
+insert 2234
+insert 2845
+insert 2135
+insert 2818
+insert 978
+insert 2038
+insert 2251
+insert 14
+insert 333
+insert 649
+insert 1947
+insert 1768
+insert 3309
+insert 3063
+insert 788
+insert 65
+insert 833
+insert 1038
+insert 1966
+insert 1746
+insert 1595
+insert 2512
+insert 1543
+insert 1269
+insert 243
+insert 175
+insert 259
+insert 4
+insert 2715
+insert 297
+insert 2386
+insert 1060
+insert 2686
+insert 2400
+insert 2548
+insert 278
+insert 1890
+insert 1777
+insert 1424
+insert 2109
+insert 3307
+insert 1974
+insert 1985
+insert 3144
+insert 1186
+insert 1945
+insert 3184
+insert 1488
+insert 1707
+insert 2915
+insert 2995
+insert 2467
+insert 1791
+insert 1309
+insert 2916
+insert 1941
+insert 1824
+insert 1525
+insert 1626
+insert 1687
+insert 2333
+insert 2198
+insert 1237
+insert 2931
+insert 2764
+insert 2609
+insert 1202
+insert 1314
+insert 1556
+insert 1892
+insert 2329
+insert 2065
+insert 1559
+insert 2282
+insert 3279
+insert 1651
+insert 1610
+insert 2039
+insert 3269
+insert 1948
+insert 1663
+insert 1627
+insert 943
+insert 2313
+insert 1048
+insert 2399
+insert 2302
+insert 1022
+insert 946
+insert 2303
+insert 1085
+insert 108
+insert 2738
+insert 1311
+insert 844
+insert 1166
+insert 3198
+insert 1093
+insert 1192
+insert 1508
+insert 2471
+insert 2518
+insert 3209
+insert 1149
+insert 1743
+insert 1770
+insert 960
+insert 895
+insert 1806
+insert 1137
+insert 1654
+insert 1386
+insert 2727
+insert 1379
+insert 2572
+insert 128
+insert 2476
+insert 182
+insert 1037
+insert 605
+insert 2494
+insert 2561
+insert 941
+insert 2748
+insert 1448
+insert 2260
+insert 1273
+insert 2558
+insert 1198
+insert 1774
+insert 1740
+insert 1861
+insert 3049
+insert 2821
+insert 1341
+insert 1661
+insert 1506
+insert 1741
+insert 1811
+insert 1737
+insert 1693
+insert 1877
+insert 1756
+insert 1755
+insert 1553
+insert 1864
+insert 1734
+insert 1790
+insert 1753
+insert 2396
+insert 2531
+insert 1878
+insert 1809
+insert 2692
+insert 1854
+insert 1960
+insert 1999
+insert 2028
+insert 1879
+insert 1590
+insert 2521
+insert 3081
+insert 2665
+insert 1638
+insert 1667
+insert 1417
+insert 1876
+insert 3113
+insert 2757
+insert 2711
+insert 2587
+insert 1607
+insert 2568
+insert 2724
+insert 2685
+insert 2523
+insert 3151
+insert 1530
+insert 2454
+insert 2539
+insert 1356
+insert 1885
+insert 769
+insert 1982
+insert 3059
+insert 1232
+insert 2773
+insert 3270
+insert 2599
+insert 294
+insert 164
+insert 22
+insert 239
+insert 648
+insert 1679
+insert 644
+insert 398
+insert 455
+insert 443
+insert 1686
+insert 758
+insert 1720
+insert 1387
+insert 672
+insert 2569
+insert 2921
+insert 1228
+insert 1521
+insert 2115
+insert 2101
+insert 3035
+insert 2088
+insert 2094
+insert 1290
+insert 940
+insert 1303
+insert 2515
+insert 2863
+insert 1319
+insert 1315
+insert 2445
+insert 1949
+insert 2935
+insert 1992
+insert 1435
+insert 1413
+insert 1742
+insert 2769
+insert 2266
+insert 3290
+insert 3224
+insert 3171
+insert 2981
+insert 3200
+insert 3140
+insert 493
+insert 1299
+insert 338
+insert 1639
+insert 1463
+insert 730
+insert 1779
+insert 1918
+insert 2804
+insert 1476
+remove 432
+insert 296
+insert 1469
+insert 1364
+insert 1732
+insert 1908
+insert 2076
+insert 2489
+insert 2401
+insert 2560
+insert 2299
+insert 1451
+insert 3303
+insert 2174
+insert 2048
+insert 3293
+insert 2097
+insert 1705
+insert 1731
+insert 2296
+insert 2925
+insert 2932
+insert 1711
+insert 2397
+insert 2520
+insert 2742
+insert 1324
+insert 1160
+insert 1458
+insert 1439
+insert 3277
+insert 1374
+insert 1217
+insert 1218
+insert 2197
+insert 2185
+insert 1952
+insert 1798
+insert 1442
+insert 2601
+insert 2675
+insert 2283
+insert 12
+insert 567
+insert 638
+insert 1904
+insert 704
+insert 1447
+insert 1965
+insert 2728
+insert 2741
+insert 2441
+insert 2122
+insert 862
+insert 958
+insert 1955
+insert 850
+insert 2696
+insert 955
+insert 2867
+insert 2042
+insert 1925
+insert 2952
+insert 2265
+insert 1220
+insert 3289
+insert 2650
+insert 2215
+insert 2288
+insert 1373
+insert 2096
+insert 1167
+insert 830
+insert 829
+insert 1558
+insert 1189
+insert 2263
+insert 2341
+insert 2337
+insert 2270
+insert 3024
+insert 3182
+insert 1420
+insert 1557
+insert 1441
+insert 3037
+insert 3206
+insert 2913
+insert 1398
+insert 1392
+insert 1493
+insert 843
+insert 1287
+insert 2199
+insert 2838
+insert 2225
+insert 2181
+insert 736
+insert 2201
+insert 2907
+insert 808
+insert 712
+insert 2165
+insert 1219
+insert 1221
+insert 1715
+insert 1710
+insert 1700
+insert 2218
+insert 2187
+insert 1204
+insert 1709
+insert 2278
+insert 2698
+insert 1718
+insert 2240
+insert 2704
+insert 2340
+insert 1168
+insert 2256
+insert 2227
+insert 2203
+insert 2848
+insert 2305
+insert 1698
+insert 2647
+insert 2342
+insert 2275
+insert 1307
+insert 3062
+insert 2354
+insert 1312
+insert 3074
+insert 3060
+insert 1665
+insert 989
+insert 2591
+insert 3076
+insert 3136
+insert 3117
+insert 3123
+insert 234
+insert 6
+insert 698
+insert 719
+insert 3156
+insert 2358
+insert 2819
+insert 1793
+insert 3235
+insert 3000
+insert 28
+insert 3304
+insert 1856
+insert 1795
+insert 1733
+insert 1803
+insert 3127
+insert 1866
+insert 1642
+insert 1657
+insert 1723
+insert 2966
+insert 927
+insert 1055
+insert 3078
+insert 3201
+insert 3226
+insert 1014
+insert 3208
+insert 3262
+insert 2567
+insert 1430
+insert 2781
+insert 2425
+insert 1185
+insert 2385
+insert 1724
+insert 3181
+insert 2365
+insert 2361
+insert 1787
+insert 1410
+insert 1172
+insert 2746
+insert 2573
+insert 90
+insert 2268
+insert 2756
+insert 1304
+insert 1203
+insert 1860
+insert 841
+insert 1913
+insert 2284
+insert 2309
+insert 2946
+insert 1697
+remove 1975
+insert 2087
+insert 1921
+insert 3281
+insert 1894
+insert 1905
+insert 1206
+insert 1552
+insert 1179
+insert 2269
+insert 1606
+insert 1223
+insert 634
+insert 2594
+insert 1426
+insert 1164
+insert 1129
+insert 1019
+insert 897
+insert 2632
+insert 523
+insert 405
+insert 531
+insert 541
+insert 2285
+insert 1210
+insert 1212
+insert 2018
+insert 1524
+insert 1175
+insert 1857
+insert 1701
+insert 1712
+insert 1597
+insert 2737
+insert 363
+insert 3118
+insert 2006
+insert 2314
+insert 1205
+insert 1922
+insert 1293
+insert 1169
+insert 613
+insert 740
+insert 2678
+insert 655
+insert 385
+insert 1200
+insert 494
+insert 799
+insert 821
+insert 1282
+insert 2747
+insert 892
+insert 2656
+insert 1735
+insert 1766
+insert 2379
+insert 620
+insert 1776
+insert 1660
+insert 2999
+insert 3012
+insert 747
+insert 1797
+insert 1843
+insert 2074
+insert 1046
+insert 1194
+insert 136
+insert 551
+insert 147
+insert 41
+insert 429
+insert 198
+insert 272
+insert 459
+insert 2297
+insert 3174
+insert 1281
+insert 1274
+insert 1225
+insert 1780
+insert 1814
+insert 1726
+insert 1251
+insert 1305
+insert 1826
+insert 1859
+insert 1226
+insert 1187
+insert 2129
+insert 2853
+insert 3164
+insert 1497
+insert 2910
+insert 187
+insert 985
+insert 1414
+insert 2720
+insert 3299
+insert 2866
+insert 2850
+insert 1207
+insert 2308
+insert 879
+insert 2553
+insert 2554
+insert 1796
+insert 1802
+insert 1881
+insert 1738
+insert 1432
+insert 1317
+insert 2143
+insert 1747
+insert 2108
+insert 1406
+insert 3187
+insert 3065
+insert 3214
+insert 2364
+insert 2646
+insert 1942
+insert 25
+insert 162
+insert 469
+insert 511
+insert 370
+insert 377
+insert 3175
+insert 1609
+insert 2873
+insert 2802
+insert 3071
+insert 2623
+insert 2689
+insert 1358
+insert 2610
+insert 1903
+insert 2885
+insert 2036
+insert 2113
+insert 2784
+insert 2588
+insert 945
+insert 2744
+insert 190
+insert 2869
+insert 1505
+remove 2912
+insert 117
+insert 155
+insert 2723
+insert 1279
+insert 2801
+insert 2216
+insert 1736
+insert 688
+insert 3026
+insert 10
+insert 2771
+insert 2739
+insert 2162
+insert 546
+insert 1526
+insert 1501
+insert 1584
+insert 1541
+insert 1471
+insert 1548
+insert 508
+insert 2086
+insert 1858
+insert 2718
+insert 399
+insert 140
+insert 109
+insert 1869
+insert 560
+insert 1769
+insert 871
+insert 450
+insert 555
+insert 382
+insert 911
+insert 442
+insert 2236
+insert 2798
+insert 2069
+insert 795
+insert 931
+insert 1291
+insert 1275
+insert 576
+insert 2209
+insert 2212
+insert 2759
+insert 2248
+insert 2061
+insert 2224
+insert 2237
+insert 2525
+insert 2574
+insert 2244
+insert 2562
+insert 2196
+insert 3052
+insert 1266
+insert 1998
+insert 3020
+insert 3038
+insert 832
+insert 822
+insert 1359
+insert 2923
+insert 2063
+insert 2147
+insert 1976
+insert 1328
+insert 2976
+insert 1090
+insert 988
+insert 2761
+insert 1066
+insert 1719
+insert 126
+insert 151
+insert 1339
+insert 2158
+insert 1690
+insert 1692
+insert 2073
+insert 1829
+insert 1896
+insert 2005
+insert 2719
+insert 1376
+insert 2001
+insert 2057
+insert 2035
+insert 2924
+insert 1936
+insert 1461
+insert 2168
+insert 2245
+insert 1429
+insert 1409
+insert 2406
+insert 1318
+insert 1648
+insert 2843
+insert 3018
+insert 3011
+insert 3161
+insert 3028
+insert 2497
+insert 231
+insert 191
+insert 286
+insert 2188
+insert 2841
+insert 2228
+insert 2140
+insert 3133
+insert 1450
+insert 2103
+insert 1473
+insert 1487
+insert 3072
+insert 3093
+insert 3056
+insert 2894
+insert 1416
+insert 2897
+insert 2429
+insert 1956
+insert 1934
+insert 1940
+insert 1929
+insert 3084
+insert 2740
+insert 3298
+insert 3308
+insert 3247
+insert 2832
+insert 2163
+remove 2039
+insert 1899
+insert 1939
+insert 1399
+insert 1412
+insert 1365
+insert 2876
+insert 1897
+insert 2037
+insert 1930
+insert 1640
+insert 1931
+insert 3159
+insert 2899
+insert 2231
+insert 3147
+insert 2825
+insert 1243
+insert 1810
+insert 1872
+insert 3116
+insert 3165
+insert 2068
+insert 1874
+insert 2226
+insert 2250
+insert 2249
+insert 618
+insert 1370
+remove 1220
+insert 1354
+insert 1438
+insert 2213
+insert 1377
+insert 563
+insert 637
+insert 1933
+insert 734
+insert 761
+insert 29
+insert 2114
+insert 2194
+insert 2152
+insert 2217
+insert 314
+insert 440
+insert 393
+insert 670
+insert 785
+insert 2455
+insert 729
+insert 2271
+insert 2463
+insert 2481
+insert 2519
+insert 2488
+insert 1502
+insert 2485
+insert 2279
+insert 2638
+insert 656
+insert 574
+insert 2508
+insert 612
+insert 877
+insert 683
+insert 938
+insert 1298
+insert 1257
+insert 550
+insert 2117
+insert 2603
+insert 2702
+insert 2480
+insert 2941
+insert 2613
+insert 2281
+insert 1006
+insert 1016
+insert 2961
+insert 3033
+insert 1534
+insert 2962
+insert 2357
+insert 1216
+insert 1197
+insert 968
+insert 1002
+insert 1030
+insert 1003
+insert 1026
+insert 2708
+insert 2666
+insert 2542
+insert 2736
+insert 1870
+insert 2318
+insert 2344
+insert 3220
+insert 2635
+insert 3294
+insert 1183
+insert 2347
+insert 1396
+insert 2731
+insert 2164
+insert 2167
+insert 1411
+insert 2159
+insert 1694
+insert 1689
+insert 1714
+insert 1713
+insert 2373
+insert 2763
+insert 2820
+insert 3083
+insert 3030
+insert 3160
+insert 3010
+insert 3054
+insert 3112
+insert 3130
+insert 3095
+insert 3090
+insert 3158
+insert 3242
+insert 1691
+insert 3211
+insert 2418
+insert 1666
+insert 971
+insert 1695
+insert 1634
+insert 888
+insert 2794
+insert 2532
+insert 2887
+insert 2797
+insert 1316
+insert 2125
+insert 1696
+insert 1888
+insert 1706
+insert 1231
+insert 1234
+insert 2050
+insert 1235
+insert 2102
+insert 218
+insert 228
+insert 2461
+insert 3291
+insert 3267
+insert 1708
+insert 1721
+insert 1704
+insert 2792
+insert 2782
+insert 83
+insert 2906
+insert 1981
+insert 1245
+insert 1326
+insert 2622
+insert 2254
+insert 184
+insert 2750
+insert 2618
+insert 2679
+insert 2778
+insert 2628
+insert 855
+insert 2092
+insert 2118
+insert 1347
+insert 1527
+insert 2575
+insert 2119
+insert 2098
+insert 537
+insert 1623
+insert 2402
+insert 2054
+insert 193
+insert 1180
+insert 1378
+insert 1483
+insert 1188
+insert 2099
+insert 1184
+insert 1480
+insert 233
+insert 170
+insert 268
+insert 220
+insert 2261
+insert 1425
+insert 1932
+insert 1938
+insert 3047
+insert 1440
+insert 3105
+insert 3039
+insert 1443
+insert 1978
+insert 1996
+insert 1542
+insert 1547
+insert 1423
+insert 180
+insert 1585
+insert 1431
+insert 1586
+insert 2100
+insert 1444
+insert 2107
+insert 2896
+insert 1445
+insert 2743
+insert 1109
+insert 2751
+insert 2315
+insert 2634
+insert 1446
+insert 3288
+insert 1835
+insert 253
+insert 1504
+insert 371
+insert 504
+insert 204
+insert 2617
+insert 2388
+insert 107
+insert 131
+insert 111
+insert 1523
+insert 2909
+insert 1703
+insert 1717
+insert 1566
+insert 1151
+insert 1116
+insert 3172
+insert 2605
+insert 2641
+insert 1227
+insert 1230
+insert 1256
+insert 2725
+insert 1588
+insert 1529
+insert 1173
+insert 3142
+insert 3125
+insert 1581
+insert 578
+insert 3228
+insert 3239
+insert 599
+insert 759
+insert 3016
+insert 3025
+insert 619
+insert 653
+insert 626
+insert 2768
+insert 754
+insert 3231
+insert 3260
+insert 791
+insert 756
+insert 2405
+insert 2404
+insert 1474
+insert 1213
+insert 1211
+insert 2019
+insert 3077
+insert 3087
+insert 2555
+insert 1699
+insert 1464
+insert 2687
+insert 1578
+insert 1975
+insert 1490
+insert 1478
+insert 573
+insert 592
+insert 1655
+insert 1652
+insert 1669
+insert 1649
+insert 1092
+insert 1122
+insert 1153
+insert 2734
+insert 1676
+insert 1871
+insert 1131
+insert 2730
+insert 2729
+insert 1222
+insert 1196
+insert 2733
+insert 2793
+insert 1421
+insert 2672
+insert 1633
+insert 1472
+insert 2749
+insert 1477
+insert 1460
+insert 3050
+insert 1491
+insert 3114
+insert 2378
+insert 1427
+insert 1419
+insert 1722
+insert 1580
+insert 1449
+insert 1484
+insert 1053
+insert 1485
+insert 3085
+insert 2153
+insert 3002
+insert 2023
+insert 3008
+insert 2280
+insert 3003
+insert 2958
+insert 2972
+insert 3015
+insert 2803
+insert 3045
+insert 2127
+insert 2971
+insert 1437
+insert 1494
+insert 1486
+insert 3032
+insert 2809
+remove 1627
+insert 1428
+insert 775
+insert 5
+insert 3064
+insert 3107
+insert 3115
+insert 3138
+insert 3128
+insert 3111
+insert 1032
+insert 3075
+remove 298
+insert 3145
+insert 1572
+insert 186
+insert 1039
+insert 1086
+insert 236
+insert 1052
+insert 1385
+insert 252
+insert 1133
+insert 1108
+insert 928
+insert 1369
+insert 2116
+insert 2934
+insert 203
+insert 1113
+insert 2619
+insert 275
+insert 1844
+insert 1165
+insert 1868
+insert 194
+insert 254
+remove 297
+insert 2104
+insert 1603
+insert 2963
+insert 1672
+insert 3004
+insert 1683
+insert 1057
+insert 1807
+insert 2978
+insert 2004
+insert 1452
+insert 1482
+insert 2112
+insert 1436
+insert 1433
+insert 1602
+insert 1422
+insert 1575
+insert 1560
+insert 2649
+insert 1454
+insert 2658
+insert 2621
+insert 1702
+insert 1583
+insert 1467
+insert 1140
+insert 1229
+insert 1121
+insert 987
+insert 980
+insert 1174
+insert 1475
+insert 1615
+insert 1190
+insert 1619
+insert 1265
+insert 1621
+insert 1616
+insert 1492
+remove 1430
+insert 2905
+insert 1224
+insert 1538
+insert 1023
+insert 2807
+insert 1848
+insert 2659
+insert 1496
+insert 2710
+insert 1132
+insert 1154
+insert 1887
+insert 2593
+insert 1875
+remove 1429
+insert 1163
+insert 2983
+insert 2968
+insert 1587
+insert 222
+insert 283
+insert 263
+remove 1428
+insert 535
+insert 547
+insert 470
+insert 457
+insert 518
+insert 199
+insert 1263
+insert 1084
+insert 526
+insert 933
+insert 889
+remove 1437
+insert 246
+insert 530
+insert 903
+remove 2489
+insert 2682
+insert 2914
+insert 1716
+insert 2688
+insert 1332
+insert 2690
+insert 2722
+insert 2657
+insert 2908
+insert 1345
+insert 1582
+insert 2969
+insert 2612
+insert 213
+insert 225
+insert 1401
+insert 1340
+insert 1889
+insert 2017
+insert 961
+insert 1042
+insert 1873
+insert 2790
+insert 224
+insert 1177
+insert 202
+insert 1372
+insert 185
+insert 1520
+insert 1346
+insert 211
+insert 181
+insert 2745
+insert 2726
+insert 2870
+insert 1214
+insert 2940
+insert 2653
+insert 2219
+insert 2813
+insert 1532
+insert 2890
+insert 1195
+insert 1128
+insert 468
+insert 1592
+insert 1144
+remove 1219
+insert 3183
+insert 2774
+insert 1622
+insert 1141
+insert 3285
+insert 2274
+insert 2680
+insert 1161
+insert 1158
+insert 279
+insert 1613
+insert 142
+insert 1510
+insert 100
+insert 467
+insert 106
+insert 367
+insert 1546
+insert 1867
+insert 851
+insert 918
+insert 1845
+insert 1176
+insert 1178
+insert 1193
+insert 1884
+insert 2663
+insert 1617
+insert 1614
+insert 461
+insert 1783
+insert 2721
+insert 1851
+insert 3255
+insert 1517
+insert 237
+insert 1535
+insert 1973
+insert 2880
+insert 2883
+insert 1928
+remove 1424
+insert 2991
+insert 2202
+insert 1574
+insert 2206
+insert 538
+insert 1573
+insert 96
+insert 3
+insert 32
+insert 13
+insert 98
+insert 121
+insert 30
+insert 66
+insert 127
+insert 118
+insert 2732
+remove 1166
+insert 113
+insert 628
+insert 2246
+insert 1567
+insert 1688
+insert 1579
+insert 3014
+insert 2223
+insert 2145
+insert 2232
+insert 2190
+insert 2053
+insert 1882
+insert 381
+insert 3170
+insert 2651
+insert 3148
+insert 1805
+insert 543
+insert 406
+insert 517
+insert 454
+insert 1664
+insert 2806
+insert 1886
+insert 1865
+insert 3135
+insert 3179
+insert 2156
+insert 1628
+insert 1636
+insert 1819
+insert 2151
+insert 1968
+insert 2009
+insert 2134
+insert 3237
+insert 2886
+insert 2262
+insert 2957
+insert 2959
+insert 1972
+insert 31
+insert 842
+insert 2193
+insert 2106
+insert 2755
+insert 2645
+insert 2091
+insert 3001
+insert 2901
+insert 1678
+insert 2144
+insert 2891
+insert 1728
+insert 1645
+insert 1745
+insert 3166
+insert 1662
+insert 1366
+insert 2105
+insert 1612
+insert 2882
+insert 2528
+insert 1987
+insert 1599
+insert 229
+insert 1284
+insert 1156
+insert 1296
+insert 1297
+insert 2570
+insert 2078
+insert 2307
+insert 2565
+insert 2847
+insert 1343
+insert 1323
+insert 2900
+insert 2902
+insert 2089
+insert 1259
+insert 1288
+insert 2912
+insert 1252
+insert 256
+insert 232
+insert 230
+insert 2888
+insert 2684
+insert 2111
+insert 2090
+insert 2693
+insert 240
+insert 2898
+insert 295
+insert 2893
+insert 2264
+insert 2884
+insert 2705
+insert 2859
+insert 2904
+insert 2222
+insert 2889
+insert 389
+insert 1397
+insert 1407
+insert 1862
+insert 1250
+insert 1969
+insert 1375
+insert 1404
+insert 2433
+insert 2436
+insert 2948
+insert 1402
+insert 1320
+insert 1271
+insert 2453
+insert 2439
+insert 1300
+insert 2421
+insert 2110
+insert 2430
+insert 2121
+insert 2205
+insert 1353
+insert 509
+insert 515
+insert 1249
+insert 2919
+insert 2960
+insert 1389
+insert 139
+insert 542
+insert 2026
+insert 2039
+insert 2586
+insert 2581
+insert 2137
+insert 2936
+insert 2412
+insert 2431
+insert 2393
+insert 2362
+insert 2484
+insert 2440
+insert 2413
+insert 2468
+insert 2556
+insert 1898
+insert 1624
+insert 766
+insert 1608
+insert 1600
+insert 669
+insert 659
+insert 658
+insert 328
+insert 3221
+insert 3194
+insert 144
+insert 477
+insert 372
+insert 426
+insert 145
+insert 310
+insert 423
+insert 621
+insert 641
+insert 725
+insert 738
+insert 2093
+insert 2590
+insert 2499
+insert 1919
+insert 329
+insert 311
+insert 2580
+insert 2221
+insert 2833
+insert 2243
+insert 1564
+insert 2258
+insert 1917
+insert 2239
+insert 1901
+insert 2235
+insert 2701
+insert 2992
+insert 2752
+insert 395
+insert 2047
+insert 1967
+insert 1962
+insert 353
+insert 391
+insert 339
+insert 2211
+insert 419
+insert 409
+insert 2230
+insert 2247
+insert 2189
+insert 2229
+insert 907
+insert 957
+insert 1604
+insert 859
+insert 848
+insert 1838
+insert 883
+insert 1620
+insert 3213
+insert 456
+insert 2438
+insert 444
+insert 402
+insert 414
+insert 331
+insert 2448
+insert 400
+insert 284
+insert 421
+insert 365
+insert 280
+insert 208
+insert 2290
+insert 1596
+insert 1570
+insert 1594
+insert 1550
+remove 1490
+insert 1348
+insert 1344
+insert 1390
+insert 1511
+insert 1342
+insert 1306
+insert 1264
+insert 1286
+insert 2977
+insert 1371
+insert 1408
+insert 1544
+insert 1238
+insert 1242
+insert 2852
+insert 1605
+insert 1625
+insert 1334
+insert 1327
+insert 1576
+insert 2949
+insert 1565
+insert 3034
+insert 1589
+insert 2945
+insert 2973
+insert 2975
+insert 1637
+insert 2422
+insert 2860
+insert 2056
+insert 2045
+insert 2811
+insert 2812
+insert 2289
+insert 2041
+insert 2207
+insert 2920
+insert 1632
+insert 1394
+insert 3199
+insert 3287
+insert 3305
+insert 1368
+remove 3116
+insert 2021
+insert 3280
+insert 1964
+insert 2161
+insert 3273
+insert 1986
+insert 2022
+insert 2130
+insert 3240
+insert 3261
+insert 2040
+insert 3272
+insert 1883
+insert 1577
+insert 1555
+insert 1828
+insert 2055
+insert 2072
+insert 2257
+insert 2259
+insert 2070
+insert 2238
+insert 1591
+insert 2180
+insert 2120
+insert 2182
+insert 1360
+insert 2506
+insert 1382
+insert 2510
+insert 2220
+insert 1355
+insert 2141
+insert 1337
+insert 2437
+insert 2469
+insert 2443
+insert 1863
+insert 2166
+insert 2585
+insert 2139
+insert 2522
+insert 2331
+insert 2503
+insert 2210
+insert 2175
+insert 11
+insert 1515
+insert 119
+insert 1519
+insert 1593
+insert 201
+insert 258
+insert 1601
+insert 205
+insert 2176
+insert 1403
+insert 1598
+insert 1522
+insert 1514
+insert 1466
+insert 3274
+insert 1561
+insert 1393
+insert 2157
+insert 1503
+insert 910
+insert 924
+insert 861
+insert 388
+insert 3205
+insert 407
+insert 932
+insert 195
+insert 942
+insert 241
+insert 922
+insert 2024
+insert 864
+insert 1627
+insert 271
+insert 265
+insert 2376
+insert 247
+insert 2077
+insert 2277
+insert 3202
+insert 2267
+insert 2464
+insert 2446
+insert 1367
+insert 1380
+insert 2301
+insert 1405
+insert 2348
+insert 418
+insert 396
+insert 413
+insert 1363
+insert 1294
+insert 3229
+insert 3217
+remove 1411
+insert 2540
+insert 2633
+insert 1388
+insert 2577
+insert 2557
+insert 1272
+insert 2502
+insert 2516
+insert 2564
+insert 2559
+insert 2434
+insert 1953
+insert 2664
+insert 1837
+insert 2677
+insert 1827
+insert 2625
+insert 2667
+insert 2369
+insert 2360
+insert 1880
+insert 2387
+insert 335
+insert 2416
+insert 2643
+remove 1312
+insert 2410
+insert 2420
+insert 2411
+insert 2368
+insert 2374
+insert 2375
+insert 2417
+insert 2383
+insert 2395
+insert 1350
+insert 1260
+insert 1244
+insert 2123
+insert 1509
+insert 2584
+insert 2582
+insert 2578
+insert 1911
+insert 2479
+insert 2566
+insert 2346
+insert 2292
+insert 691
+insert 1277
+insert 882
+insert 846
+insert 2287
+insert 849
+insert 866
+insert 55
+insert 2526
+insert 869
+insert 827
+insert 1171
+insert 1533
+insert 350
+insert 46
+insert 135
+insert 2615
+insert 1528
+insert 1554
+insert 1539
+insert 1468
+insert 3185
+insert 1182
+insert 1479
+remove 1495
+insert 1507
+insert 1518
+insert 384
+insert 1301
+insert 1240
+insert 1254
+insert 112
+insert 75
+insert 72
+remove 1494
+insert 138
+insert 89
+insert 2840
+insert 200
+insert 1191
+insert 168
+insert 167
+insert 890
+insert 944
+insert 920
+insert 868
+insert 839
+insert 1146
+insert 1012
+insert 2255
+insert 2815
+insert 1563
+insert 2579
+insert 1545
+insert 2583
+insert 3089
+insert 1785
+insert 2273
+remove 1370
+insert 1739
+insert 3098
+insert 192
+insert 2242
+insert 172
+insert 3091
+insert 935
+insert 221
+insert 251
+insert 178
+insert 1751
+insert 369
+insert 929
+insert 82
+insert 436
+insert 276
+insert 244
+insert 387
+remove 2216
+insert 410
+insert 3053
+insert 1498
+insert 2826
+insert 366
+remove 1238
+insert 289
+insert 972
+insert 1761
+insert 441
+insert 361
+insert 401
+insert 2306
+insert 2390
+insert 2291
+insert 1199
+insert 982
+insert 270
+remove 1399
+insert 1551
+remove 1346
+insert 2169
+insert 986
+insert 394
+insert 3116
+insert 2272
+insert 3119
+insert 1494
+insert 3236
+insert 916
+insert 896
+insert 3152
+insert 3248
+insert 2132
+insert 2131
+insert 2155
+insert 1338
+insert 1043
+insert 954
+insert 3167
+insert 1562
+insert 3134
+insert 1571
+insert 898
+insert 1540
+insert 930
+insert 949
+insert 863
+insert 507
+insert 923
+insert 840
+insert 914
+insert 899
+insert 2184
+insert 2204
+insert 2128
+insert 2160
+insert 2173
+insert 2191
+insert 2171
+insert 2177
+insert 2179
+insert 1549
+insert 1569
+insert 1500
+remove 1389
+insert 1823
+insert 1812
+remove 1371
+remove 1375
+insert 1792
+insert 831
+insert 1831
+insert 1516
+insert 1822
+insert 1846
+insert 125
+insert 1799
+insert 129
+insert 1825
+insert 1836
+insert 210
+insert 188
+insert 1499
+insert 174
+insert 99
+insert 1833
+insert 1028
+insert 1024
+insert 1362
+insert 217
+insert 952
+insert 838
+insert 835
+insert 886
+insert 904
+insert 1041
+insert 1047
+insert 124
+insert 179
+insert 134
+insert 173
+insert 209
+insert 215
+insert 901
+insert 19
+insert 141
+remove 1387
+insert 177
+insert 160
+insert 157
+insert 998
+insert 16
+insert 1789
+insert 1748
+insert 1784
+insert 1818
+insert 908
+insert 950
+insert 939
+insert 936
+insert 1531
+insert 919
+insert 905
+insert 937
+insert 582
+insert 664
+insert 597
+insert 906
+insert 549
+insert 506
+insert 575
+insert 479
+insert 947
+insert 76
+insert 577
+insert 56
+insert 51
+insert 623
+insert 652
+remove 1364
+insert 1537
+remove 1396
+insert 1434
+insert 1415
+insert 1346
+insert 1399
+insert 1335
+insert 1513
+remove 1403
+insert 1536
+remove 1409
+remove 1366
+insert 1391
+remove 1287
+insert 1280
+remove 1503
+remove 1406
+insert 1383
+insert 2549
+insert 2538
+insert 2495
+insert 1268
+remove 1390
+insert 2527
+remove 1493
+remove 1394
+insert 1255
+remove 1315
+remove 1311
+insert 1276
+insert 1331
+remove 1317
+insert 1400
+remove 1354
+insert 1322
+insert 1357
+insert 1481
+remove 1405
+insert 285
+insert 288
+insert 261
+insert 640
+insert 632
+insert 525
+insert 266
+insert 962
+insert 629
+insert 378
+insert 380
+remove 1359
+insert 1351
+insert 587
+insert 368
+insert 376
+insert 1333
+insert 1050
+insert 1040
+insert 337
+insert 1352
+insert 3196
+insert 1997
+insert 326
+remove 2228
+insert 17
+insert 320
+insert 86
+remove 1502
+insert 1135
+remove 1298
+insert 132
+insert 156
+insert 1361
+insert 1215
+insert 2775
+insert 122
+insert 2816
+insert 2800
+insert 2799
+insert 1208
+insert 1285
+insert 1329
+insert 1201
+insert 1951
+insert 2786
+insert 2783
+insert 2822
+insert 2827
+insert 2805
+insert 2956
+insert 2862
+insert 2988
+insert 953
+insert 2791
+insert 2844
+insert 2777
+insert 2846
+insert 2785
+insert 2951
+insert 430
+insert 375
+insert 104
+insert 154
+insert 427
+insert 373
+insert 1025
+insert 146
+insert 379
+insert 894
+insert 867
+insert 969
+insert 159
+insert 887
+insert 876
+insert 176
+insert 1027
+insert 1119
+insert 994
+insert 917
+insert 1349
+insert 153
+insert 1033
+insert 875
+insert 0
+insert 1336
+insert 912
+remove 1357
+insert 501
+insert 206
+insert 1029
+insert 1081
+insert 152
+insert 1115
+insert 545
+insert 1044
+insert 1145
+insert 909
+insert 472
+insert 1056
+insert 845
+insert 881
+insert 1112
+insert 915
+insert 536
+insert 383
+insert 544
+insert 163
+insert 558
+remove 1343
+insert 1292
+insert 103
+insert 1321
+insert 554
+insert 825
+insert 559
+insert 539
+insert 242
+insert 556
+insert 235
+insert 245
+insert 133
+insert 374
+insert 161
+insert 34
+insert 1143
+insert 1136
+insert 1059
+insert 1087
+insert 1155
+insert 143
+insert 158
+insert 123
+insert 115
+insert 166
+insert 893
+insert 94
+insert 71
+insert 88
+insert 18
+remove 1314
+insert 238
+insert 260
+insert 1130
+insert 984
+insert 1152
+insert 1079
+insert 557
+insert 223
+insert 207
+insert 257
+insert 281
+insert 292
+insert 532
+insert 197
+insert 274
+insert 497
+insert 2655
+insert 267
+insert 686
+insert 212
+insert 854
+insert 880
+insert 325
+insert 673
+insert 216
+insert 196
+insert 7
+insert 782
+insert 2669
+insert 63
+insert 744
+insert 1
+insert 277
+insert 214
+insert 364
+insert 148
+insert 57
+remove 1274
+insert 727
+insert 787
+insert 772
+insert 20
+insert 293
+insert 773
+insert 1010
+insert 183
+insert 873
+insert 617
+insert 836
+insert 878
+insert 451
+insert 313
+insert 607
+insert 1102
+insert 386
+insert 424
+insert 404
+insert 650
+insert 826
+insert 1162
+insert 794
+insert 334
+insert 101
+insert 345
+insert 110
+insert 865
+insert 226
+insert 667
+insert 1088
+insert 651
+insert 273
+insert 870
+insert 852
+insert 189
+insert 1045
+insert 1031
+insert 102
+insert 347
+insert 54
+remove 1345
+insert 354
+insert 631
+insert 1159
+insert 837
+insert 150
+insert 105
+insert 583
+insert 657
+insert 606
+insert 624
+insert 2
+insert 9
+insert 601
+insert 248
+insert 360
+insert 663
+insert 777
+insert 315
+insert 615
+insert 765
+insert 750
+insert 593
+insert 595
+insert 548
+insert 979
+insert 1049
+insert 1157
+insert 1148
+insert 322
+insert 332
+insert 1051
+insert 1013
+insert 349
+insert 552
+insert 390
+insert 974
+insert 1080
+insert 392
+insert 1325
+remove 1328
+insert 1054
+insert 1034
+insert 478
+insert 287
+insert 1302
+insert 805
+insert 492
+insert 24
+insert 529
+insert 533
+insert 165
+insert 79
+insert 584
+insert 884
+insert 815
+insert 776
+insert 534
+insert 49
+insert 524
+insert 874
+insert 264
+insert 482
+insert 495
+insert 505
+insert 810
+insert 885
+insert 64
+insert 1364
+insert 726
+insert 858
+insert 249
+insert 757
+insert 743
+insert 358
+insert 921
+insert 521
+insert 739
+insert 857
+insert 318
+insert 282
+insert 951
+insert 1246
+insert 745
+insert 26
+insert 21
+insert 58
+remove 1352
+insert 302
+insert 1270
+insert 1058
+insert 8
+insert 803
+insert 316
+insert 770
+insert 262
+insert 27
+insert 611
+insert 1289
+insert 73
+insert 23
+insert 856
+insert 527
+insert 52
+insert 1253
+insert 760
+insert 120
+insert 807
+insert 643
+insert 116
+insert 362
+insert 646
+insert 668
+insert 642
+insert 227
+insert 1104
+insert 680
+insert 812
+insert 793
+insert 823
+insert 717
+insert 755
+insert 1781
+insert 1065
+insert 636
+insert 290
+insert 767
+insert 1261
+insert 1283
+insert 1295
+remove 1351
+remove 1341
+remove 1339
+insert 1262
+insert 397
+insert 408
+insert 445
+insert 746
+insert 437
+insert 710
+insert 723
+insert 403
+insert 715
+insert 434
+insert 514
+insert 681
+insert 540
+insert 463
+insert 490
+insert 438
+insert 806
+insert 420
+insert 741
+insert 714
+insert 692
+insert 458
+insert 447
+insert 448
+insert 753
+insert 412
+insert 728
+insert 718
+remove 1296
+remove 1276
+insert 735
+insert 1209
+insert 1036
+insert 1124
+insert 722
+insert 748
+insert 742
+insert 724
+insert 1181
+insert 751
+insert 733
+insert 416
+insert 1170
+insert 446
+insert 2881
+remove 1358
+remove 1288
+insert 449
+insert 40
+insert 33
+insert 130
+insert 1456
+insert 1418
+remove 1489
+insert 1455
+insert 1453
+remove 1473
+remove 1478
+remove 1484
+insert 2154
+insert 1470
+insert 1462
+remove 1487
+insert 1909
+insert 1914
+insert 1465
+insert 1853
+remove 1410
+insert 2252
+remove 1483
+remove 1467
+remove 1316
+insert 948
+insert 1296
+insert 1750
+insert 171
+insert 1238
+insert 749
+insert 697
+insert 219
+insert 721
+insert 828
+insert 2327
+insert 737
+insert 1760
+insert 1775
+insert 1782
+insert 685
+insert 1778
+insert 731
+insert 2352
+insert 706
+insert 1762
+insert 679
+insert 732
+insert 1767
+insert 2325
+insert 2208
+insert 1788
+insert 1772
+insert 1771
+insert 1765
+insert 752
+insert 674
+insert 690
+insert 2353
+insert 1980
+insert 2142
+insert 2286
+insert 2200
+insert 1954
+insert 2338
+insert 453
+insert 411
+insert 2339
+insert 2192
+insert 1749
+insert 2334
+insert 1993
+insert 2015
+insert 428
+insert 2322
+insert 433
+insert 2178
+insert 1727
+remove 1488
+remove 1363
+insert 1916
+insert 2335
+insert 1311
+remove 1461
+insert 2332
+insert 2319
+insert 2930
+insert 1278
+insert 2753
+insert 1754
+insert 2321
+insert 2851
+insert 2214
+insert 2172
+insert 2170
+insert 1314
+remove 1283
+insert 1786
+insert 250
+remove 1355
+insert 1317
+insert 1958
+remove 1325
+insert 2839
+insert 1074
+insert 1752
+insert 2124
+remove 2259
+insert 1457
+insert 1487
+insert 2146
+insert 2138
+remove 2257
+insert 2150
+insert 2241
+insert 1937
+insert 2148
+insert 1730
+insert 1308
+insert 1239
+remove 1165
+insert 2183
+insert 1920
+insert 834
+insert 764
+insert 853
+remove 2258
+insert 2233
+insert 1842
+insert 1943
+insert 847
+insert 783
+insert 1935
+insert 816
+insert 2186
+insert 2126
+insert 2149
+insert 792
+insert 1927
+insert 1315
+insert 1912
+remove 1280
+insert 1902
+insert 1915
+insert 820
+remove 1324
+insert 1923
+insert 1390
+insert 813
+insert 695
+insert 817
+insert 1926
+insert 1895
+insert 705
+insert 1389
+insert 790
+insert 682
+remove 1491
+insert 786
+insert 796
+insert 804
+insert 800
+insert 1950
+insert 811
+insert 771
+insert 435
+insert 452
+insert 464
+insert 432
+insert 784
+insert 900
+remove 1957
+insert 417
+insert 425
+insert 2695
+insert 2796
+insert 415
+insert 48
+insert 801
+insert 802
+insert 1069
+insert 603
+insert 460
+insert 422
+insert 439
+insert 774
+remove 1448
+insert 779
+insert 579
+insert 809
+insert 762
+insert 778
+insert 798
+insert 622
+insert 797
+insert 819
+insert 814
+insert 565
+insert 780
+insert 600
+insert 781
+insert 789
+insert 763
+insert 768
+insert 818
+remove 1408
+insert 1794
+insert 2350
+insert 581
+insert 2384
+insert 590
+insert 2349
+insert 466
+insert 2351
+insert 2394
+insert 608
+insert 598
+insert 519
+insert 633
+insert 485
+insert 627
+insert 2293
+insert 2253
+insert 2817
+insert 2366
+insert 500
+insert 2600
+insert 2627
+insert 2310
+remove 980
+insert 1110
+insert 1757
+insert 512
+insert 568
+insert 462
+insert 498
+remove 1342
+insert 2808
+insert 496
+insert 1258
+insert 1120
+insert 1150
+insert 91
+insert 1316
+insert 47
+insert 1312
+insert 1324
+insert 513
+insert 499
+insert 481
+insert 465
+insert 483
+insert 474
+insert 487
+insert 491
+insert 522
+insert 502
+insert 934
+remove 1300
+insert 510
+remove 1297
+remove 1273
+insert 1946
+insert 476
+insert 97
+insert 1138
+insert 503
+insert 1357
+insert 489
+insert 1147
+insert 42
+insert 1267
+insert 1248
+remove 1329
+insert 486
+insert 520
+insert 1082
+remove 1272
+insert 1068
+remove 1360
+insert 50
+remove 987
+remove 1364
+remove 1314
+insert 1283
+insert 1280
+insert 84
+remove 1344
+remove 1318
+insert 1341
+insert 59
+insert 471
+insert 1077
+insert 473
+insert 1070
+remove 1299
+remove 1315
+remove 1282
+insert 1276
+insert 3132
+remove 1347
+insert 3124
+insert 516
+insert 488
+remove 1362
+insert 300
+insert 1891
+insert 312
+insert 1118
+insert 475
+insert 359
+insert 1362
+insert 309
+insert 1067
+insert 1830
+insert 3027
+insert 2052
+insert 1816
+insert 2027
+insert 1098
+insert 1855
+insert 1078
+insert 1817
+insert 484
+insert 1142
+remove 962
+insert 1062
+insert 2563
+insert 1839
+insert 2576
+insert 1072
+insert 1107
+insert 992
+insert 1020
+insert 355
+insert 343
+insert 1094
+insert 1064
+insert 1125
+insert 1808
+insert 1236
+insert 1071
+insert 1103
+insert 1233
+insert 1840
+insert 1850
+remove 1235
+insert 1089
+insert 1815
+insert 1763
+insert 976
+insert 1773
+insert 1091
+insert 1018
+insert 1083
+insert 1075
+insert 1114
+insert 35
+insert 1123
+insert 1106
+insert 1834
+insert 1017
+insert 1117
+remove 1269
+insert 1111
+insert 1247
+insert 993
+insert 604
+insert 1849
+insert 1820
+insert 1105
+insert 2336
+insert 1095
+insert 569
+insert 2320
+insert 341
+insert 3249
+insert 983
+insert 308
+insert 306
+insert 2551
+insert 564
+remove 1311
+insert 1011
+insert 2311
+insert 1841
+insert 2871
+insert 2865
+insert 610
+insert 2828
+insert 609
+insert 2829
+insert 2834
+insert 2837
+insert 2836
+insert 321
+insert 2861
+insert 2324
+insert 2875
+insert 995
+insert 585
+insert 570
+insert 616
+insert 1906
+insert 1900
+insert 2874
+insert 2312
+insert 2787
+insert 80
+insert 2372
+insert 970
+insert 588
+insert 95
+insert 1126
+insert 324
+insert 602
+insert 571
+insert 589
+insert 561
+insert 586
+insert 342
+insert 61
+insert 2835
+insert 36
+insert 2879
+insert 2856
+insert 317
+insert 39
+insert 572
+insert 1009
+insert 654
+insert 625
+insert 2857
+insert 2830
+insert 2854
+insert 2345
+insert 2878
+insert 614
+insert 1073
+insert 1096
+insert 580
+remove 674
+insert 1005
+remove 681
+insert 635
+insert 1007
+insert 2491
+insert 2606
+insert 298
+remove 706
+insert 356
+insert 645
+insert 2595
+remove 698
+remove 692
+insert 2624
+insert 630
+insert 2642
+remove 668
+insert 2864
+insert 37
+insert 3245
+insert 2849
+insert 980
+insert 2877
+insert 2868
+insert 977
+insert 2316
+insert 2842
+insert 67
+remove 659
+insert 2500
+insert 336
+insert 81
+insert 3192
+remove 720
+remove 1164
+insert 3244
+insert 2824
+insert 2543
+insert 2295
+insert 703
+insert 2328
+insert 348
+insert 323
+insert 2823
+insert 2855
+insert 566
+insert 562
+insert 2831
+insert 2654
+insert 330
+insert 596
+insert 2700
+insert 981
+insert 346
+insert 299
+insert 591
+insert 38
+insert 1970
+remove 1268
+insert 2355
+insert 2507
+insert 2079
+insert 43
+insert 74
+insert 301
+insert 357
+insert 327
+insert 351
+insert 1990
+insert 2323
+insert 297
+insert 2300
+insert 594
+insert 2330
+insert 344
+insert 965
+insert 967
+insert 307
+insert 304
+insert 340
+insert 3241
+insert 3284
+insert 2673
+remove 1090
+insert 319
+insert 87
+insert 2699
+insert 305
+insert 85
+insert 3283
+insert 77
+insert 1008
+insert 93
+insert 2671
+insert 2530
+insert 684
+insert 78
+insert 303
+insert 2661
+insert 674
+insert 707
+insert 3169
+remove 1234
+remove 1104
+insert 2020
+insert 996
+insert 68
+insert 92
+insert 69
+insert 963
+insert 70
+insert 1977
+insert 2033
+insert 2524
+insert 1004
+insert 2450
+insert 60
+insert 701
+insert 44
+insert 671
+insert 1097
+insert 1099
+insert 720
+insert 962
+insert 1021
+insert 702
+insert 997
+insert 2709
+insert 2462
+remove 1096
+insert 2370
+insert 2298
+insert 2676
+remove 1199
+insert 2414
+insert 687
+insert 2080
+remove 1095
+insert 706
+insert 1100
+insert 1101
+insert 2668
+insert 1127
+insert 2046
+insert 2060
+insert 2044
+remove 1110
+insert 699
+insert 2714
+insert 2472
+insert 2014
+remove 1120
+insert 3234
+insert 2428
+insert 3250
+insert 1994
+insert 700
+insert 3233
+insert 964
+insert 2998
+insert 3193
+insert 2011
+insert 709
+insert 2030
+insert 3257
+insert 3264
+insert 3216
+insert 1000
+insert 3276
+insert 2717
+insert 2660
+insert 975
+remove 1087
+insert 3278
+insert 2533
+insert 3268
+insert 990
+insert 1001
+insert 2487
+insert 973
+insert 2034
+remove 1111
+insert 2517
+insert 1063
+insert 3306
+insert 696
+insert 1061
+insert 2552
+remove 1119
+insert 2432
+insert 2707
+insert 2326
+insert 716
+insert 660
+remove 1122
+insert 3271
+insert 2424
+insert 3013
+insert 3238
+insert 3258
+insert 692
+insert 3203
+insert 2294
+insert 1979
+insert 2997
+insert 2391
+insert 2029
+insert 1630
+insert 956
+insert 2505
+insert 3215
+insert 1641
+insert 3302
+insert 2367
+insert 676
+insert 2381
+insert 666
+insert 675
+insert 1015
+remove 1112
+insert 2071
+insert 3043
+insert 3301
+insert 2475
+insert 698
+insert 2031
+insert 3048
+insert 2644
+insert 2419
+insert 2059
+insert 2550
+insert 3046
+insert 2067
+insert 3312
+insert 3296
+insert 3006
+insert 2965
+insert 2460
+insert 2652
+insert 2758
+insert 677
+insert 1959
+insert 713
+insert 2359
+insert 2694
+insert 2674
+insert 2703
+insert 1684
+insert 2713
+insert 1653
+insert 2964
+insert 2389
+insert 3086
+insert 3204
+insert 3021
+insert 2639
+insert 2616
+insert 3246
+insert 3195
+insert 2795
+insert 3036
+insert 3207
+insert 2630
+insert 1682
+insert 2670
+insert 2085
+insert 3297
+insert 711
+insert 2712
+insert 2477
+insert 2681
+insert 659
+insert 2706
+insert 2683
+insert 3219
+insert 3282
+insert 3101
+insert 3109
+insert 2049
+insert 2007
+insert 3094
+insert 2716
+insert 2451
+insert 2922
+insert 2081
+insert 1629
+insert 2075
+insert 2483
+insert 2025
+insert 2691
+insert 693
+insert 2602
+insert 2513
+insert 2662
+insert 681
+insert 662
+insert 678
+insert 2986
+insert 3292
+insert 2492
+insert 3251
+insert 661
+insert 1988
+insert 2032
+insert 689
+insert 708
+insert 2944
+insert 694
+insert 2697
+insert 2604
+insert 2620
+insert 2435
+insert 3029
+insert 2970
+insert 2974
+insert 2607
+insert 2766
+insert 3061
+insert 3103
+insert 1674
+insert 1673
+insert 2648
+insert 3009
+insert 2051
+insert 1852
+insert 2082
+insert 2008
+insert 3079
+insert 1971
+insert 3212
+insert 2084
+insert 1656
+insert 665
+insert 1685
+insert 2990
+insert 2984
+insert 2942
+insert 2536
+insert 3190
+insert 2062
+insert 3188
+insert 3073
+insert 3102
+insert 3096
+insert 2987
+insert 3092
+insert 2760
+insert 2631
+insert 2066
+insert 2943
+insert 2926
+insert 2950
+insert 2058
+insert 2589
+insert 2598
+insert 3131
+insert 3120
+insert 1832
+insert 2363
+insert 2083
+insert 2933
+insert 2967
+insert 3082
+insert 3100
+insert 2415
+insert 2776
+insert 1983
+insert 1813
+insert 3099
+insert 2493
+insert 2597
+insert 2537
+insert 2010
+insert 1643
+insert 3191
+insert 2989
+insert 2937
+insert 3149
+insert 3057
+insert 2013
+insert 2929
+insert 3176
+insert 2636
+insert 3163
+remove 1163
+insert 1984
+insert 2000
+insert 2608
+insert 2043
+insert 3137
+insert 3189
+insert 3263
+insert 2994
+insert 2498
+insert 2596
+insert 1800
+insert 3259
+insert 1759
+insert 2762
+insert 3023
+insert 3017
+insert 2955
+insert 2592
+insert 2511
+insert 3005
+insert 3097
+insert 3121
+insert 2629
+insert 2534
+insert 2927
+insert 2544
+insert 3055
+insert 2640
+insert 1821
+insert 3300
+insert 3153
+insert 2954
+insert 3275
+insert 3227
+insert 3168
+insert 3225
+insert 1801
+insert 1744
+insert 3154
+insert 3143
+insert 2452
+insert 2614
+insert 3044
+insert 2611
+insert 2409
+insert 2407
+insert 3070
+insert 2545
+insert 2953
+insert 3243
+insert 2947
+insert 2626
+insert 2398
+insert 2392
+insert 3222
+insert 3108
+insert 2377
+insert 3177
+insert 3150
+insert 2490
+insert 2456
+insert 2478
+insert 3155
+insert 2535
+insert 2501
+insert 2380
+insert 3232
+insert 1670
+remove 1129
+insert 2985
+insert 2408
+insert 2473
+insert 3122
+insert 1991
+insert 3067
+insert 1963
+insert 2423
+insert 2928
+insert 2458
+insert 2382
+insert 2993
+insert 3019
+insert 2489
+insert 3139
+insert 3068
+insert 3088
+insert 1961
+insert 2003
+insert 3146
+insert 3066
+insert 3173
+insert 3162
+insert 2016
+insert 2486
+insert 3042
+insert 1995
+insert 2444
+insert 2457
+insert 3069
+insert 3157
+insert 3186
+insert 2939
+insert 1646
+insert 2470
+insert 2982
+insert 2547
+insert 2780
+insert 3265
+insert 3178
+insert 1681
+insert 2788
+insert 3218
+insert 2012
+insert 3253
+insert 3252
+insert 1668
+insert 2789
+insert 3041
+insert 2938
+insert 2754
+insert 2002
+insert 1644
+insert 2343
+insert 3180
+insert 1675
+insert 3230
+insert 1631
+insert 2504
+insert 2767
+insert 3126
+insert 3254
+insert 3310
+insert 2466
+insert 3141
+insert 2770
+insert 3311
+insert 1907
+insert 3286
+insert 3110
+insert 3051
+insert 1957
+insert 2772
+insert 1944
+insert 1989
+insert 3256
+insert 2529
+insert 2317
+insert 3040
+insert 1658
+insert 1893
+insert 3104
+insert 2810
+insert 2482
+insert 2979
+insert 3058
+insert 2474
+insert 1671
+insert 1659
+insert 3007
+insert 2541
+insert 966
+insert 2459
+insert 2546
+insert 1677
+insert 2496
+insert 1635
+insert 1650
+insert 1680
+insert 2403
+insert 3106
+insert 2426
+insert 3080
+insert 2447
+insert 3022
+insert 3210
+insert 2304
+insert 2996
+insert 2465
+insert 2449
+insert 2371
+insert 2765
+insert 2514
+insert 3197
+insert 2427
+remove 1086
diff --git a/vendor/im-rc/src/proptest.rs b/vendor/im-rc/src/proptest.rs
new file mode 100644
index 0000000..9180ef2
--- /dev/null
+++ b/vendor/im-rc/src/proptest.rs
@@ -0,0 +1,164 @@
+//! Proptest strategies.
+//!
+//! These are only available when using the `proptest` feature flag.
+
+use crate::{HashMap, HashSet, OrdMap, OrdSet, Vector};
+use ::proptest::collection::vec;
+use ::proptest::strategy::{BoxedStrategy, Strategy, ValueTree};
+use std::hash::Hash;
+use std::iter::FromIterator;
+use std::ops::Range;
+
+/// A strategy for generating a [`Vector`][Vector] of a certain size.
+///
+/// # Examples
+///
+/// ```rust,no_run
+/// # use ::proptest::proptest;
+/// proptest! {
+/// #[test]
+/// fn proptest_a_vector(ref l in vector(".*", 10..100)) {
+/// assert!(l.len() < 100);
+/// assert!(l.len() >= 10);
+/// }
+/// }
+/// ```
+///
+/// [Vector]: ../struct.Vector.html
+pub fn vector<A: Strategy + 'static>(
+ element: A,
+ size: Range<usize>,
+) -> BoxedStrategy<Vector<<A::Tree as ValueTree>::Value>>
+where
+ <A::Tree as ValueTree>::Value: Clone,
+{
+ vec(element, size).prop_map(Vector::from_iter).boxed()
+}
+
+/// A strategy for an [`OrdMap`][OrdMap] of a given size.
+///
+/// # Examples
+///
+/// ```rust,no_run
+/// # use ::proptest::proptest;
+/// proptest! {
+/// #[test]
+/// fn proptest_works(ref m in ord_map(0..9999, ".*", 10..100)) {
+/// assert!(m.len() < 100);
+/// assert!(m.len() >= 10);
+/// }
+/// }
+/// ```
+///
+/// [OrdMap]: ../struct.OrdMap.html
+pub fn ord_map<K: Strategy + 'static, V: Strategy + 'static>(
+ key: K,
+ value: V,
+ size: Range<usize>,
+) -> BoxedStrategy<OrdMap<<K::Tree as ValueTree>::Value, <V::Tree as ValueTree>::Value>>
+where
+ <K::Tree as ValueTree>::Value: Ord + Clone,
+ <V::Tree as ValueTree>::Value: Clone,
+{
+ ::proptest::collection::vec((key, value), size.clone())
+ .prop_map(OrdMap::from)
+ .prop_filter("OrdMap minimum size".to_owned(), move |m| {
+ m.len() >= size.start
+ })
+ .boxed()
+}
+
+/// A strategy for an [`OrdSet`][OrdSet] of a given size.
+///
+/// # Examples
+///
+/// ```rust,no_run
+/// # use ::proptest::proptest;
+/// proptest! {
+/// #[test]
+/// fn proptest_a_set(ref s in ord_set(".*", 10..100)) {
+/// assert!(s.len() < 100);
+/// assert!(s.len() >= 10);
+/// }
+/// }
+/// ```
+///
+/// [OrdSet]: ../struct.OrdSet.html
+pub fn ord_set<A: Strategy + 'static>(
+ element: A,
+ size: Range<usize>,
+) -> BoxedStrategy<OrdSet<<A::Tree as ValueTree>::Value>>
+where
+ <A::Tree as ValueTree>::Value: Ord + Clone,
+{
+ ::proptest::collection::vec(element, size.clone())
+ .prop_map(OrdSet::from)
+ .prop_filter("OrdSet minimum size".to_owned(), move |s| {
+ s.len() >= size.start
+ })
+ .boxed()
+}
+
+/// A strategy for a [`HashMap`][HashMap] of a given size.
+///
+/// # Examples
+///
+/// ```rust,no_run
+/// # use ::proptest::proptest;
+/// proptest! {
+/// #[test]
+/// fn proptest_works(ref m in hash_map(0..9999, ".*", 10..100)) {
+/// assert!(m.len() < 100);
+/// assert!(m.len() >= 10);
+/// }
+/// }
+/// ```
+///
+/// [HashMap]: ../struct.HashMap.html
+pub fn hash_map<K: Strategy + 'static, V: Strategy + 'static>(
+ key: K,
+ value: V,
+ size: Range<usize>,
+) -> BoxedStrategy<HashMap<<K::Tree as ValueTree>::Value, <V::Tree as ValueTree>::Value>>
+where
+ <K::Tree as ValueTree>::Value: Hash + Eq + Clone,
+ <V::Tree as ValueTree>::Value: Clone,
+{
+ ::proptest::collection::vec((key, value), size.clone())
+ .prop_map(HashMap::from)
+ .prop_filter("Map minimum size".to_owned(), move |m| {
+ m.len() >= size.start
+ })
+ .boxed()
+}
+
+/// A strategy for a [`HashSet`][HashSet] of a given size.
+///
+/// # Examples
+///
+/// ```rust,no_run
+/// # use ::proptest::proptest;
+/// proptest! {
+/// #[test]
+/// fn proptest_a_set(ref s in hash_set(".*", 10..100)) {
+/// assert!(s.len() < 100);
+/// assert!(s.len() >= 10);
+/// }
+/// }
+/// ```
+///
+/// [HashSet]: ../struct.HashSet.html
+pub fn hash_set<A: Strategy + 'static>(
+ element: A,
+ size: Range<usize>,
+) -> BoxedStrategy<HashSet<<A::Tree as ValueTree>::Value>>
+where
+ <A::Tree as ValueTree>::Value: Hash + Eq + Clone,
+{
+ ::proptest::collection::vec(element, size.clone())
+ .prop_map(HashSet::from)
+ .prop_filter("HashSet minimum size".to_owned(), move |s| {
+ s.len() >= size.start
+ })
+ .boxed()
+}
diff --git a/vendor/im-rc/src/quickcheck.rs b/vendor/im-rc/src/quickcheck.rs
new file mode 100644
index 0000000..3faade7
--- /dev/null
+++ b/vendor/im-rc/src/quickcheck.rs
@@ -0,0 +1,43 @@
+use crate::{HashMap, HashSet, OrdMap, OrdSet, Vector};
+use ::quickcheck::{Arbitrary, Gen};
+use std::hash::{BuildHasher, Hash};
+use std::iter::FromIterator;
+
+impl<A: Arbitrary + Sync + Clone> Arbitrary for Vector<A> {
+ fn arbitrary(g: &mut Gen) -> Self {
+ Vector::from_iter(Vec::<A>::arbitrary(g))
+ }
+}
+
+impl<K: Ord + Clone + Arbitrary + Sync, V: Clone + Arbitrary + Sync> Arbitrary for OrdMap<K, V> {
+ fn arbitrary(g: &mut Gen) -> Self {
+ OrdMap::from_iter(Vec::<(K, V)>::arbitrary(g))
+ }
+}
+
+impl<A: Ord + Clone + Arbitrary + Sync> Arbitrary for OrdSet<A> {
+ fn arbitrary(g: &mut Gen) -> Self {
+ OrdSet::from_iter(Vec::<A>::arbitrary(g))
+ }
+}
+
+impl<A, S> Arbitrary for HashSet<A, S>
+where
+ A: Hash + Eq + Arbitrary + Sync,
+ S: BuildHasher + Default + Send + Sync + 'static,
+{
+ fn arbitrary(g: &mut Gen) -> Self {
+ HashSet::from_iter(Vec::<A>::arbitrary(g))
+ }
+}
+
+impl<K, V, S> Arbitrary for HashMap<K, V, S>
+where
+ K: Hash + Eq + Arbitrary + Sync,
+ V: Arbitrary + Sync,
+ S: BuildHasher + Default + Send + Sync + 'static,
+{
+ fn arbitrary(g: &mut Gen) -> Self {
+ HashMap::from(Vec::<(K, V)>::arbitrary(g))
+ }
+}
diff --git a/vendor/im-rc/src/ser.rs b/vendor/im-rc/src/ser.rs
new file mode 100644
index 0000000..d9a35e5
--- /dev/null
+++ b/vendor/im-rc/src/ser.rs
@@ -0,0 +1,293 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use serde::de::{Deserialize, Deserializer, MapAccess, SeqAccess, Visitor};
+use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer};
+use std::fmt;
+use std::hash::{BuildHasher, Hash};
+use std::marker::PhantomData;
+use std::ops::Deref;
+
+use crate::hashmap::HashMap;
+use crate::hashset::HashSet;
+use crate::ordmap::OrdMap;
+use crate::ordset::OrdSet;
+use crate::vector::Vector;
+
+struct SeqVisitor<'de, S, A>
+where
+ S: From<Vec<A>>,
+ A: Deserialize<'de>,
+{
+ phantom_s: PhantomData<S>,
+ phantom_a: PhantomData<A>,
+ phantom_lifetime: PhantomData<&'de ()>,
+}
+
+impl<'de, S, A> SeqVisitor<'de, S, A>
+where
+ S: From<Vec<A>>,
+ A: Deserialize<'de>,
+{
+ pub(crate) fn new() -> SeqVisitor<'de, S, A> {
+ SeqVisitor {
+ phantom_s: PhantomData,
+ phantom_a: PhantomData,
+ phantom_lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'de, S, A> Visitor<'de> for SeqVisitor<'de, S, A>
+where
+ S: From<Vec<A>>,
+ A: Deserialize<'de>,
+{
+ type Value = S;
+
+ fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
+ formatter.write_str("a sequence")
+ }
+
+ fn visit_seq<Access>(self, mut access: Access) -> Result<Self::Value, Access::Error>
+ where
+ Access: SeqAccess<'de>,
+ {
+ let mut v: Vec<A> = match access.size_hint() {
+ None => Vec::new(),
+ Some(l) => Vec::with_capacity(l),
+ };
+ while let Some(i) = access.next_element()? {
+ v.push(i)
+ }
+ Ok(From::from(v))
+ }
+}
+
+struct MapVisitor<'de, S, K, V>
+where
+ S: From<Vec<(K, V)>>,
+ K: Deserialize<'de>,
+ V: Deserialize<'de>,
+{
+ phantom_s: PhantomData<S>,
+ phantom_k: PhantomData<K>,
+ phantom_v: PhantomData<V>,
+ phantom_lifetime: PhantomData<&'de ()>,
+}
+
+impl<'de, S, K, V> MapVisitor<'de, S, K, V>
+where
+ S: From<Vec<(K, V)>>,
+ K: Deserialize<'de>,
+ V: Deserialize<'de>,
+{
+ pub(crate) fn new() -> MapVisitor<'de, S, K, V> {
+ MapVisitor {
+ phantom_s: PhantomData,
+ phantom_k: PhantomData,
+ phantom_v: PhantomData,
+ phantom_lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'de, S, K, V> Visitor<'de> for MapVisitor<'de, S, K, V>
+where
+ S: From<Vec<(K, V)>>,
+ K: Deserialize<'de>,
+ V: Deserialize<'de>,
+{
+ type Value = S;
+
+ fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
+ formatter.write_str("a sequence")
+ }
+
+ fn visit_map<Access>(self, mut access: Access) -> Result<Self::Value, Access::Error>
+ where
+ Access: MapAccess<'de>,
+ {
+ let mut v: Vec<(K, V)> = match access.size_hint() {
+ None => Vec::new(),
+ Some(l) => Vec::with_capacity(l),
+ };
+ while let Some(i) = access.next_entry()? {
+ v.push(i)
+ }
+ Ok(From::from(v))
+ }
+}
+
+// Set
+
+impl<'de, A: Deserialize<'de> + Ord + Clone> Deserialize<'de> for OrdSet<A> {
+ fn deserialize<D>(des: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ des.deserialize_seq(SeqVisitor::new())
+ }
+}
+
+impl<A: Ord + Clone + Serialize> Serialize for OrdSet<A> {
+ fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
+ where
+ S: Serializer,
+ {
+ let mut s = ser.serialize_seq(Some(self.len()))?;
+ for i in self.iter() {
+ s.serialize_element(i.deref())?;
+ }
+ s.end()
+ }
+}
+
+// Map
+
+impl<'de, K: Deserialize<'de> + Ord + Clone, V: Deserialize<'de> + Clone> Deserialize<'de>
+ for OrdMap<K, V>
+{
+ fn deserialize<D>(des: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ des.deserialize_map(MapVisitor::<'de, OrdMap<K, V>, K, V>::new())
+ }
+}
+
+impl<K: Serialize + Ord + Clone, V: Serialize + Clone> Serialize for OrdMap<K, V> {
+ fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
+ where
+ S: Serializer,
+ {
+ let mut s = ser.serialize_map(Some(self.len()))?;
+ for (k, v) in self.iter() {
+ s.serialize_entry(k.deref(), v.deref())?;
+ }
+ s.end()
+ }
+}
+
+// HashMap
+
+impl<'de, K, V, S> Deserialize<'de> for HashMap<K, V, S>
+where
+ K: Deserialize<'de> + Hash + Eq + Clone,
+ V: Deserialize<'de> + Clone,
+ S: BuildHasher + Default,
+{
+ fn deserialize<D>(des: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ des.deserialize_map(MapVisitor::<'de, HashMap<K, V, S>, K, V>::new())
+ }
+}
+
+impl<K, V, S> Serialize for HashMap<K, V, S>
+where
+ K: Serialize + Hash + Eq + Clone,
+ V: Serialize + Clone,
+ S: BuildHasher + Default,
+{
+ fn serialize<Ser>(&self, ser: Ser) -> Result<Ser::Ok, Ser::Error>
+ where
+ Ser: Serializer,
+ {
+ let mut s = ser.serialize_map(Some(self.len()))?;
+ for (k, v) in self.iter() {
+ s.serialize_entry(k.deref(), v.deref())?;
+ }
+ s.end()
+ }
+}
+
+// HashSet
+
+impl<'de, A: Deserialize<'de> + Hash + Eq + Clone, S: BuildHasher + Default> Deserialize<'de>
+ for HashSet<A, S>
+{
+ fn deserialize<D>(des: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ des.deserialize_seq(SeqVisitor::new())
+ }
+}
+
+impl<A: Serialize + Hash + Eq + Clone, S: BuildHasher + Default> Serialize for HashSet<A, S> {
+ fn serialize<Ser>(&self, ser: Ser) -> Result<Ser::Ok, Ser::Error>
+ where
+ Ser: Serializer,
+ {
+ let mut s = ser.serialize_seq(Some(self.len()))?;
+ for i in self.iter() {
+ s.serialize_element(i.deref())?;
+ }
+ s.end()
+ }
+}
+
+// Vector
+
+impl<'de, A: Clone + Deserialize<'de>> Deserialize<'de> for Vector<A> {
+ fn deserialize<D>(des: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ des.deserialize_seq(SeqVisitor::<'de, Vector<A>, A>::new())
+ }
+}
+
+impl<A: Clone + Serialize> Serialize for Vector<A> {
+ fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
+ where
+ S: Serializer,
+ {
+ let mut s = ser.serialize_seq(Some(self.len()))?;
+ for i in self.iter() {
+ s.serialize_element(i.deref())?;
+ }
+ s.end()
+ }
+}
+
+// Tests
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ use crate::proptest::{hash_map, hash_set, ord_map, ord_set, vector};
+ use ::proptest::num::i32;
+ use ::proptest::proptest;
+ use serde_json::{from_str, to_string};
+
+ proptest! {
+ #[test]
+ fn ser_ordset(ref v in ord_set(i32::ANY, 0..100)) {
+ assert_eq!(v, &from_str::<OrdSet<i32>>(&to_string(&v).unwrap()).unwrap());
+ }
+
+ #[test]
+ fn ser_ordmap(ref v in ord_map(i32::ANY, i32::ANY, 0..100)) {
+ assert_eq!(v, &from_str::<OrdMap<i32, i32>>(&to_string(&v).unwrap()).unwrap());
+ }
+
+ #[test]
+ fn ser_hashmap(ref v in hash_map(i32::ANY, i32::ANY, 0..100)) {
+ assert_eq!(v, &from_str::<HashMap<i32, i32>>(&to_string(&v).unwrap()).unwrap());
+ }
+
+ #[test]
+ fn ser_hashset(ref v in hash_set(i32::ANY, 0..100)) {
+ assert_eq!(v, &from_str::<HashSet<i32>>(&to_string(&v).unwrap()).unwrap());
+ }
+
+ #[test]
+ fn ser_vector(ref v in vector(i32::ANY, 0..100)) {
+ assert_eq!(v, &from_str::<Vector<i32>>(&to_string(&v).unwrap()).unwrap());
+ }
+ }
+}
diff --git a/vendor/im-rc/src/sort.rs b/vendor/im-rc/src/sort.rs
new file mode 100644
index 0000000..6c98001
--- /dev/null
+++ b/vendor/im-rc/src/sort.rs
@@ -0,0 +1,203 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use crate::vector::FocusMut;
+use rand_core::{RngCore, SeedableRng};
+use std::cmp::Ordering;
+use std::mem;
+
+fn gen_range<R: RngCore>(rng: &mut R, min: usize, max: usize) -> usize {
+ let range = max - min;
+ min + (rng.next_u64() as usize % range)
+}
+
+// Ported from the Java version at:
+// http://www.cs.princeton.edu/~rs/talks/QuicksortIsOptimal.pdf
+// There are a couple of modifications made here to make it more performant on the tree structure of
+// the Vector. Instead of moving of handling equal and nonequal items in a single pass we make two
+// additional passes to find the exact partition places. This allows us to split the focus into
+// three correctly sized parts for less than, equal to and greater than items. As a bonus this
+// doesn't need to reorder the equal items to the center of the vector.
+fn do_quicksort<A, F, R>(vector: FocusMut<'_, A>, cmp: &F, rng: &mut R)
+where
+ A: Clone,
+ F: Fn(&A, &A) -> Ordering,
+ R: RngCore,
+{
+ if vector.len() <= 1 {
+ return;
+ }
+
+ // We know there are at least 2 elements here
+ let pivot_index = gen_range(rng, 0, vector.len());
+ let (mut first, mut rest) = vector.split_at(1);
+
+ if pivot_index > 0 {
+ mem::swap(rest.index_mut(pivot_index - 1), first.index_mut(0));
+ }
+ // Pivot is now always in the first slice
+ let pivot_item = first.index(0);
+
+ // Find the exact place to put the pivot or pivot-equal items
+ let mut less_count = 0;
+ let mut equal_count = 0;
+
+ for index in 0..rest.len() {
+ let item = rest.index(index);
+ let comp = cmp(item, pivot_item);
+ match comp {
+ Ordering::Less => less_count += 1,
+ Ordering::Equal => equal_count += 1,
+ Ordering::Greater => {}
+ }
+ }
+
+ // If by accident we picked the minimum element as a pivot, we just call sort again with the
+ // rest of the vector.
+ if less_count == 0 {
+ do_quicksort(rest, cmp, rng);
+ return;
+ }
+
+ // We know here that there is at least one item before the pivot, so we move the minimum to the
+ // beginning part of the vector. First, however we swap the pivot to the start of the equal
+ // zone.
+ less_count -= 1;
+ equal_count += 1;
+ let first_item = first.index_mut(0);
+ mem::swap(first_item, rest.index_mut(less_count));
+ for index in 0..rest.len() {
+ if index == less_count {
+ // This is the position we swapped the pivot to. We can't move it from its position, and
+ // we know its not the minimum.
+ continue;
+ }
+ let rest_item = rest.index_mut(index);
+ if cmp(rest_item, first_item) == Ordering::Less {
+ mem::swap(first_item, rest_item);
+ }
+ }
+
+ // Split the vector up into less_than, equal to and greater than parts.
+ let (remaining, mut greater_focus) = rest.split_at(less_count + equal_count);
+ let (mut less_focus, mut equal_focus) = remaining.split_at(less_count);
+
+ let mut less_position = 0;
+ let mut equal_position = 0;
+ let mut greater_position = 0;
+
+ while less_position != less_focus.len() || greater_position != greater_focus.len() {
+ // At start of this loop, equal_position always points to an equal item
+ let mut equal_swap_side = None;
+ let equal_item = equal_focus.index(equal_position);
+
+ // Advance the less_position until we find an out of place item
+ while less_position != less_focus.len() {
+ let less_item = less_focus.index(less_position);
+ match cmp(less_item, equal_item) {
+ Ordering::Equal => {
+ equal_swap_side = Some(Ordering::Less);
+ break;
+ }
+ Ordering::Greater => {
+ break;
+ }
+ _ => {}
+ }
+ less_position += 1;
+ }
+
+ // Advance the greater until we find an out of place item
+ while greater_position != greater_focus.len() {
+ let greater_item = greater_focus.index(greater_position);
+ match cmp(greater_item, equal_item) {
+ Ordering::Less => break,
+ Ordering::Equal => {
+ equal_swap_side = Some(Ordering::Greater);
+ break;
+ }
+ _ => {}
+ }
+ greater_position += 1;
+ }
+
+ if let Some(swap_side) = equal_swap_side {
+ // One of the sides is equal to the pivot, advance the pivot
+ let item = if swap_side == Ordering::Less {
+ less_focus.index_mut(less_position)
+ } else {
+ greater_focus.index_mut(greater_position)
+ };
+
+ // We are guaranteed not to hit the end of the equal focus
+ while cmp(item, equal_focus.index(equal_position)) == Ordering::Equal {
+ equal_position += 1;
+ }
+
+ // Swap the equal position and the desired side, it's important to note that only the
+ // equals focus is guaranteed to have made progress so we don't advance the side's index
+ mem::swap(item, equal_focus.index_mut(equal_position));
+ } else if less_position != less_focus.len() && greater_position != greater_focus.len() {
+ // Both sides are out of place and not equal to the pivot, this can only happen if there
+ // is a greater item in the lesser zone and a lesser item in the greater zone. The
+ // solution is to swap both sides and advance both side's indices.
+ debug_assert_ne!(
+ cmp(
+ less_focus.index(less_position),
+ equal_focus.index(equal_position)
+ ),
+ Ordering::Equal
+ );
+ debug_assert_ne!(
+ cmp(
+ greater_focus.index(greater_position),
+ equal_focus.index(equal_position)
+ ),
+ Ordering::Equal
+ );
+ mem::swap(
+ less_focus.index_mut(less_position),
+ greater_focus.index_mut(greater_position),
+ );
+ less_position += 1;
+ greater_position += 1;
+ }
+ }
+
+ // Now we have partitioned both sides correctly, we just have to recurse now
+ do_quicksort(less_focus, cmp, rng);
+ if !greater_focus.is_empty() {
+ do_quicksort(greater_focus, cmp, rng);
+ }
+}
+
+pub(crate) fn quicksort<A, F>(vector: FocusMut<'_, A>, cmp: &F)
+where
+ A: Clone,
+ F: Fn(&A, &A) -> Ordering,
+{
+ let mut rng = rand_xoshiro::Xoshiro256Plus::seed_from_u64(0);
+ do_quicksort(vector, cmp, &mut rng);
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ use crate::test::is_sorted;
+ use crate::vector::proptest::vector;
+ use ::proptest::num::i32;
+ use ::proptest::proptest;
+
+ proptest! {
+ #[test]
+ fn test_quicksort(ref input in vector(i32::ANY, 0..10000)) {
+ let mut vec = input.clone();
+ let len = vec.len();
+ if len > 1 {
+ quicksort(vec.focus_mut(), &Ord::cmp);
+ }
+ assert!(is_sorted(vec));
+ }
+ }
+}
diff --git a/vendor/im-rc/src/sync.rs b/vendor/im-rc/src/sync.rs
new file mode 100644
index 0000000..9b13755
--- /dev/null
+++ b/vendor/im-rc/src/sync.rs
@@ -0,0 +1,69 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+pub(crate) use self::lock::Lock;
+
+#[cfg(threadsafe)]
+mod lock {
+ use std::sync::{Arc, Mutex, MutexGuard};
+
+ /// Thread safe lock: just wraps a `Mutex`.
+ pub(crate) struct Lock<A> {
+ lock: Arc<Mutex<A>>,
+ }
+
+ impl<A> Lock<A> {
+ pub(crate) fn new(value: A) -> Self {
+ Lock {
+ lock: Arc::new(Mutex::new(value)),
+ }
+ }
+
+ #[inline]
+ pub(crate) fn lock(&mut self) -> Option<MutexGuard<'_, A>> {
+ self.lock.lock().ok()
+ }
+ }
+
+ impl<A> Clone for Lock<A> {
+ fn clone(&self) -> Self {
+ Lock {
+ lock: self.lock.clone(),
+ }
+ }
+ }
+}
+
+#[cfg(not(threadsafe))]
+mod lock {
+ use std::cell::{RefCell, RefMut};
+ use std::rc::Rc;
+
+ /// Single threaded lock: a `RefCell` so we should safely panic if somehow
+ /// trying to access the stored data twice from the same thread.
+ pub(crate) struct Lock<A> {
+ lock: Rc<RefCell<A>>,
+ }
+
+ impl<A> Lock<A> {
+ pub(crate) fn new(value: A) -> Self {
+ Lock {
+ lock: Rc::new(RefCell::new(value)),
+ }
+ }
+
+ #[inline]
+ pub(crate) fn lock(&mut self) -> Option<RefMut<'_, A>> {
+ self.lock.try_borrow_mut().ok()
+ }
+ }
+
+ impl<A> Clone for Lock<A> {
+ fn clone(&self) -> Self {
+ Lock {
+ lock: self.lock.clone(),
+ }
+ }
+ }
+}
diff --git a/vendor/im-rc/src/test.rs b/vendor/im-rc/src/test.rs
new file mode 100644
index 0000000..4a8ee5c
--- /dev/null
+++ b/vendor/im-rc/src/test.rs
@@ -0,0 +1,115 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use tiny_keccak::Keccak;
+use std::hash::{BuildHasher, Hasher};
+use tiny_keccak::Hasher as tiny_keccak_Hasher;
+use std::marker::PhantomData;
+use typenum::{Unsigned, U64};
+
+pub(crate) fn is_sorted<A, I>(l: I) -> bool
+where
+ I: IntoIterator<Item = A>,
+ A: Ord,
+{
+ let mut it = l.into_iter().peekable();
+ loop {
+ match (it.next(), it.peek()) {
+ (_, None) => return true,
+ (Some(ref a), Some(b)) if a > b => return false,
+ _ => (),
+ }
+ }
+}
+
+pub(crate) struct LolHasher<N: Unsigned = U64> {
+ state: u64,
+ shift: usize,
+ size: PhantomData<N>,
+}
+
+impl<N: Unsigned> LolHasher<N> {
+ fn feed_me(&mut self, byte: u8) {
+ self.state ^= u64::from(byte) << self.shift;
+ self.shift += 8;
+ if self.shift >= 64 {
+ self.shift = 0;
+ }
+ }
+}
+
+impl<N: Unsigned> Hasher for LolHasher<N> {
+ fn write(&mut self, bytes: &[u8]) {
+ for byte in bytes {
+ self.feed_me(*byte)
+ }
+ }
+
+ fn finish(&self) -> u64 {
+ if N::USIZE == 64 {
+ self.state
+ } else {
+ self.state & ((1 << N::USIZE) - 1)
+ }
+ }
+}
+
+impl<N: Unsigned> Default for LolHasher<N> {
+ fn default() -> Self {
+ LolHasher {
+ state: 0,
+ shift: 0,
+ size: PhantomData,
+ }
+ }
+}
+
+pub(crate) struct KeccakHasher {
+ k : Keccak,
+}
+
+impl KeccakHasher {
+ fn with_seed(seed: u64) -> KeccakHasher {
+ let mut k = Keccak::v256();
+ let sb = seed.to_le_bytes();
+ k.update(&sb);
+ KeccakHasher { k }
+
+ }
+}
+
+impl Hasher for KeccakHasher {
+ fn write(&mut self, bytes: &[u8]) {
+ self.k.update(bytes);
+ }
+
+ fn finish(&self) -> u64 {
+ let mut rb: [u8; 8] = [0;8];
+ let k = self.k.clone();
+ k.finalize(& mut rb);
+ return u64::from_le_bytes(rb);
+ }
+}
+
+
+pub(crate) struct MetroHashBuilder {
+ seed: u64,
+}
+
+impl MetroHashBuilder {
+ pub(crate) fn new(seed: u64) -> Self {
+ MetroHashBuilder { seed }
+ }
+
+ pub(crate) fn seed(&self) -> u64 {
+ self.seed
+ }
+}
+
+impl BuildHasher for MetroHashBuilder {
+ type Hasher = KeccakHasher;
+ fn build_hasher(&self) -> Self::Hasher {
+ KeccakHasher::with_seed(self.seed)
+ }
+}
diff --git a/vendor/im-rc/src/tests/hashset.rs b/vendor/im-rc/src/tests/hashset.rs
new file mode 100644
index 0000000..d5ab095
--- /dev/null
+++ b/vendor/im-rc/src/tests/hashset.rs
@@ -0,0 +1,84 @@
+#![allow(clippy::unit_arg)]
+
+use std::collections::HashSet as NatSet;
+use std::fmt::{Debug, Error, Formatter, Write};
+use std::hash::Hash;
+
+use crate::HashSet;
+
+use proptest::proptest;
+//use proptest_derive::Arbitrary;
+
+#[derive(Debug)]
+enum Action<A> {
+ Insert(A),
+ Remove(A),
+}
+
+struct Actions<A>(Vec<Action<A>>)
+where
+ A: Hash + Eq + Clone;
+
+impl<A> Debug for Actions<A>
+where
+ A: Hash + Eq + Debug + Clone,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ let mut out = String::new();
+ let mut expected = NatSet::new();
+ writeln!(out, "let mut set = HashSet::new();")?;
+ for action in &self.0 {
+ match action {
+ Action::Insert(ref value) => {
+ expected.insert(value.clone());
+ writeln!(out, "set.insert({:?});", value)?;
+ }
+ Action::Remove(ref value) => {
+ expected.remove(value);
+ writeln!(out, "set.remove({:?});", value)?;
+ }
+ }
+ }
+ writeln!(
+ out,
+ "let expected = vec!{:?};",
+ expected.into_iter().collect::<Vec<_>>()
+ )?;
+ writeln!(out, "assert_eq!(HashSet::from(expected), set);")?;
+ write!(f, "{}", super::code_fmt(&out))
+ }
+}
+
+/*proptest! {
+ #[test]
+ fn comprehensive(actions: Actions<u8>) {
+ let mut set = HashSet::new();
+ let mut nat = NatSet::new();
+ for action in actions.0 {
+ match action {
+ Action::Insert(value) => {
+ let len = nat.len() + if nat.contains(&value) {
+ 0
+ } else {
+ 1
+ };
+ nat.insert(value);
+ set.insert(value);
+ assert_eq!(len, set.len());
+ }
+ Action::Remove(value) => {
+ let len = nat.len() - if nat.contains(&value) {
+ 1
+ } else {
+ 0
+ };
+ nat.remove(&value);
+ set.remove(&value);
+ assert_eq!(len, set.len());
+ }
+ }
+ assert_eq!(nat.len(), set.len());
+ assert_eq!(HashSet::from(nat.clone()), set);
+ }
+ }
+}*/
diff --git a/vendor/im-rc/src/tests/mod.rs b/vendor/im-rc/src/tests/mod.rs
new file mode 100644
index 0000000..cafea5f
--- /dev/null
+++ b/vendor/im-rc/src/tests/mod.rs
@@ -0,0 +1,24 @@
+mod hashset;
+mod ordset;
+mod vector;
+
+fn code_fmt(code: &str) -> String {
+ // use syntect::easy::HighlightLines;
+ // use syntect::highlighting::{Style, ThemeSet};
+ // use syntect::parsing::SyntaxSet;
+ // use syntect::util::{as_24_bit_terminal_escaped, LinesWithEndings};
+ //
+ // let ps = SyntaxSet::load_defaults_newlines();
+ // let ts = ThemeSet::load_defaults();
+ // let syntax = ps.find_syntax_by_extension("rs").unwrap();
+ // let mut h = HighlightLines::new(syntax, &ts.themes["base16-ocean.dark"]);
+ // let mut out = String::from("\n\n");
+ // for line in LinesWithEndings::from(&code) {
+ // let ranges: Vec<(Style, &str)> = h.highlight(line, &ps);
+ // let escaped = as_24_bit_terminal_escaped(&ranges[..], false);
+ // out += &escaped;
+ // }
+ // out += "\n\x1b[0m";
+ // out
+ code.to_string()
+}
diff --git a/vendor/im-rc/src/tests/ordset.rs b/vendor/im-rc/src/tests/ordset.rs
new file mode 100644
index 0000000..41a0f94
--- /dev/null
+++ b/vendor/im-rc/src/tests/ordset.rs
@@ -0,0 +1,83 @@
+#![allow(clippy::unit_arg)]
+
+use std::collections::BTreeSet;
+use std::fmt::{Debug, Error, Formatter, Write};
+
+use crate::OrdSet;
+
+use proptest::proptest;
+
+#[derive(Debug)]
+enum Action<A> {
+ Insert(A),
+ Remove(A),
+}
+
+struct Actions<A>(Vec<Action<A>>)
+where
+ A: Ord + Clone;
+
+impl<A> Debug for Actions<A>
+where
+ A: Ord + Debug + Clone,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ let mut out = String::new();
+ let mut expected = BTreeSet::new();
+ writeln!(out, "let mut set = OrdSet::new();")?;
+ for action in &self.0 {
+ match action {
+ Action::Insert(ref value) => {
+ expected.insert(value.clone());
+ writeln!(out, "set.insert({:?});", value)?;
+ }
+ Action::Remove(ref value) => {
+ expected.remove(value);
+ writeln!(out, "set.remove({:?});", value)?;
+ }
+ }
+ }
+ writeln!(
+ out,
+ "let expected = vec!{:?};",
+ expected.into_iter().collect::<Vec<_>>()
+ )?;
+ writeln!(out, "assert_eq!(OrdSet::from(expected), set);")?;
+ write!(f, "{}", super::code_fmt(&out))
+ }
+}
+
+/*proptest! {
+ #[test]
+ fn comprehensive(actions: Actions<u8>) {
+ let mut set = OrdSet::new();
+ let mut nat = BTreeSet::new();
+ for action in actions.0 {
+ match action {
+ Action::Insert(value) => {
+ let len = nat.len() + if nat.contains(&value) {
+ 0
+ } else {
+ 1
+ };
+ nat.insert(value);
+ set.insert(value);
+ assert_eq!(len, set.len());
+ }
+ Action::Remove(value) => {
+ let len = nat.len() - if nat.contains(&value) {
+ 1
+ } else {
+ 0
+ };
+ nat.remove(&value);
+ set.remove(&value);
+ assert_eq!(len, set.len());
+ }
+ }
+ assert_eq!(nat.len(), set.len());
+ assert_eq!(OrdSet::from(nat.clone()), set);
+ assert!(nat.iter().eq(set.iter()));
+ }
+ }
+}*/
diff --git a/vendor/im-rc/src/tests/vector.rs b/vendor/im-rc/src/tests/vector.rs
new file mode 100644
index 0000000..6ac435e
--- /dev/null
+++ b/vendor/im-rc/src/tests/vector.rs
@@ -0,0 +1,230 @@
+#![allow(clippy::unit_arg)]
+
+use std::fmt::{Debug, Error, Formatter, Write};
+
+use crate::Vector;
+
+use proptest::proptest;
+//use proptest_derive::Arbitrary;
+
+#[derive(Debug)]
+enum Action<A> {
+ PushFront(A),
+ PushBack(A),
+ PopFront,
+ PopBack,
+ Insert(usize, A),
+ Remove(usize),
+ JoinLeft(Vec<A>),
+ JoinRight(Vec<A>),
+ SplitLeft(usize),
+ SplitRight(usize),
+}
+
+struct Actions<A>(Vec<Action<A>>)
+where
+ A: Clone;
+
+impl<A> Debug for Actions<A>
+where
+ A: Debug + Clone,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ let mut out = String::new();
+ let mut expected = vec![];
+ writeln!(out, "let mut vec = Vector::new();")?;
+ for action in &self.0 {
+ match action {
+ Action::PushFront(ref value) => {
+ expected.insert(0, value.clone());
+ writeln!(out, "vec.push_front({:?});", value)?
+ }
+ Action::PushBack(ref value) => {
+ expected.push(value.clone());
+ writeln!(out, "vec.push_back({:?});", value)?
+ }
+ Action::PopFront => {
+ if !expected.is_empty() {
+ expected.remove(0);
+ }
+ writeln!(out, "vec.pop_front();")?
+ }
+ Action::PopBack => {
+ expected.pop();
+ writeln!(out, "vec.pop_back();")?
+ }
+ Action::Insert(ref index, ref value) => {
+ let index = cap_index(expected.len(), *index);
+ expected.insert(index, value.clone());
+ writeln!(out, "vec.insert({:?}, {:?});", index, value)?
+ }
+ Action::Remove(ref index) => {
+ if !expected.is_empty() {
+ let index = cap_index(expected.len(), *index);
+ expected.remove(index);
+ writeln!(out, "vec.remove({:?})", index)?
+ } else {
+ continue;
+ }
+ }
+ Action::JoinLeft(ref vec) => {
+ let mut vec_new = vec.clone();
+ vec_new.append(&mut expected);
+ expected = vec_new;
+ writeln!(
+ out,
+ "let mut vec_new = Vector::from(vec!{:?}); // size {:?}",
+ vec,
+ vec.len()
+ )?;
+ writeln!(out, "vec_new.append(vec);")?;
+ writeln!(out, "vec = vec_new;")?
+ }
+ Action::JoinRight(ref vec) => {
+ expected.append(&mut vec.clone());
+ writeln!(
+ out,
+ "vec.append(Vector::from(vec!{:?})); // size {:?}",
+ vec,
+ vec.len()
+ )?
+ }
+ Action::SplitLeft(ref index) => {
+ let index = cap_index(expected.len(), *index);
+ expected.truncate(index);
+ writeln!(out, "vec.split_off({:?});", index)?
+ }
+ Action::SplitRight(ref index) => {
+ let index = cap_index(expected.len(), *index);
+ expected = expected.split_off(index);
+ writeln!(out, "vec = vec.split_off({:?});", index)?
+ }
+ }
+ writeln!(out, "// len = {:?}", expected.len())?;
+ }
+ writeln!(out, "let expected = vec!{:?};", expected)?;
+ writeln!(out, "assert_eq!(Vector::from(expected), vec);")?;
+ write!(f, "{}", super::code_fmt(&out))
+ }
+}
+
+fn cap_index(len: usize, index: usize) -> usize {
+ if len == 0 {
+ 0
+ } else {
+ index % len
+ }
+}
+
+/*proptest! {
+ #[test]
+ fn comprehensive(actions: Actions<u8>) {
+ let mut vec = Vector::new();
+ let mut nat = Vec::new();
+ vec.assert_invariants();
+ for action in actions.0 {
+ match action {
+ Action::PushFront(value) => {
+ let len = vec.len();
+ nat.insert(0, value);
+ vec.push_front(value);
+ assert_eq!(len + 1, vec.len());
+ }
+ Action::PushBack(value) => {
+ let len = vec.len();
+ nat.push(value);
+ vec.push_back(value);
+ assert_eq!(len + 1, vec.len());
+ }
+ Action::PopFront => {
+ if vec.is_empty() {
+ assert_eq!(None, vec.pop_front());
+ } else {
+ let len = vec.len();
+ assert_eq!(nat.remove(0), vec.pop_front().unwrap());
+ assert_eq!(len - 1, vec.len());
+ }
+ }
+ Action::PopBack => {
+ if vec.is_empty() {
+ assert_eq!(None, vec.pop_back());
+ } else {
+ let len = vec.len();
+ assert_eq!(nat.pop(), vec.pop_back());
+ assert_eq!(len - 1, vec.len());
+ }
+ }
+ Action::Insert(index, value) => {
+ let index = cap_index(vec.len(), index);
+ let len = vec.len();
+ nat.insert(index, value);
+ vec.insert(index, value);
+ assert_eq!(len + 1, vec.len());
+ }
+ Action::Remove(index) => {
+ if vec.is_empty() {
+ continue;
+ }
+ let index = cap_index(vec.len(), index);
+ let len = vec.len();
+ assert_eq!(nat.remove(index), vec.remove(index));
+ assert_eq!(len - 1, vec.len());
+ }
+ Action::JoinLeft(mut new_nat) => {
+ let mut new_vec = new_nat.iter().cloned().collect::<Vector<_>>();
+ let add_len = new_nat.len();
+ let len = vec.len();
+ new_vec.append(vec);
+ vec = new_vec;
+ new_nat.append(&mut nat);
+ nat = new_nat;
+ assert_eq!(len + add_len, vec.len());
+ }
+ Action::JoinRight(mut new_nat) => {
+ let new_vec = new_nat.iter().cloned().collect::<Vector<_>>();
+ let add_len = new_nat.len();
+ let len = vec.len();
+ vec.append(new_vec);
+ nat.append(&mut new_nat);
+ assert_eq!(len + add_len, vec.len());
+ }
+ Action::SplitLeft(index) => {
+ let index = cap_index(vec.len(), index);
+ let len = vec.len();
+ let vec_right = vec.split_off(index);
+ let nat_right = nat.split_off(index);
+ assert_eq!(index, vec.len());
+ assert_eq!(len - index, vec_right.len());
+ assert_eq!(nat_right.iter().cloned().collect::<Vector<_>>(), vec_right);
+ }
+ Action::SplitRight(index) => {
+ let index = cap_index(vec.len(), index);
+ let len = vec.len();
+ let vec_right = vec.split_off(index);
+ let nat_right = nat.split_off(index);
+ assert_eq!(index, vec.len());
+ assert_eq!(len - index, vec_right.len());
+ assert_eq!(nat.iter().cloned().collect::<Vector<_>>(), vec);
+ vec = vec_right;
+ nat = nat_right;
+ }
+ }
+ vec.assert_invariants();
+ assert_eq!(nat.len(),vec.len());
+ assert_eq!(nat.iter().cloned().collect::<Vector<_>>(), vec);
+ }
+ }
+}*/
+
+#[test]
+fn test_inserts() {
+ const N: usize = 2000;
+ let mut v = Vector::new();
+ for i in 0..N {
+ v.insert(v.len() / 2, i);
+ }
+ let mut rv: Vec<usize> = Vec::new();
+ rv.extend((0..N).skip(1).step_by(2));
+ rv.extend((0..N).step_by(2).rev());
+ assert_eq!(rv.iter().cloned().collect::<Vector<_>>(), v);
+}
diff --git a/vendor/im-rc/src/util.rs b/vendor/im-rc/src/util.rs
new file mode 100644
index 0000000..5451f15
--- /dev/null
+++ b/vendor/im-rc/src/util.rs
@@ -0,0 +1,142 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// Every codebase needs a `util` module.
+
+use std::cmp::Ordering;
+use std::ops::{Bound, IndexMut, Range, RangeBounds};
+use std::ptr;
+
+#[cfg(feature = "pool")]
+pub(crate) use refpool::{PoolClone, PoolDefault};
+
+// The `Ref` type is an alias for either `Rc` or `Arc`, user's choice.
+
+// `Arc` without refpool
+#[cfg(all(threadsafe))]
+pub(crate) use crate::fakepool::{Arc as PoolRef, Pool, PoolClone, PoolDefault};
+
+// `Ref` == `Arc` when threadsafe
+#[cfg(threadsafe)]
+pub(crate) type Ref<A> = std::sync::Arc<A>;
+
+// `Rc` without refpool
+#[cfg(all(not(threadsafe), not(feature = "pool")))]
+pub(crate) use crate::fakepool::{Pool, PoolClone, PoolDefault, Rc as PoolRef};
+
+// `Rc` with refpool
+#[cfg(all(not(threadsafe), feature = "pool"))]
+pub(crate) type PoolRef<A> = refpool::PoolRef<A>;
+#[cfg(all(not(threadsafe), feature = "pool"))]
+pub(crate) type Pool<A> = refpool::Pool<A>;
+
+// `Ref` == `Rc` when not threadsafe
+#[cfg(not(threadsafe))]
+pub(crate) type Ref<A> = std::rc::Rc<A>;
+
+pub(crate) fn clone_ref<A>(r: Ref<A>) -> A
+where
+ A: Clone,
+{
+ Ref::try_unwrap(r).unwrap_or_else(|r| (*r).clone())
+}
+
+#[derive(Clone, Copy, PartialEq, Eq, Debug)]
+pub(crate) enum Side {
+ Left,
+ Right,
+}
+
+/// Swap two values of anything implementing `IndexMut`.
+///
+/// Like `slice::swap`, but more generic.
+#[allow(unsafe_code)]
+pub(crate) fn swap_indices<V>(vector: &mut V, a: usize, b: usize)
+where
+ V: IndexMut<usize>,
+ V::Output: Sized,
+{
+ if a == b {
+ return;
+ }
+ // so sorry, but there's no implementation for this in std that's
+ // sufficiently generic
+ let pa: *mut V::Output = &mut vector[a];
+ let pb: *mut V::Output = &mut vector[b];
+ unsafe {
+ ptr::swap(pa, pb);
+ }
+}
+
+#[allow(dead_code)]
+pub(crate) fn linear_search_by<'a, A, I, F>(iterable: I, mut cmp: F) -> Result<usize, usize>
+where
+ A: 'a,
+ I: IntoIterator<Item = &'a A>,
+ F: FnMut(&A) -> Ordering,
+{
+ let mut pos = 0;
+ for value in iterable {
+ match cmp(value) {
+ Ordering::Equal => return Ok(pos),
+ Ordering::Greater => return Err(pos),
+ Ordering::Less => {}
+ }
+ pos += 1;
+ }
+ Err(pos)
+}
+
+pub(crate) fn to_range<R>(range: &R, right_unbounded: usize) -> Range<usize>
+where
+ R: RangeBounds<usize>,
+{
+ let start_index = match range.start_bound() {
+ Bound::Included(i) => *i,
+ Bound::Excluded(i) => *i + 1,
+ Bound::Unbounded => 0,
+ };
+ let end_index = match range.end_bound() {
+ Bound::Included(i) => *i + 1,
+ Bound::Excluded(i) => *i,
+ Bound::Unbounded => right_unbounded,
+ };
+ start_index..end_index
+}
+
+macro_rules! def_pool {
+ ($name:ident<$($arg:tt),*>, $pooltype:ty) => {
+ /// A memory pool for the appropriate node type.
+ pub struct $name<$($arg,)*>(Pool<$pooltype>);
+
+ impl<$($arg,)*> $name<$($arg,)*> {
+ /// Create a new pool with the given size.
+ pub fn new(size: usize) -> Self {
+ Self(Pool::new(size))
+ }
+
+ /// Fill the pool with preallocated chunks.
+ pub fn fill(&self) {
+ self.0.fill();
+ }
+
+ ///Get the current size of the pool.
+ pub fn pool_size(&self) -> usize {
+ self.0.get_pool_size()
+ }
+ }
+
+ impl<$($arg,)*> Default for $name<$($arg,)*> {
+ fn default() -> Self {
+ Self::new($crate::config::POOL_SIZE)
+ }
+ }
+
+ impl<$($arg,)*> Clone for $name<$($arg,)*> {
+ fn clone(&self) -> Self {
+ Self(self.0.clone())
+ }
+ }
+ };
+}
diff --git a/vendor/im-rc/src/vector/focus.rs b/vendor/im-rc/src/vector/focus.rs
new file mode 100644
index 0000000..4fdba75
--- /dev/null
+++ b/vendor/im-rc/src/vector/focus.rs
@@ -0,0 +1,909 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use std::mem::{replace, swap};
+use std::ops::{Range, RangeBounds};
+use std::ptr::null;
+use std::sync::atomic::{AtomicPtr, Ordering};
+
+use crate::nodes::chunk::Chunk;
+use crate::sync::Lock;
+use crate::util::{to_range, PoolRef, Ref};
+use crate::vector::{
+ Iter, IterMut, RRBPool, Rrb, Vector,
+ VectorInner::{Full, Inline, Single},
+};
+
+/// Focused indexing over a [`Vector`][Vector].
+///
+/// By remembering the last tree node accessed through an index lookup and the
+/// path we took to get there, we can speed up lookups for adjacent indices
+/// tremendously. Lookups on indices in the same node are instantaneous, and
+/// lookups on sibling nodes are also very fast.
+///
+/// A `Focus` can also be used as a restricted view into a vector, using the
+/// [`narrow`][narrow] and [`split_at`][split_at] methods.
+///
+/// # When should I use a `Focus` for better performance?
+///
+/// `Focus` is useful when you need to perform a large number of index lookups
+/// that are more likely than not to be close to each other. It's usually worth
+/// using a `Focus` in any situation where you're batching a lot of index
+/// lookups together, even if they're not obviously adjacent - there's likely
+/// to be some performance gain for even completely random access.
+///
+/// If you're just iterating forwards or backwards over the [`Vector`][Vector]
+/// in order, you're better off with a regular iterator, which, in fact, is
+/// implemented using a `Focus`, but provides a simpler interface.
+///
+/// If you're just doing a very small number of index lookups, the setup cost
+/// for the `Focus` is probably not worth it.
+///
+/// A `Focus` is never faster than an index lookup on a small [`Vector`][Vector]
+/// with a length below the internal RRB tree's branching factor of 64.
+///
+/// # Examples
+///
+/// This example is contrived, as the better way to iterate forwards or
+/// backwards over a vector is with an actual iterator. Even so, the version
+/// using a `Focus` should run nearly an order of magnitude faster than the
+/// version using index lookups at a length of 1000. It should also be noted
+/// that [`vector::Iter`][Iter] is actually implemented using a `Focus` behind
+/// the scenes, so the performance of the two should be identical.
+///
+/// ```rust
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::vector::Vector;
+/// # use std::iter::FromIterator;
+/// let mut vec: Vector<i64> = Vector::from_iter(0..1000);
+///
+/// // Summing a vector, the slow way:
+/// let mut sum = 0;
+/// for i in 0..1000 {
+/// sum += *vec.get(i).unwrap();
+/// }
+/// assert_eq!(499500, sum);
+///
+/// // Summing a vector faster using a Focus:
+/// let mut sum = 0;
+/// let mut focus = vec.focus();
+/// for i in 0..1000 {
+/// sum += *focus.get(i).unwrap();
+/// }
+/// assert_eq!(499500, sum);
+///
+/// // And the easy way, for completeness:
+/// let sum: i64 = vec.iter().sum();
+/// assert_eq!(499500, sum);
+/// ```
+///
+/// [Vector]: enum.Vector.html
+/// [Iter]: struct.Iter.html
+/// [narrow]: #method.narrow
+/// [split_at]: #method.split_at
+pub enum Focus<'a, A> {
+ #[doc(hidden)]
+ Single(&'a [A]),
+ #[doc(hidden)]
+ Full(TreeFocus<A>),
+}
+
+impl<'a, A> Focus<'a, A>
+where
+ A: Clone + 'a,
+{
+ /// Construct a `Focus` for a [`Vector`][Vector].
+ ///
+ /// [Vector]: enum.Vector.html
+ pub fn new(vector: &'a Vector<A>) -> Self {
+ match &vector.vector {
+ Inline(_, chunk) => Focus::Single(chunk),
+ Single(_, chunk) => Focus::Single(chunk),
+ Full(_, tree) => Focus::Full(TreeFocus::new(tree)),
+ }
+ }
+
+ /// Get the length of the focused [`Vector`][Vector].
+ ///
+ /// [Vector]: enum.Vector.html
+ pub fn len(&self) -> usize {
+ match self {
+ Focus::Single(chunk) => chunk.len(),
+ Focus::Full(tree) => tree.len(),
+ }
+ }
+
+ /// Test if the focused [`Vector`][Vector] is empty.
+ ///
+ /// [Vector]: enum.Vector.html
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ /// Get a reference to the value at a given index.
+ pub fn get(&mut self, index: usize) -> Option<&A> {
+ match self {
+ Focus::Single(chunk) => chunk.get(index),
+ Focus::Full(tree) => tree.get(index),
+ }
+ }
+
+ /// Get a reference to the value at a given index.
+ ///
+ /// Panics if the index is out of bounds.
+ pub fn index(&mut self, index: usize) -> &A {
+ self.get(index).expect("index out of bounds")
+ }
+
+ /// Get the chunk for the given index.
+ ///
+ /// This gives you a reference to the leaf node that contains the index,
+ /// along with its start and end indices.
+ pub fn chunk_at(&mut self, index: usize) -> (Range<usize>, &[A]) {
+ let len = self.len();
+ if index >= len {
+ panic!("vector::Focus::chunk_at: index out of bounds");
+ }
+ match self {
+ Focus::Single(chunk) => (0..len, chunk),
+ Focus::Full(tree) => tree.get_chunk(index),
+ }
+ }
+
+ /// Narrow the focus onto a subslice of the vector.
+ ///
+ /// `Focus::narrow(range)` has the same effect as `&slice[range]`, without
+ /// actually modifying the underlying vector.
+ ///
+ /// Panics if the range isn't fully inside the current focus.
+ ///
+ /// ## Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// # use std::iter::FromIterator;
+ /// let vec = Vector::from_iter(0..1000);
+ /// let narrowed = vec.focus().narrow(100..200);
+ /// let narrowed_vec = narrowed.into_iter().cloned().collect();
+ /// assert_eq!(Vector::from_iter(100..200), narrowed_vec);
+ /// ```
+ ///
+ /// [slice::split_at]: https://doc.rust-lang.org/std/primitive.slice.html#method.split_at
+ /// [Vector::split_at]: enum.Vector.html#method.split_at
+ pub fn narrow<R>(self, range: R) -> Self
+ where
+ R: RangeBounds<usize>,
+ {
+ let r = to_range(&range, self.len());
+ if r.start >= r.end || r.start >= self.len() {
+ panic!("vector::Focus::narrow: range out of bounds");
+ }
+ match self {
+ Focus::Single(chunk) => Focus::Single(&chunk[r]),
+ Focus::Full(tree) => Focus::Full(tree.narrow(r)),
+ }
+ }
+
+ /// Split the focus into two.
+ ///
+ /// Given an index `index`, consume the focus and produce two new foci, the
+ /// left onto indices `0..index`, and the right onto indices `index..N`
+ /// where `N` is the length of the current focus.
+ ///
+ /// Panics if the index is out of bounds.
+ ///
+ /// This is the moral equivalent of [`slice::split_at`][slice::split_at], in
+ /// that it leaves the underlying data structure unchanged, unlike
+ /// [`Vector::split_at`][Vector::split_at].
+ ///
+ /// ## Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// # use std::iter::FromIterator;
+ /// let vec = Vector::from_iter(0..1000);
+ /// let (left, right) = vec.focus().split_at(500);
+ /// let left_vec = left.into_iter().cloned().collect();
+ /// let right_vec = right.into_iter().cloned().collect();
+ /// assert_eq!(Vector::from_iter(0..500), left_vec);
+ /// assert_eq!(Vector::from_iter(500..1000), right_vec);
+ /// ```
+ ///
+ /// [slice::split_at]: https://doc.rust-lang.org/std/primitive.slice.html#method.split_at
+ /// [Vector::split_at]: enum.Vector.html#method.split_at
+ pub fn split_at(self, index: usize) -> (Self, Self) {
+ if index >= self.len() {
+ panic!("vector::Focus::split_at: index out of bounds");
+ }
+ match self {
+ Focus::Single(chunk) => {
+ let (left, right) = chunk.split_at(index);
+ (Focus::Single(left), Focus::Single(right))
+ }
+ Focus::Full(tree) => {
+ let (left, right) = tree.split_at(index);
+ (Focus::Full(left), Focus::Full(right))
+ }
+ }
+ }
+}
+
+impl<'a, A> IntoIterator for Focus<'a, A>
+where
+ A: Clone + 'a,
+{
+ type Item = &'a A;
+ type IntoIter = Iter<'a, A>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ Iter::from_focus(self)
+ }
+}
+
+impl<'a, A> Clone for Focus<'a, A>
+where
+ A: Clone + 'a,
+{
+ fn clone(&self) -> Self {
+ match self {
+ Focus::Single(chunk) => Focus::Single(chunk),
+ Focus::Full(tree) => Focus::Full(tree.clone()),
+ }
+ }
+}
+
+pub struct TreeFocus<A> {
+ tree: Rrb<A>,
+ view: Range<usize>,
+ middle_range: Range<usize>,
+ target_range: Range<usize>,
+ target_ptr: *const Chunk<A>,
+}
+
+impl<A> Clone for TreeFocus<A> {
+ fn clone(&self) -> Self {
+ let tree = self.tree.clone();
+ TreeFocus {
+ view: self.view.clone(),
+ middle_range: self.middle_range.clone(),
+ target_range: 0..0,
+ target_ptr: null(),
+ tree,
+ }
+ }
+}
+
+#[allow(unsafe_code)]
+#[cfg(threadsafe)]
+unsafe impl<A: Send> Send for TreeFocus<A> {}
+#[allow(unsafe_code)]
+#[cfg(threadsafe)]
+unsafe impl<A: Sync> Sync for TreeFocus<A> {}
+
+#[inline]
+fn contains<A: Ord>(range: &Range<A>, index: &A) -> bool {
+ *index >= range.start && *index < range.end
+}
+
+impl<A> TreeFocus<A>
+where
+ A: Clone,
+{
+ fn new(tree: &Rrb<A>) -> Self {
+ let middle_start = tree.outer_f.len() + tree.inner_f.len();
+ let middle_end = middle_start + tree.middle.len();
+ TreeFocus {
+ tree: tree.clone(),
+ view: 0..tree.length,
+ middle_range: middle_start..middle_end,
+ target_range: 0..0,
+ target_ptr: null(),
+ }
+ }
+
+ fn len(&self) -> usize {
+ self.view.end - self.view.start
+ }
+
+ fn narrow(self, mut view: Range<usize>) -> Self {
+ view.start += self.view.start;
+ view.end += self.view.start;
+ TreeFocus {
+ view,
+ middle_range: self.middle_range.clone(),
+ target_range: 0..0,
+ target_ptr: null(),
+ tree: self.tree,
+ }
+ }
+
+ fn split_at(self, index: usize) -> (Self, Self) {
+ let len = self.len();
+ let left = self.clone().narrow(0..index);
+ let right = self.narrow(index..len);
+ (left, right)
+ }
+
+ fn physical_index(&self, index: usize) -> usize {
+ debug_assert!(index < self.view.end);
+ self.view.start + index
+ }
+
+ fn logical_range(&self, range: &Range<usize>) -> Range<usize> {
+ (range.start - self.view.start)..(range.end - self.view.start)
+ }
+
+ fn set_focus(&mut self, index: usize) {
+ if index < self.middle_range.start {
+ let outer_len = self.tree.outer_f.len();
+ if index < outer_len {
+ self.target_range = 0..outer_len;
+ self.target_ptr = &*self.tree.outer_f;
+ } else {
+ self.target_range = outer_len..self.middle_range.start;
+ self.target_ptr = &*self.tree.inner_f;
+ }
+ } else if index >= self.middle_range.end {
+ let outer_start = self.middle_range.end + self.tree.inner_b.len();
+ if index < outer_start {
+ self.target_range = self.middle_range.end..outer_start;
+ self.target_ptr = &*self.tree.inner_b;
+ } else {
+ self.target_range = outer_start..self.tree.length;
+ self.target_ptr = &*self.tree.outer_b;
+ }
+ } else {
+ let tree_index = index - self.middle_range.start;
+ let (range, ptr) = self
+ .tree
+ .middle
+ .lookup_chunk(self.tree.middle_level, 0, tree_index);
+ self.target_range =
+ (range.start + self.middle_range.start)..(range.end + self.middle_range.start);
+ self.target_ptr = ptr;
+ }
+ }
+
+ #[allow(unsafe_code)]
+ fn get_focus(&self) -> &Chunk<A> {
+ unsafe { &*self.target_ptr }
+ }
+
+ pub fn get(&mut self, index: usize) -> Option<&A> {
+ if index >= self.len() {
+ return None;
+ }
+ let phys_index = self.physical_index(index);
+ if !contains(&self.target_range, &phys_index) {
+ self.set_focus(phys_index);
+ }
+ let target_phys_index = phys_index - self.target_range.start;
+ Some(&self.get_focus()[target_phys_index])
+ }
+
+ pub fn get_chunk(&mut self, index: usize) -> (Range<usize>, &[A]) {
+ let phys_index = self.physical_index(index);
+ if !contains(&self.target_range, &phys_index) {
+ self.set_focus(phys_index);
+ }
+ let mut slice: &[A] = self.get_focus().as_slice();
+ let mut left = 0;
+ let mut right = 0;
+ if self.target_range.start < self.view.start {
+ left = self.view.start - self.target_range.start;
+ }
+ if self.target_range.end > self.view.end {
+ right = self.target_range.end - self.view.end;
+ }
+ slice = &slice[left..(slice.len() - right)];
+ let phys_range = (self.target_range.start + left)..(self.target_range.end - right);
+ (self.logical_range(&phys_range), slice)
+ }
+}
+
+/// A mutable version of [`Focus`][Focus].
+///
+/// See [`Focus`][Focus] for more details.
+///
+/// You can only build one `FocusMut` at a time for a vector, effectively
+/// keeping a lock on the vector until you're done with the focus, which relies
+/// on the structure of the vector not changing while it exists.
+///
+/// ```rust,compile_fail
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::vector::Vector;
+/// # use std::iter::FromIterator;
+/// let mut vec = Vector::from_iter(0..1000);
+/// let focus1 = vec.focus_mut();
+/// // Fails here in 2015 edition because you're creating
+/// // two mutable references to the same thing.
+/// let focus2 = vec.focus_mut();
+/// // Fails here in 2018 edition because creating focus2
+/// // made focus1's lifetime go out of scope.
+/// assert_eq!(Some(&0), focus1.get(0));
+/// ```
+///
+/// On the other hand, you can split that one focus into multiple sub-focuses,
+/// which is safe because they can't overlap:
+///
+/// ```rust
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::vector::Vector;
+/// # use std::iter::FromIterator;
+/// let mut vec = Vector::from_iter(0..1000);
+/// let focus = vec.focus_mut();
+/// let (mut left, mut right) = focus.split_at(500);
+/// assert_eq!(Some(&0), left.get(0));
+/// assert_eq!(Some(&500), right.get(0));
+/// ```
+///
+/// These sub-foci also work as a lock on the vector, even if the focus they
+/// were created from goes out of scope.
+///
+/// ```rust,compile_fail
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::vector::Vector;
+/// # use std::iter::FromIterator;
+/// let mut vec = Vector::from_iter(0..1000);
+/// let (left, right) = {
+/// let focus = vec.focus_mut();
+/// focus.split_at(500)
+/// };
+/// // `left` and `right` are still in scope even if `focus` isn't, so we can't
+/// // create another focus:
+/// let focus2 = vec.focus_mut();
+/// assert_eq!(Some(&0), left.get(0));
+/// ```
+///
+/// [Focus]: enum.Focus.html
+pub enum FocusMut<'a, A> {
+ #[doc(hidden)]
+ Single(RRBPool<A>, &'a mut [A]),
+ #[doc(hidden)]
+ Full(RRBPool<A>, TreeFocusMut<'a, A>),
+}
+
+impl<'a, A> FocusMut<'a, A>
+where
+ A: Clone + 'a,
+{
+ /// Construct a `FocusMut` for a `Vector`.
+ pub fn new(vector: &'a mut Vector<A>) -> Self {
+ match &mut vector.vector {
+ Inline(pool, chunk) => FocusMut::Single(pool.clone(), chunk),
+ Single(pool, chunk) => FocusMut::Single(
+ pool.clone(),
+ PoolRef::make_mut(&pool.value_pool, chunk).as_mut_slice(),
+ ),
+ Full(pool, tree) => FocusMut::Full(pool.clone(), TreeFocusMut::new(tree)),
+ }
+ }
+
+ /// Get the length of the focused `Vector`.
+ pub fn len(&self) -> usize {
+ match self {
+ FocusMut::Single(_, chunk) => chunk.len(),
+ FocusMut::Full(_, tree) => tree.len(),
+ }
+ }
+
+ /// Test if the focused `Vector` is empty.
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ /// Get a reference to the value at a given index.
+ pub fn get(&mut self, index: usize) -> Option<&A> {
+ self.get_mut(index).map(|r| &*r)
+ }
+
+ /// Get a mutable reference to the value at a given index.
+ pub fn get_mut(&mut self, index: usize) -> Option<&mut A> {
+ match self {
+ FocusMut::Single(_, chunk) => chunk.get_mut(index),
+ FocusMut::Full(pool, tree) => tree.get(pool, index),
+ }
+ }
+
+ /// Get a reference to the value at a given index.
+ ///
+ /// Panics if the index is out of bounds.
+ pub fn index(&mut self, index: usize) -> &A {
+ &*self.index_mut(index)
+ }
+
+ /// Get a mutable reference to the value at a given index.
+ ///
+ /// Panics if the index is out of bounds.
+ #[allow(clippy::should_implement_trait)] // would if I could
+ pub fn index_mut(&mut self, index: usize) -> &mut A {
+ self.get_mut(index).expect("index out of bounds")
+ }
+
+ /// Update the value at a given index.
+ ///
+ /// Returns `None` if the index is out of bounds, or the replaced value
+ /// otherwise.
+ pub fn set(&mut self, index: usize, value: A) -> Option<A> {
+ self.get_mut(index).map(|pos| replace(pos, value))
+ }
+
+ /// Swap the values at two given indices.
+ ///
+ /// Panics if either index is out of bounds.
+ ///
+ /// If the indices are equal, this function returns without doing anything.
+ pub fn swap(&mut self, a: usize, b: usize) {
+ if a == b {
+ return;
+ }
+ self.pair(a, b, |left, right| swap(left, right));
+ }
+
+ /// Lookup two indices simultaneously and run a function over them.
+ ///
+ /// Useful because the borrow checker won't let you have more than one
+ /// mutable reference into the same data structure at any given time.
+ ///
+ /// Panics if either index is out of bounds, or if they are the same index.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// # use std::iter::FromIterator;
+ /// let mut vec = vector![1, 2, 3, 4, 5];
+ /// vec.focus_mut().pair(1, 3, |a, b| *a += *b);
+ /// assert_eq!(vector![1, 6, 3, 4, 5], vec);
+ /// ```
+ #[allow(unsafe_code)]
+ pub fn pair<F, B>(&mut self, a: usize, b: usize, mut f: F) -> B
+ where
+ F: FnMut(&mut A, &mut A) -> B,
+ {
+ if a == b {
+ panic!("vector::FocusMut::pair: indices cannot be equal!");
+ }
+ let pa: *mut A = self.index_mut(a);
+ let pb: *mut A = self.index_mut(b);
+ unsafe { f(&mut *pa, &mut *pb) }
+ }
+
+ /// Lookup three indices simultaneously and run a function over them.
+ ///
+ /// Useful because the borrow checker won't let you have more than one
+ /// mutable reference into the same data structure at any given time.
+ ///
+ /// Panics if any index is out of bounds, or if any indices are equal.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// # use std::iter::FromIterator;
+ /// let mut vec = vector![1, 2, 3, 4, 5];
+ /// vec.focus_mut().triplet(0, 2, 4, |a, b, c| *a += *b + *c);
+ /// assert_eq!(vector![9, 2, 3, 4, 5], vec);
+ /// ```
+ #[allow(unsafe_code)]
+ pub fn triplet<F, B>(&mut self, a: usize, b: usize, c: usize, mut f: F) -> B
+ where
+ F: FnMut(&mut A, &mut A, &mut A) -> B,
+ {
+ if a == b || b == c || a == c {
+ panic!("vector::FocusMut::triplet: indices cannot be equal!");
+ }
+ let pa: *mut A = self.index_mut(a);
+ let pb: *mut A = self.index_mut(b);
+ let pc: *mut A = self.index_mut(c);
+ unsafe { f(&mut *pa, &mut *pb, &mut *pc) }
+ }
+
+ /// Get the chunk for the given index.
+ ///
+ /// This gives you a reference to the leaf node that contains the index,
+ /// along with its start and end indices.
+ pub fn chunk_at(&mut self, index: usize) -> (Range<usize>, &mut [A]) {
+ let len = self.len();
+ if index >= len {
+ panic!("vector::FocusMut::chunk_at: index out of bounds");
+ }
+ match self {
+ FocusMut::Single(_, chunk) => (0..len, chunk),
+ FocusMut::Full(pool, tree) => {
+ let (range, chunk) = tree.get_chunk(pool, index);
+ (range, chunk)
+ }
+ }
+ }
+
+ /// Narrow the focus onto a subslice of the vector.
+ ///
+ /// `FocusMut::narrow(range)` has the same effect as `&slice[range]`, without
+ /// actually modifying the underlying vector.
+ ///
+ /// Panics if the range isn't fully inside the current focus.
+ ///
+ /// ## Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// # use std::iter::FromIterator;
+ /// let mut vec = Vector::from_iter(0..1000);
+ /// let narrowed = vec.focus_mut().narrow(100..200);
+ /// let narrowed_vec = narrowed.unmut().into_iter().cloned().collect();
+ /// assert_eq!(Vector::from_iter(100..200), narrowed_vec);
+ /// ```
+ ///
+ /// [slice::split_at]: https://doc.rust-lang.org/std/primitive.slice.html#method.split_at
+ /// [Vector::split_at]: enum.Vector.html#method.split_at
+ pub fn narrow<R>(self, range: R) -> Self
+ where
+ R: RangeBounds<usize>,
+ {
+ let r = to_range(&range, self.len());
+ if r.start > r.end || r.start > self.len() {
+ panic!("vector::FocusMut::narrow: range out of bounds");
+ }
+ match self {
+ FocusMut::Single(pool, chunk) => FocusMut::Single(pool, &mut chunk[r]),
+ FocusMut::Full(pool, tree) => FocusMut::Full(pool, tree.narrow(r)),
+ }
+ }
+
+ /// Split the focus into two.
+ ///
+ /// Given an index `index`, consume the focus and produce two new foci, the
+ /// left onto indices `0..index`, and the right onto indices `index..N`
+ /// where `N` is the length of the current focus.
+ ///
+ /// Panics if the index is out of bounds.
+ ///
+ /// This is the moral equivalent of [`slice::split_at`][slice::split_at], in
+ /// that it leaves the underlying data structure unchanged, unlike
+ /// [`Vector::split_at`][Vector::split_at].
+ ///
+ /// ## Examples
+ ///
+ /// ```rust
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// # use std::iter::FromIterator;
+ /// let mut vec = Vector::from_iter(0..1000);
+ /// {
+ /// let (left, right) = vec.focus_mut().split_at(500);
+ /// for ptr in left {
+ /// *ptr += 100;
+ /// }
+ /// for ptr in right {
+ /// *ptr -= 100;
+ /// }
+ /// }
+ /// let expected = Vector::from_iter(100..600)
+ /// + Vector::from_iter(400..900);
+ /// assert_eq!(expected, vec);
+ /// ```
+ ///
+ /// [slice::split_at]: https://doc.rust-lang.org/std/primitive.slice.html#method.split_at
+ /// [Vector::split_at]: enum.Vector.html#method.split_at
+ #[allow(clippy::redundant_clone)]
+ pub fn split_at(self, index: usize) -> (Self, Self) {
+ if index > self.len() {
+ panic!("vector::FocusMut::split_at: index out of bounds");
+ }
+ match self {
+ FocusMut::Single(pool, chunk) => {
+ let (left, right) = chunk.split_at_mut(index);
+ (
+ FocusMut::Single(pool.clone(), left),
+ FocusMut::Single(pool, right),
+ )
+ }
+ FocusMut::Full(pool, tree) => {
+ let (left, right) = tree.split_at(index);
+ (
+ FocusMut::Full(pool.clone(), left),
+ FocusMut::Full(pool, right),
+ )
+ }
+ }
+ }
+
+ /// Convert a `FocusMut` into a `Focus`.
+ pub fn unmut(self) -> Focus<'a, A> {
+ match self {
+ FocusMut::Single(_, chunk) => Focus::Single(chunk),
+ FocusMut::Full(_, mut tree) => Focus::Full(TreeFocus {
+ tree: {
+ let t = tree.tree.lock().unwrap();
+ (*t).clone()
+ },
+ view: tree.view.clone(),
+ middle_range: tree.middle_range.clone(),
+ target_range: 0..0,
+ target_ptr: null(),
+ }),
+ }
+ }
+}
+
+impl<'a, A> IntoIterator for FocusMut<'a, A>
+where
+ A: Clone + 'a,
+{
+ type Item = &'a mut A;
+ type IntoIter = IterMut<'a, A>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ IterMut::from_focus(self)
+ }
+}
+
+impl<'a, A> From<FocusMut<'a, A>> for Focus<'a, A>
+where
+ A: Clone + 'a,
+{
+ fn from(f: FocusMut<'a, A>) -> Self {
+ f.unmut()
+ }
+}
+
+pub struct TreeFocusMut<'a, A> {
+ tree: Lock<&'a mut Rrb<A>>,
+ view: Range<usize>,
+ middle_range: Range<usize>,
+ target_range: Range<usize>,
+ target_ptr: AtomicPtr<Chunk<A>>,
+}
+
+impl<'a, A> TreeFocusMut<'a, A>
+where
+ A: Clone + 'a,
+{
+ fn new(tree: &'a mut Rrb<A>) -> Self {
+ let middle_start = tree.outer_f.len() + tree.inner_f.len();
+ let middle_end = middle_start + tree.middle.len();
+ TreeFocusMut {
+ view: 0..tree.length,
+ tree: Lock::new(tree),
+ middle_range: middle_start..middle_end,
+ target_range: 0..0,
+ target_ptr: AtomicPtr::default(),
+ }
+ }
+
+ fn len(&self) -> usize {
+ self.view.end - self.view.start
+ }
+
+ fn narrow(self, mut view: Range<usize>) -> Self {
+ view.start += self.view.start;
+ view.end += self.view.start;
+ TreeFocusMut {
+ view,
+ middle_range: self.middle_range.clone(),
+ target_range: 0..0,
+ target_ptr: AtomicPtr::default(),
+ tree: self.tree,
+ }
+ }
+
+ fn split_at(self, index: usize) -> (Self, Self) {
+ let len = self.len();
+ debug_assert!(index <= len);
+ #[allow(unsafe_code)]
+ let left = TreeFocusMut {
+ view: self.view.start..(self.view.start + index),
+ middle_range: self.middle_range.clone(),
+ target_range: 0..0,
+ target_ptr: AtomicPtr::default(),
+ tree: self.tree.clone(),
+ };
+ let right = TreeFocusMut {
+ view: (self.view.start + index)..(self.view.start + len),
+ middle_range: self.middle_range.clone(),
+ target_range: 0..0,
+ target_ptr: AtomicPtr::default(),
+ tree: self.tree,
+ };
+ (left, right)
+ }
+
+ fn physical_index(&self, index: usize) -> usize {
+ debug_assert!(index < self.view.end);
+ self.view.start + index
+ }
+
+ fn logical_range(&self, range: &Range<usize>) -> Range<usize> {
+ (range.start - self.view.start)..(range.end - self.view.start)
+ }
+
+ fn set_focus(&mut self, pool: &RRBPool<A>, index: usize) {
+ let mut tree = self
+ .tree
+ .lock()
+ .expect("im::vector::Focus::set_focus: unable to acquire exclusive lock on Vector");
+ if index < self.middle_range.start {
+ let outer_len = tree.outer_f.len();
+ if index < outer_len {
+ self.target_range = 0..outer_len;
+ self.target_ptr.store(
+ PoolRef::make_mut(&pool.value_pool, &mut tree.outer_f),
+ Ordering::Relaxed,
+ );
+ } else {
+ self.target_range = outer_len..self.middle_range.start;
+ self.target_ptr.store(
+ PoolRef::make_mut(&pool.value_pool, &mut tree.inner_f),
+ Ordering::Relaxed,
+ );
+ }
+ } else if index >= self.middle_range.end {
+ let outer_start = self.middle_range.end + tree.inner_b.len();
+ if index < outer_start {
+ self.target_range = self.middle_range.end..outer_start;
+ self.target_ptr.store(
+ PoolRef::make_mut(&pool.value_pool, &mut tree.inner_b),
+ Ordering::Relaxed,
+ );
+ } else {
+ self.target_range = outer_start..tree.length;
+ self.target_ptr.store(
+ PoolRef::make_mut(&pool.value_pool, &mut tree.outer_b),
+ Ordering::Relaxed,
+ );
+ }
+ } else {
+ let tree_index = index - self.middle_range.start;
+ let level = tree.middle_level;
+ let middle = Ref::make_mut(&mut tree.middle);
+ let (range, ptr) = middle.lookup_chunk_mut(pool, level, 0, tree_index);
+ self.target_range =
+ (range.start + self.middle_range.start)..(range.end + self.middle_range.start);
+ self.target_ptr.store(ptr, Ordering::Relaxed);
+ }
+ }
+
+ #[allow(unsafe_code)]
+ fn get_focus(&mut self) -> &mut Chunk<A> {
+ unsafe { &mut *self.target_ptr.load(Ordering::Relaxed) }
+ }
+
+ pub fn get(&mut self, pool: &RRBPool<A>, index: usize) -> Option<&mut A> {
+ if index >= self.len() {
+ return None;
+ }
+ let phys_index = self.physical_index(index);
+ if !contains(&self.target_range, &phys_index) {
+ self.set_focus(pool, phys_index);
+ }
+ let target_phys_index = phys_index - self.target_range.start;
+ Some(&mut self.get_focus()[target_phys_index])
+ }
+
+ pub fn get_chunk(&mut self, pool: &RRBPool<A>, index: usize) -> (Range<usize>, &mut [A]) {
+ let phys_index = self.physical_index(index);
+ if !contains(&self.target_range, &phys_index) {
+ self.set_focus(pool, phys_index);
+ }
+ let mut left = 0;
+ let mut right = 0;
+ if self.target_range.start < self.view.start {
+ left = self.view.start - self.target_range.start;
+ }
+ if self.target_range.end > self.view.end {
+ right = self.target_range.end - self.view.end;
+ }
+ let phys_range = (self.target_range.start + left)..(self.target_range.end - right);
+ let log_range = self.logical_range(&phys_range);
+ let slice_len = self.get_focus().len();
+ let slice = &mut (self.get_focus().as_mut_slice())[left..(slice_len - right)];
+ (log_range, slice)
+ }
+}
diff --git a/vendor/im-rc/src/vector/mod.rs b/vendor/im-rc/src/vector/mod.rs
new file mode 100644
index 0000000..a2ce0ad
--- /dev/null
+++ b/vendor/im-rc/src/vector/mod.rs
@@ -0,0 +1,2745 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+//! A persistent vector.
+//!
+//! This is a sequence of elements in insertion order - if you need a
+//! list of things, any kind of list of things, this is what you're
+//! looking for.
+//!
+//! It's implemented as an [RRB vector][rrbpaper] with [smart
+//! head/tail chunking][chunkedseq]. In performance terms, this means
+//! that practically every operation is O(log n), except push/pop on
+//! both sides, which will be O(1) amortised, and O(log n) in the
+//! worst case. In practice, the push/pop operations will be
+//! blindingly fast, nearly on par with the native
+//! [`VecDeque`][VecDeque], and other operations will have decent, if
+//! not high, performance, but they all have more or less the same
+//! O(log n) complexity, so you don't need to keep their performance
+//! characteristics in mind - everything, even splitting and merging,
+//! is safe to use and never too slow.
+//!
+//! ## Performance Notes
+//!
+//! Because of the head/tail chunking technique, until you push a
+//! number of items above double the tree's branching factor (that's
+//! `self.len()` = 2 × *k* (where *k* = 64) = 128) on either side, the
+//! data structure is still just a handful of arrays, not yet an RRB
+//! tree, so you'll see performance and memory characteristics fairly
+//! close to [`Vec`][Vec] or [`VecDeque`][VecDeque].
+//!
+//! This means that the structure always preallocates four chunks of
+//! size *k* (*k* being the tree's branching factor), equivalent to a
+//! [`Vec`][Vec] with an initial capacity of 256. Beyond that, it will
+//! allocate tree nodes of capacity *k* as needed.
+//!
+//! In addition, vectors start out as single chunks, and only expand into the
+//! full data structure once you go past the chunk size. This makes them
+//! perform identically to [`Vec`][Vec] at small sizes.
+//!
+//! [rrbpaper]: https://infoscience.epfl.ch/record/213452/files/rrbvector.pdf
+//! [chunkedseq]: http://deepsea.inria.fr/pasl/chunkedseq.pdf
+//! [Vec]: https://doc.rust-lang.org/std/vec/struct.Vec.html
+//! [VecDeque]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html
+
+use std::borrow::Borrow;
+use std::cmp::Ordering;
+use std::fmt::{Debug, Error, Formatter};
+use std::hash::{Hash, Hasher};
+use std::iter::Sum;
+use std::iter::{FromIterator, FusedIterator};
+use std::mem::{replace, swap};
+use std::ops::{Add, Index, IndexMut, RangeBounds};
+
+use sized_chunks::InlineArray;
+
+use crate::nodes::chunk::{Chunk, CHUNK_SIZE};
+use crate::nodes::rrb::{Node, PopResult, PushResult, SplitResult};
+use crate::sort;
+use crate::util::{clone_ref, swap_indices, to_range, Pool, PoolDefault, PoolRef, Ref, Side};
+
+use self::VectorInner::{Full, Inline, Single};
+
+mod focus;
+
+pub use self::focus::{Focus, FocusMut};
+
+mod pool;
+pub use self::pool::RRBPool;
+
+#[cfg(all(threadsafe, any(test, feature = "rayon")))]
+pub mod rayon;
+
+/// Construct a vector from a sequence of elements.
+///
+/// # Examples
+///
+/// ```
+/// # #[macro_use] extern crate im_rc as im;
+/// # use im::vector::Vector;
+/// # fn main() {
+/// assert_eq!(
+/// vector![1, 2, 3],
+/// Vector::from(vec![1, 2, 3])
+/// );
+/// # }
+/// ```
+#[macro_export]
+macro_rules! vector {
+ () => { $crate::vector::Vector::new() };
+
+ ( $($x:expr),* ) => {{
+ let mut l = $crate::vector::Vector::new();
+ $(
+ l.push_back($x);
+ )*
+ l
+ }};
+
+ ( $($x:expr ,)* ) => {{
+ let mut l = $crate::vector::Vector::new();
+ $(
+ l.push_back($x);
+ )*
+ l
+ }};
+}
+
+/// A persistent vector.
+///
+/// This is a sequence of elements in insertion order - if you need a list of
+/// things, any kind of list of things, this is what you're looking for.
+///
+/// It's implemented as an [RRB vector][rrbpaper] with [smart head/tail
+/// chunking][chunkedseq]. In performance terms, this means that practically
+/// every operation is O(log n), except push/pop on both sides, which will be
+/// O(1) amortised, and O(log n) in the worst case. In practice, the push/pop
+/// operations will be blindingly fast, nearly on par with the native
+/// [`VecDeque`][VecDeque], and other operations will have decent, if not high,
+/// performance, but they all have more or less the same O(log n) complexity, so
+/// you don't need to keep their performance characteristics in mind -
+/// everything, even splitting and merging, is safe to use and never too slow.
+///
+/// ## Performance Notes
+///
+/// Because of the head/tail chunking technique, until you push a number of
+/// items above double the tree's branching factor (that's `self.len()` = 2 ×
+/// *k* (where *k* = 64) = 128) on either side, the data structure is still just
+/// a handful of arrays, not yet an RRB tree, so you'll see performance and
+/// memory characteristics similar to [`Vec`][Vec] or [`VecDeque`][VecDeque].
+///
+/// This means that the structure always preallocates four chunks of size *k*
+/// (*k* being the tree's branching factor), equivalent to a [`Vec`][Vec] with
+/// an initial capacity of 256. Beyond that, it will allocate tree nodes of
+/// capacity *k* as needed.
+///
+/// In addition, vectors start out as single chunks, and only expand into the
+/// full data structure once you go past the chunk size. This makes them
+/// perform identically to [`Vec`][Vec] at small sizes.
+///
+/// [rrbpaper]: https://infoscience.epfl.ch/record/213452/files/rrbvector.pdf
+/// [chunkedseq]: http://deepsea.inria.fr/pasl/chunkedseq.pdf
+/// [Vec]: https://doc.rust-lang.org/std/vec/struct.Vec.html
+/// [VecDeque]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html
+pub struct Vector<A> {
+ vector: VectorInner<A>,
+}
+
+enum VectorInner<A> {
+ Inline(RRBPool<A>, InlineArray<A, Rrb<A>>),
+ Single(RRBPool<A>, PoolRef<Chunk<A>>),
+ Full(RRBPool<A>, Rrb<A>),
+}
+
+#[doc(hidden)]
+pub struct Rrb<A> {
+ length: usize,
+ middle_level: usize,
+ outer_f: PoolRef<Chunk<A>>,
+ inner_f: PoolRef<Chunk<A>>,
+ middle: Ref<Node<A>>,
+ inner_b: PoolRef<Chunk<A>>,
+ outer_b: PoolRef<Chunk<A>>,
+}
+
+impl<A> Clone for Rrb<A> {
+ fn clone(&self) -> Self {
+ Rrb {
+ length: self.length,
+ middle_level: self.middle_level,
+ outer_f: self.outer_f.clone(),
+ inner_f: self.inner_f.clone(),
+ middle: self.middle.clone(),
+ inner_b: self.inner_b.clone(),
+ outer_b: self.outer_b.clone(),
+ }
+ }
+}
+
+impl<A: Clone> Vector<A> {
+ /// Get a reference to the memory pool this `Vector` is using.
+ ///
+ /// Note that if you didn't specifically construct it with a pool, you'll
+ /// get back a reference to a pool of size 0.
+ #[cfg_attr(not(feature = "pool"), doc(hidden))]
+ pub fn pool(&self) -> &RRBPool<A> {
+ match self.vector {
+ Inline(ref pool, _) => pool,
+ Single(ref pool, _) => pool,
+ Full(ref pool, _) => pool,
+ }
+ }
+
+ /// True if a vector is a full inline or single chunk, ie. must be promoted
+ /// to grow further.
+ fn needs_promotion(&self) -> bool {
+ match &self.vector {
+ Inline(_, chunk) if chunk.is_full() => true,
+ Single(_, chunk) if chunk.is_full() => true,
+ _ => false,
+ }
+ }
+
+ /// Promote an inline to a single.
+ fn promote_inline(&mut self) {
+ if let Inline(pool, chunk) = &mut self.vector {
+ self.vector = Single(pool.clone(), PoolRef::new(&pool.value_pool, chunk.into()));
+ }
+ }
+
+ /// Promote a single to a full, with the single chunk becoming inner_f, or
+ /// promote an inline to a single.
+ fn promote_front(&mut self) {
+ self.vector = match &mut self.vector {
+ Inline(pool, chunk) => {
+ Single(pool.clone(), PoolRef::new(&pool.value_pool, chunk.into()))
+ }
+ Single(pool, chunk) => {
+ let chunk = chunk.clone();
+ Full(
+ pool.clone(),
+ Rrb {
+ length: chunk.len(),
+ middle_level: 0,
+ outer_f: PoolRef::default(&pool.value_pool),
+ inner_f: chunk,
+ middle: Ref::new(Node::new()),
+ inner_b: PoolRef::default(&pool.value_pool),
+ outer_b: PoolRef::default(&pool.value_pool),
+ },
+ )
+ }
+ Full(_, _) => return,
+ }
+ }
+
+ /// Promote a single to a full, with the single chunk becoming inner_b, or
+ /// promote an inline to a single.
+ fn promote_back(&mut self) {
+ self.vector = match &mut self.vector {
+ Inline(pool, chunk) => {
+ Single(pool.clone(), PoolRef::new(&pool.value_pool, chunk.into()))
+ }
+ Single(pool, chunk) => {
+ let chunk = chunk.clone();
+ Full(
+ pool.clone(),
+ Rrb {
+ length: chunk.len(),
+ middle_level: 0,
+ outer_f: PoolRef::default(&pool.value_pool),
+ inner_f: PoolRef::default(&pool.value_pool),
+ middle: Ref::new(Node::new()),
+ inner_b: chunk,
+ outer_b: PoolRef::default(&pool.value_pool),
+ },
+ )
+ }
+ Full(_, _) => return,
+ }
+ }
+
+ /// Construct an empty vector.
+ #[must_use]
+ pub fn new() -> Self {
+ Self {
+ vector: Inline(RRBPool::default(), InlineArray::new()),
+ }
+ }
+
+ /// Construct an empty vector using a specific memory pool.
+ #[cfg(feature = "pool")]
+ #[must_use]
+ pub fn with_pool(pool: &RRBPool<A>) -> Self {
+ Self {
+ vector: Inline(pool.clone(), InlineArray::new()),
+ }
+ }
+
+ /// Get the length of a vector.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// assert_eq!(5, vector![1, 2, 3, 4, 5].len());
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn len(&self) -> usize {
+ match &self.vector {
+ Inline(_, chunk) => chunk.len(),
+ Single(_, chunk) => chunk.len(),
+ Full(_, tree) => tree.length,
+ }
+ }
+
+ /// Test whether a vector is empty.
+ ///
+ /// Time: O(1)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let vec = vector!["Joe", "Mike", "Robert"];
+ /// assert_eq!(false, vec.is_empty());
+ /// assert_eq!(true, Vector::<i32>::new().is_empty());
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+
+ /// Test whether a vector is currently inlined.
+ ///
+ /// Vectors small enough that their contents could be stored entirely inside
+ /// the space of `std::mem::size_of::<Vector<A>>()` bytes are stored inline on
+ /// the stack instead of allocating any chunks. This method returns `true` if
+ /// this vector is currently inlined, or `false` if it currently has chunks allocated
+ /// on the heap.
+ ///
+ /// This may be useful in conjunction with [`ptr_eq()`][ptr_eq], which checks if
+ /// two vectors' heap allocations are the same, and thus will never return `true`
+ /// for inlined vectors.
+ ///
+ /// Time: O(1)
+ ///
+ /// [ptr_eq]: #method.ptr_eq
+ #[inline]
+ #[must_use]
+ pub fn is_inline(&self) -> bool {
+ matches!(&self.vector, Inline(_, _))
+ }
+
+ /// Test whether two vectors refer to the same content in memory.
+ ///
+ /// This uses the following rules to determine equality:
+ /// * If the two sides are references to the same vector, return true.
+ /// * If the two sides are single chunk vectors pointing to the same chunk, return true.
+ /// * If the two sides are full trees pointing to the same chunks, return true.
+ ///
+ /// This would return true if you're comparing a vector to itself, or
+ /// if you're comparing a vector to a fresh clone of itself. The exception to this is
+ /// if you've cloned an inline array (ie. an array with so few elements they can fit
+ /// inside the space a `Vector` allocates for its pointers, so there are no heap allocations
+ /// to compare).
+ ///
+ /// Time: O(1)
+ #[must_use]
+ pub fn ptr_eq(&self, other: &Self) -> bool {
+ fn cmp_chunk<A>(left: &PoolRef<Chunk<A>>, right: &PoolRef<Chunk<A>>) -> bool {
+ (left.is_empty() && right.is_empty()) || PoolRef::ptr_eq(left, right)
+ }
+
+ if std::ptr::eq(self, other) {
+ return true;
+ }
+
+ match (&self.vector, &other.vector) {
+ (Single(_, left), Single(_, right)) => cmp_chunk(left, right),
+ (Full(_, left), Full(_, right)) => {
+ cmp_chunk(&left.outer_f, &right.outer_f)
+ && cmp_chunk(&left.inner_f, &right.inner_f)
+ && cmp_chunk(&left.inner_b, &right.inner_b)
+ && cmp_chunk(&left.outer_b, &right.outer_b)
+ && ((left.middle.is_empty() && right.middle.is_empty())
+ || Ref::ptr_eq(&left.middle, &right.middle))
+ }
+ _ => false,
+ }
+ }
+
+ /// Get an iterator over a vector.
+ ///
+ /// Time: O(1)
+ #[inline]
+ #[must_use]
+ pub fn iter(&self) -> Iter<'_, A> {
+ Iter::new(self)
+ }
+
+ /// Get a mutable iterator over a vector.
+ ///
+ /// Time: O(1)
+ #[inline]
+ #[must_use]
+ pub fn iter_mut(&mut self) -> IterMut<'_, A> {
+ IterMut::new(self)
+ }
+
+ /// Get an iterator over the leaf nodes of a vector.
+ ///
+ /// This returns an iterator over the [`Chunk`s][Chunk] at the leaves of the
+ /// RRB tree. These are useful for efficient parallelisation of work on
+ /// the vector, but should not be used for basic iteration.
+ ///
+ /// Time: O(1)
+ ///
+ /// [Chunk]: ../chunk/struct.Chunk.html
+ #[inline]
+ #[must_use]
+ pub fn leaves(&self) -> Chunks<'_, A> {
+ Chunks::new(self)
+ }
+
+ /// Get a mutable iterator over the leaf nodes of a vector.
+ //
+ /// This returns an iterator over the [`Chunk`s][Chunk] at the leaves of the
+ /// RRB tree. These are useful for efficient parallelisation of work on
+ /// the vector, but should not be used for basic iteration.
+ ///
+ /// Time: O(1)
+ ///
+ /// [Chunk]: ../chunk/struct.Chunk.html
+ #[inline]
+ #[must_use]
+ pub fn leaves_mut(&mut self) -> ChunksMut<'_, A> {
+ ChunksMut::new(self)
+ }
+
+ /// Construct a [`Focus`][Focus] for a vector.
+ ///
+ /// Time: O(1)
+ ///
+ /// [Focus]: enum.Focus.html
+ #[inline]
+ #[must_use]
+ pub fn focus(&self) -> Focus<'_, A> {
+ Focus::new(self)
+ }
+
+ /// Construct a [`FocusMut`][FocusMut] for a vector.
+ ///
+ /// Time: O(1)
+ ///
+ /// [FocusMut]: enum.FocusMut.html
+ #[inline]
+ #[must_use]
+ pub fn focus_mut(&mut self) -> FocusMut<'_, A> {
+ FocusMut::new(self)
+ }
+
+ /// Get a reference to the value at index `index` in a vector.
+ ///
+ /// Returns `None` if the index is out of bounds.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let vec = vector!["Joe", "Mike", "Robert"];
+ /// assert_eq!(Some(&"Robert"), vec.get(2));
+ /// assert_eq!(None, vec.get(5));
+ /// ```
+ #[must_use]
+ pub fn get(&self, index: usize) -> Option<&A> {
+ if index >= self.len() {
+ return None;
+ }
+
+ match &self.vector {
+ Inline(_, chunk) => chunk.get(index),
+ Single(_, chunk) => chunk.get(index),
+ Full(_, tree) => {
+ let mut local_index = index;
+
+ if local_index < tree.outer_f.len() {
+ return Some(&tree.outer_f[local_index]);
+ }
+ local_index -= tree.outer_f.len();
+
+ if local_index < tree.inner_f.len() {
+ return Some(&tree.inner_f[local_index]);
+ }
+ local_index -= tree.inner_f.len();
+
+ if local_index < tree.middle.len() {
+ return Some(tree.middle.index(tree.middle_level, local_index));
+ }
+ local_index -= tree.middle.len();
+
+ if local_index < tree.inner_b.len() {
+ return Some(&tree.inner_b[local_index]);
+ }
+ local_index -= tree.inner_b.len();
+
+ Some(&tree.outer_b[local_index])
+ }
+ }
+ }
+
+ /// Get a mutable reference to the value at index `index` in a
+ /// vector.
+ ///
+ /// Returns `None` if the index is out of bounds.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let mut vec = vector!["Joe", "Mike", "Robert"];
+ /// {
+ /// let robert = vec.get_mut(2).unwrap();
+ /// assert_eq!(&mut "Robert", robert);
+ /// *robert = "Bjarne";
+ /// }
+ /// assert_eq!(vector!["Joe", "Mike", "Bjarne"], vec);
+ /// ```
+ #[must_use]
+ pub fn get_mut(&mut self, index: usize) -> Option<&mut A> {
+ if index >= self.len() {
+ return None;
+ }
+
+ match &mut self.vector {
+ Inline(_, chunk) => chunk.get_mut(index),
+ Single(pool, chunk) => PoolRef::make_mut(&pool.value_pool, chunk).get_mut(index),
+ Full(pool, tree) => {
+ let mut local_index = index;
+
+ if local_index < tree.outer_f.len() {
+ let outer_f = PoolRef::make_mut(&pool.value_pool, &mut tree.outer_f);
+ return Some(&mut outer_f[local_index]);
+ }
+ local_index -= tree.outer_f.len();
+
+ if local_index < tree.inner_f.len() {
+ let inner_f = PoolRef::make_mut(&pool.value_pool, &mut tree.inner_f);
+ return Some(&mut inner_f[local_index]);
+ }
+ local_index -= tree.inner_f.len();
+
+ if local_index < tree.middle.len() {
+ let middle = Ref::make_mut(&mut tree.middle);
+ return Some(middle.index_mut(pool, tree.middle_level, local_index));
+ }
+ local_index -= tree.middle.len();
+
+ if local_index < tree.inner_b.len() {
+ let inner_b = PoolRef::make_mut(&pool.value_pool, &mut tree.inner_b);
+ return Some(&mut inner_b[local_index]);
+ }
+ local_index -= tree.inner_b.len();
+
+ let outer_b = PoolRef::make_mut(&pool.value_pool, &mut tree.outer_b);
+ Some(&mut outer_b[local_index])
+ }
+ }
+ }
+
+ /// Get the first element of a vector.
+ ///
+ /// If the vector is empty, `None` is returned.
+ ///
+ /// Time: O(log n)
+ #[inline]
+ #[must_use]
+ pub fn front(&self) -> Option<&A> {
+ self.get(0)
+ }
+
+ /// Get a mutable reference to the first element of a vector.
+ ///
+ /// If the vector is empty, `None` is returned.
+ ///
+ /// Time: O(log n)
+ #[inline]
+ #[must_use]
+ pub fn front_mut(&mut self) -> Option<&mut A> {
+ self.get_mut(0)
+ }
+
+ /// Get the first element of a vector.
+ ///
+ /// If the vector is empty, `None` is returned.
+ ///
+ /// This is an alias for the [`front`][front] method.
+ ///
+ /// Time: O(log n)
+ ///
+ /// [front]: #method.front
+ #[inline]
+ #[must_use]
+ pub fn head(&self) -> Option<&A> {
+ self.get(0)
+ }
+
+ /// Get the last element of a vector.
+ ///
+ /// If the vector is empty, `None` is returned.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn back(&self) -> Option<&A> {
+ if self.is_empty() {
+ None
+ } else {
+ self.get(self.len() - 1)
+ }
+ }
+
+ /// Get a mutable reference to the last element of a vector.
+ ///
+ /// If the vector is empty, `None` is returned.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn back_mut(&mut self) -> Option<&mut A> {
+ if self.is_empty() {
+ None
+ } else {
+ let len = self.len();
+ self.get_mut(len - 1)
+ }
+ }
+
+ /// Get the last element of a vector.
+ ///
+ /// If the vector is empty, `None` is returned.
+ ///
+ /// This is an alias for the [`back`][back] method.
+ ///
+ /// Time: O(log n)
+ ///
+ /// [back]: #method.back
+ #[inline]
+ #[must_use]
+ pub fn last(&self) -> Option<&A> {
+ self.back()
+ }
+
+ /// Get the index of a given element in the vector.
+ ///
+ /// Searches the vector for the first occurrence of a given value,
+ /// and returns the index of the value if it's there. Otherwise,
+ /// it returns `None`.
+ ///
+ /// Time: O(n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let mut vec = vector![1, 2, 3, 4, 5];
+ /// assert_eq!(Some(2), vec.index_of(&3));
+ /// assert_eq!(None, vec.index_of(&31337));
+ /// ```
+ #[must_use]
+ pub fn index_of(&self, value: &A) -> Option<usize>
+ where
+ A: PartialEq,
+ {
+ for (index, item) in self.iter().enumerate() {
+ if value == item {
+ return Some(index);
+ }
+ }
+ None
+ }
+
+ /// Test if a given element is in the vector.
+ ///
+ /// Searches the vector for the first occurrence of a given value,
+ /// and returns `true` if it's there. If it's nowhere to be found
+ /// in the vector, it returns `false`.
+ ///
+ /// Time: O(n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let mut vec = vector![1, 2, 3, 4, 5];
+ /// assert_eq!(true, vec.contains(&3));
+ /// assert_eq!(false, vec.contains(&31337));
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn contains(&self, value: &A) -> bool
+ where
+ A: PartialEq,
+ {
+ self.index_of(value).is_some()
+ }
+
+ /// Discard all elements from the vector.
+ ///
+ /// This leaves you with an empty vector, and all elements that
+ /// were previously inside it are dropped.
+ ///
+ /// Time: O(n)
+ pub fn clear(&mut self) {
+ if !self.is_empty() {
+ self.vector = Inline(self.pool().clone(), InlineArray::new());
+ }
+ }
+
+ /// Binary search a sorted vector for a given element using a comparator
+ /// function.
+ ///
+ /// Assumes the vector has already been sorted using the same comparator
+ /// function, eg. by using [`sort_by`][sort_by].
+ ///
+ /// If the value is found, it returns `Ok(index)` where `index` is the index
+ /// of the element. If the value isn't found, it returns `Err(index)` where
+ /// `index` is the index at which the element would need to be inserted to
+ /// maintain sorted order.
+ ///
+ /// Time: O(log n)
+ ///
+ /// [sort_by]: #method.sort_by
+ pub fn binary_search_by<F>(&self, mut f: F) -> Result<usize, usize>
+ where
+ F: FnMut(&A) -> Ordering,
+ {
+ let mut size = self.len();
+ if size == 0 {
+ return Err(0);
+ }
+ let mut base = 0;
+ while size > 1 {
+ let half = size / 2;
+ let mid = base + half;
+ base = match f(&self[mid]) {
+ Ordering::Greater => base,
+ _ => mid,
+ };
+ size -= half;
+ }
+ match f(&self[base]) {
+ Ordering::Equal => Ok(base),
+ Ordering::Greater => Err(base),
+ Ordering::Less => Err(base + 1),
+ }
+ }
+
+ /// Binary search a sorted vector for a given element.
+ ///
+ /// If the value is found, it returns `Ok(index)` where `index` is the index
+ /// of the element. If the value isn't found, it returns `Err(index)` where
+ /// `index` is the index at which the element would need to be inserted to
+ /// maintain sorted order.
+ ///
+ /// Time: O(log n)
+ pub fn binary_search(&self, value: &A) -> Result<usize, usize>
+ where
+ A: Ord,
+ {
+ self.binary_search_by(|e| e.cmp(value))
+ }
+
+ /// Binary search a sorted vector for a given element with a key extract
+ /// function.
+ ///
+ /// Assumes the vector has already been sorted using the same key extract
+ /// function, eg. by using [`sort_by_key`][sort_by_key].
+ ///
+ /// If the value is found, it returns `Ok(index)` where `index` is the index
+ /// of the element. If the value isn't found, it returns `Err(index)` where
+ /// `index` is the index at which the element would need to be inserted to
+ /// maintain sorted order.
+ ///
+ /// Time: O(log n)
+ ///
+ /// [sort_by_key]: #method.sort_by_key
+ pub fn binary_search_by_key<B, F>(&self, b: &B, mut f: F) -> Result<usize, usize>
+ where
+ F: FnMut(&A) -> B,
+ B: Ord,
+ {
+ self.binary_search_by(|k| f(k).cmp(b))
+ }
+}
+
+impl<A: Clone> Vector<A> {
+ /// Construct a vector with a single value.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// let vec = Vector::unit(1337);
+ /// assert_eq!(1, vec.len());
+ /// assert_eq!(
+ /// vec.get(0),
+ /// Some(&1337)
+ /// );
+ /// ```
+ #[inline]
+ #[must_use]
+ pub fn unit(a: A) -> Self {
+ let pool = RRBPool::default();
+ if InlineArray::<A, Rrb<A>>::CAPACITY > 0 {
+ let mut array = InlineArray::new();
+ array.push(a);
+ Self {
+ vector: Inline(pool, array),
+ }
+ } else {
+ let chunk = PoolRef::new(&pool.value_pool, Chunk::unit(a));
+ Self {
+ vector: Single(pool, chunk),
+ }
+ }
+ }
+
+ /// Create a new vector with the value at index `index` updated.
+ ///
+ /// Panics if the index is out of bounds.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let mut vec = vector![1, 2, 3];
+ /// assert_eq!(vector![1, 5, 3], vec.update(1, 5));
+ /// ```
+ #[must_use]
+ pub fn update(&self, index: usize, value: A) -> Self {
+ let mut out = self.clone();
+ out[index] = value;
+ out
+ }
+
+ /// Update the value at index `index` in a vector.
+ ///
+ /// Returns the previous value at the index.
+ ///
+ /// Panics if the index is out of bounds.
+ ///
+ /// Time: O(log n)
+ #[inline]
+ pub fn set(&mut self, index: usize, value: A) -> A {
+ replace(&mut self[index], value)
+ }
+
+ /// Swap the elements at indices `i` and `j`.
+ ///
+ /// Time: O(log n)
+ pub fn swap(&mut self, i: usize, j: usize) {
+ swap_indices(self, i, j)
+ }
+
+ /// Push a value to the front of a vector.
+ ///
+ /// Time: O(1)*
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let mut vec = vector![5, 6, 7];
+ /// vec.push_front(4);
+ /// assert_eq!(vector![4, 5, 6, 7], vec);
+ /// ```
+ pub fn push_front(&mut self, value: A) {
+ if self.needs_promotion() {
+ self.promote_back();
+ }
+ match &mut self.vector {
+ Inline(_, chunk) => {
+ chunk.insert(0, value);
+ }
+ Single(pool, chunk) => PoolRef::make_mut(&pool.value_pool, chunk).push_front(value),
+ Full(pool, tree) => tree.push_front(pool, value),
+ }
+ }
+
+ /// Push a value to the back of a vector.
+ ///
+ /// Time: O(1)*
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let mut vec = vector![1, 2, 3];
+ /// vec.push_back(4);
+ /// assert_eq!(vector![1, 2, 3, 4], vec);
+ /// ```
+ pub fn push_back(&mut self, value: A) {
+ if self.needs_promotion() {
+ self.promote_front();
+ }
+ match &mut self.vector {
+ Inline(_, chunk) => {
+ chunk.push(value);
+ }
+ Single(pool, chunk) => PoolRef::make_mut(&pool.value_pool, chunk).push_back(value),
+ Full(pool, tree) => tree.push_back(pool, value),
+ }
+ }
+
+ /// Remove the first element from a vector and return it.
+ ///
+ /// Time: O(1)*
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let mut vec = vector![1, 2, 3];
+ /// assert_eq!(Some(1), vec.pop_front());
+ /// assert_eq!(vector![2, 3], vec);
+ /// ```
+ pub fn pop_front(&mut self) -> Option<A> {
+ if self.is_empty() {
+ None
+ } else {
+ match &mut self.vector {
+ Inline(_, chunk) => chunk.remove(0),
+ Single(pool, chunk) => Some(PoolRef::make_mut(&pool.value_pool, chunk).pop_front()),
+ Full(pool, tree) => tree.pop_front(pool),
+ }
+ }
+ }
+
+ /// Remove the last element from a vector and return it.
+ ///
+ /// Time: O(1)*
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::Vector;
+ /// let mut vec = vector![1, 2, 3];
+ /// assert_eq!(Some(3), vec.pop_back());
+ /// assert_eq!(vector![1, 2], vec);
+ /// ```
+ pub fn pop_back(&mut self) -> Option<A> {
+ if self.is_empty() {
+ None
+ } else {
+ match &mut self.vector {
+ Inline(_, chunk) => chunk.pop(),
+ Single(pool, chunk) => Some(PoolRef::make_mut(&pool.value_pool, chunk).pop_back()),
+ Full(pool, tree) => tree.pop_back(pool),
+ }
+ }
+ }
+
+ /// Append the vector `other` to the end of the current vector.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// let mut vec = vector![1, 2, 3];
+ /// vec.append(vector![7, 8, 9]);
+ /// assert_eq!(vector![1, 2, 3, 7, 8, 9], vec);
+ /// ```
+ pub fn append(&mut self, mut other: Self) {
+ if other.is_empty() {
+ return;
+ }
+
+ if self.is_empty() {
+ *self = other;
+ return;
+ }
+
+ self.promote_inline();
+ other.promote_inline();
+
+ let total_length = self
+ .len()
+ .checked_add(other.len())
+ .expect("Vector length overflow");
+
+ match &mut self.vector {
+ Inline(_, _) => unreachable!("inline vecs should have been promoted"),
+ Single(pool, left) => {
+ match &mut other.vector {
+ Inline(_, _) => unreachable!("inline vecs should have been promoted"),
+ // If both are single chunks and left has room for right: directly
+ // memcpy right into left
+ Single(_, ref mut right) if total_length <= CHUNK_SIZE => {
+ PoolRef::make_mut(&pool.value_pool, left)
+ .append(PoolRef::make_mut(&pool.value_pool, right));
+ return;
+ }
+ // If only left is a single chunk and has room for right: push
+ // right's elements into left
+ _ if total_length <= CHUNK_SIZE => {
+ while let Some(value) = other.pop_front() {
+ PoolRef::make_mut(&pool.value_pool, left).push_back(value);
+ }
+ return;
+ }
+ _ => {}
+ }
+ }
+ Full(pool, left) => {
+ if let Full(_, mut right) = other.vector {
+ // If left and right are trees with empty middles, left has no back
+ // buffers, and right has no front buffers: copy right's back
+ // buffers over to left
+ if left.middle.is_empty()
+ && right.middle.is_empty()
+ && left.outer_b.is_empty()
+ && left.inner_b.is_empty()
+ && right.outer_f.is_empty()
+ && right.inner_f.is_empty()
+ {
+ left.inner_b = right.inner_b;
+ left.outer_b = right.outer_b;
+ left.length = total_length;
+ return;
+ }
+ // If left and right are trees with empty middles and left's buffers
+ // can fit right's buffers: push right's elements onto left
+ if left.middle.is_empty()
+ && right.middle.is_empty()
+ && total_length <= CHUNK_SIZE * 4
+ {
+ while let Some(value) = right.pop_front(pool) {
+ left.push_back(pool, value);
+ }
+ return;
+ }
+ // Both are full and big: do the full RRB join
+ let inner_b1 = left.inner_b.clone();
+ left.push_middle(pool, Side::Right, inner_b1);
+ let outer_b1 = left.outer_b.clone();
+ left.push_middle(pool, Side::Right, outer_b1);
+ let inner_f2 = right.inner_f.clone();
+ right.push_middle(pool, Side::Left, inner_f2);
+ let outer_f2 = right.outer_f.clone();
+ right.push_middle(pool, Side::Left, outer_f2);
+
+ let mut middle1 = clone_ref(replace(&mut left.middle, Ref::from(Node::new())));
+ let mut middle2 = clone_ref(right.middle);
+ let normalised_middle = match left.middle_level.cmp(&right.middle_level) {
+ Ordering::Greater => {
+ middle2 = middle2.elevate(pool, left.middle_level - right.middle_level);
+ left.middle_level
+ }
+ Ordering::Less => {
+ middle1 = middle1.elevate(pool, right.middle_level - left.middle_level);
+ right.middle_level
+ }
+ Ordering::Equal => left.middle_level,
+ };
+ left.middle = Ref::new(Node::merge(pool, middle1, middle2, normalised_middle));
+ left.middle_level = normalised_middle + 1;
+
+ left.inner_b = right.inner_b;
+ left.outer_b = right.outer_b;
+ left.length = total_length;
+ left.prune();
+ return;
+ }
+ }
+ }
+ // No optimisations available, and either left, right or both are
+ // single: promote both to full and retry
+ self.promote_front();
+ other.promote_back();
+ self.append(other)
+ }
+
+ /// Retain only the elements specified by the predicate.
+ ///
+ /// Remove all elements for which the provided function `f`
+ /// returns false from the vector.
+ ///
+ /// Time: O(n)
+ pub fn retain<F>(&mut self, mut f: F)
+ where
+ F: FnMut(&A) -> bool,
+ {
+ let len = self.len();
+ let mut del = 0;
+ {
+ let mut focus = self.focus_mut();
+ for i in 0..len {
+ if !f(focus.index(i)) {
+ del += 1;
+ } else if del > 0 {
+ focus.swap(i - del, i);
+ }
+ }
+ }
+ if del > 0 {
+ self.split_off(len - del);
+ }
+ }
+
+ /// Split a vector at a given index.
+ ///
+ /// Split a vector at a given index, consuming the vector and
+ /// returning a pair of the left hand side and the right hand side
+ /// of the split.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// let mut vec = vector![1, 2, 3, 7, 8, 9];
+ /// let (left, right) = vec.split_at(3);
+ /// assert_eq!(vector![1, 2, 3], left);
+ /// assert_eq!(vector![7, 8, 9], right);
+ /// ```
+ pub fn split_at(mut self, index: usize) -> (Self, Self) {
+ let right = self.split_off(index);
+ (self, right)
+ }
+
+ /// Split a vector at a given index.
+ ///
+ /// Split a vector at a given index, leaving the left hand side in
+ /// the current vector and returning a new vector containing the
+ /// right hand side.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// let mut left = vector![1, 2, 3, 7, 8, 9];
+ /// let right = left.split_off(3);
+ /// assert_eq!(vector![1, 2, 3], left);
+ /// assert_eq!(vector![7, 8, 9], right);
+ /// ```
+ pub fn split_off(&mut self, index: usize) -> Self {
+ assert!(index <= self.len());
+
+ match &mut self.vector {
+ Inline(pool, chunk) => Self {
+ vector: Inline(pool.clone(), chunk.split_off(index)),
+ },
+ Single(pool, chunk) => Self {
+ vector: Single(
+ pool.clone(),
+ PoolRef::new(
+ &pool.value_pool,
+ PoolRef::make_mut(&pool.value_pool, chunk).split_off(index),
+ ),
+ ),
+ },
+ Full(pool, tree) => {
+ let mut local_index = index;
+
+ if local_index < tree.outer_f.len() {
+ let of2 = PoolRef::make_mut(&pool.value_pool, &mut tree.outer_f)
+ .split_off(local_index);
+ let right = Rrb {
+ length: tree.length - index,
+ middle_level: tree.middle_level,
+ outer_f: PoolRef::new(&pool.value_pool, of2),
+ inner_f: replace_pool_def(&pool.value_pool, &mut tree.inner_f),
+ middle: std::mem::take(&mut tree.middle),
+ inner_b: replace_pool_def(&pool.value_pool, &mut tree.inner_b),
+ outer_b: replace_pool_def(&pool.value_pool, &mut tree.outer_b),
+ };
+ tree.length = index;
+ tree.middle_level = 0;
+ return Self {
+ vector: Full(pool.clone(), right),
+ };
+ }
+
+ local_index -= tree.outer_f.len();
+
+ if local_index < tree.inner_f.len() {
+ let if2 = PoolRef::make_mut(&pool.value_pool, &mut tree.inner_f)
+ .split_off(local_index);
+ let right = Rrb {
+ length: tree.length - index,
+ middle_level: tree.middle_level,
+ outer_f: PoolRef::new(&pool.value_pool, if2),
+ inner_f: PoolRef::<Chunk<A>>::default(&pool.value_pool),
+ middle: std::mem::take(&mut tree.middle),
+ inner_b: replace_pool_def(&pool.value_pool, &mut tree.inner_b),
+ outer_b: replace_pool_def(&pool.value_pool, &mut tree.outer_b),
+ };
+ tree.length = index;
+ tree.middle_level = 0;
+ swap(&mut tree.outer_b, &mut tree.inner_f);
+ return Self {
+ vector: Full(pool.clone(), right),
+ };
+ }
+
+ local_index -= tree.inner_f.len();
+
+ if local_index < tree.middle.len() {
+ let mut right_middle = tree.middle.clone();
+ let (c1, c2) = {
+ let m1 = Ref::make_mut(&mut tree.middle);
+ let m2 = Ref::make_mut(&mut right_middle);
+ match m1.split(pool, tree.middle_level, Side::Right, local_index) {
+ SplitResult::Dropped(_) => (),
+ SplitResult::OutOfBounds => unreachable!(),
+ };
+ match m2.split(pool, tree.middle_level, Side::Left, local_index) {
+ SplitResult::Dropped(_) => (),
+ SplitResult::OutOfBounds => unreachable!(),
+ };
+ let c1 = match m1.pop_chunk(pool, tree.middle_level, Side::Right) {
+ PopResult::Empty => PoolRef::default(&pool.value_pool),
+ PopResult::Done(chunk) => chunk,
+ PopResult::Drained(chunk) => {
+ m1.clear_node();
+ chunk
+ }
+ };
+ let c2 = match m2.pop_chunk(pool, tree.middle_level, Side::Left) {
+ PopResult::Empty => PoolRef::default(&pool.value_pool),
+ PopResult::Done(chunk) => chunk,
+ PopResult::Drained(chunk) => {
+ m2.clear_node();
+ chunk
+ }
+ };
+ (c1, c2)
+ };
+ let mut right = Rrb {
+ length: tree.length - index,
+ middle_level: tree.middle_level,
+ outer_f: c2,
+ inner_f: PoolRef::<Chunk<A>>::default(&pool.value_pool),
+ middle: right_middle,
+ inner_b: replace_pool_def(&pool.value_pool, &mut tree.inner_b),
+ outer_b: replace(&mut tree.outer_b, c1),
+ };
+ tree.length = index;
+ tree.prune();
+ right.prune();
+ return Self {
+ vector: Full(pool.clone(), right),
+ };
+ }
+
+ local_index -= tree.middle.len();
+
+ if local_index < tree.inner_b.len() {
+ let ib2 = PoolRef::make_mut(&pool.value_pool, &mut tree.inner_b)
+ .split_off(local_index);
+ let right = Rrb {
+ length: tree.length - index,
+ outer_b: replace_pool_def(&pool.value_pool, &mut tree.outer_b),
+ outer_f: PoolRef::new(&pool.value_pool, ib2),
+ ..Rrb::new(pool)
+ };
+ tree.length = index;
+ swap(&mut tree.outer_b, &mut tree.inner_b);
+ return Self {
+ vector: Full(pool.clone(), right),
+ };
+ }
+
+ local_index -= tree.inner_b.len();
+
+ let ob2 =
+ PoolRef::make_mut(&pool.value_pool, &mut tree.outer_b).split_off(local_index);
+ tree.length = index;
+ Self {
+ vector: Single(pool.clone(), PoolRef::new(&pool.value_pool, ob2)),
+ }
+ }
+ }
+ }
+
+ /// Construct a vector with `count` elements removed from the
+ /// start of the current vector.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn skip(&self, count: usize) -> Self {
+ // FIXME can be made more efficient by dropping the unwanted side without constructing it
+ self.clone().split_off(count)
+ }
+
+ /// Construct a vector of the first `count` elements from the
+ /// current vector.
+ ///
+ /// Time: O(log n)
+ #[must_use]
+ pub fn take(&self, count: usize) -> Self {
+ // FIXME can be made more efficient by dropping the unwanted side without constructing it
+ let mut left = self.clone();
+ left.split_off(count);
+ left
+ }
+
+ /// Truncate a vector to the given size.
+ ///
+ /// Discards all elements in the vector beyond the given length.
+ ///
+ /// Panics if the new length is greater than the current length.
+ ///
+ /// Time: O(log n)
+ pub fn truncate(&mut self, len: usize) {
+ // FIXME can be made more efficient by dropping the unwanted side without constructing it
+ self.split_off(len);
+ }
+
+ /// Extract a slice from a vector.
+ ///
+ /// Remove the elements from `start_index` until `end_index` in
+ /// the current vector and return the removed slice as a new
+ /// vector.
+ ///
+ /// Time: O(log n)
+ pub fn slice<R>(&mut self, range: R) -> Self
+ where
+ R: RangeBounds<usize>,
+ {
+ let r = to_range(&range, self.len());
+ if r.start >= r.end || r.start >= self.len() {
+ return Vector::new();
+ }
+ let mut middle = self.split_off(r.start);
+ let right = middle.split_off(r.end - r.start);
+ self.append(right);
+ middle
+ }
+
+ /// Insert an element into a vector.
+ ///
+ /// Insert an element at position `index`, shifting all elements
+ /// after it to the right.
+ ///
+ /// ## Performance Note
+ ///
+ /// While `push_front` and `push_back` are heavily optimised
+ /// operations, `insert` in the middle of a vector requires a
+ /// split, a push, and an append. Thus, if you want to insert
+ /// many elements at the same location, instead of `insert`ing
+ /// them one by one, you should rather create a new vector
+ /// containing the elements to insert, split the vector at the
+ /// insertion point, and append the left hand, the new vector and
+ /// the right hand in order.
+ ///
+ /// Time: O(log n)
+ pub fn insert(&mut self, index: usize, value: A) {
+ if index == 0 {
+ return self.push_front(value);
+ }
+ if index == self.len() {
+ return self.push_back(value);
+ }
+ assert!(index < self.len());
+ if if let Inline(_, chunk) = &self.vector {
+ chunk.is_full()
+ } else {
+ false
+ } {
+ self.promote_inline();
+ }
+ match &mut self.vector {
+ Inline(_, chunk) => {
+ chunk.insert(index, value);
+ }
+ Single(pool, chunk) if chunk.len() < CHUNK_SIZE => {
+ PoolRef::make_mut(&pool.value_pool, chunk).insert(index, value)
+ }
+ // TODO a lot of optimisations still possible here
+ _ => {
+ let right = self.split_off(index);
+ self.push_back(value);
+ self.append(right);
+ }
+ }
+ }
+
+ /// Remove an element from a vector.
+ ///
+ /// Remove the element from position 'index', shifting all
+ /// elements after it to the left, and return the removed element.
+ ///
+ /// ## Performance Note
+ ///
+ /// While `pop_front` and `pop_back` are heavily optimised
+ /// operations, `remove` in the middle of a vector requires a
+ /// split, a pop, and an append. Thus, if you want to remove many
+ /// elements from the same location, instead of `remove`ing them
+ /// one by one, it is much better to use [`slice`][slice].
+ ///
+ /// Time: O(log n)
+ ///
+ /// [slice]: #method.slice
+ pub fn remove(&mut self, index: usize) -> A {
+ assert!(index < self.len());
+ match &mut self.vector {
+ Inline(_, chunk) => chunk.remove(index).unwrap(),
+ Single(pool, chunk) => PoolRef::make_mut(&pool.value_pool, chunk).remove(index),
+ _ => {
+ if index == 0 {
+ return self.pop_front().unwrap();
+ }
+ if index == self.len() - 1 {
+ return self.pop_back().unwrap();
+ }
+ // TODO a lot of optimisations still possible here
+ let mut right = self.split_off(index);
+ let value = right.pop_front().unwrap();
+ self.append(right);
+ value
+ }
+ }
+ }
+
+ /// Insert an element into a sorted vector.
+ ///
+ /// Insert an element into a vector in sorted order, assuming the vector is
+ /// already in sorted order.
+ ///
+ /// Time: O(log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// let mut vec = vector![1, 2, 3, 7, 8, 9];
+ /// vec.insert_ord(5);
+ /// assert_eq!(vector![1, 2, 3, 5, 7, 8, 9], vec);
+ /// ```
+ pub fn insert_ord(&mut self, item: A)
+ where
+ A: Ord,
+ {
+ match self.binary_search(&item) {
+ Ok(index) => self.insert(index, item),
+ Err(index) => self.insert(index, item),
+ }
+ }
+
+ /// Sort a vector.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// let mut vec = vector![3, 2, 5, 4, 1];
+ /// vec.sort();
+ /// assert_eq!(vector![1, 2, 3, 4, 5], vec);
+ /// ```
+ pub fn sort(&mut self)
+ where
+ A: Ord,
+ {
+ self.sort_by(Ord::cmp)
+ }
+
+ /// Sort a vector using a comparator function.
+ ///
+ /// Time: O(n log n)
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # #[macro_use] extern crate im_rc as im;
+ /// # use im::vector::Vector;
+ /// let mut vec = vector![3, 2, 5, 4, 1];
+ /// vec.sort_by(|left, right| left.cmp(right));
+ /// assert_eq!(vector![1, 2, 3, 4, 5], vec);
+ /// ```
+ pub fn sort_by<F>(&mut self, cmp: F)
+ where
+ F: Fn(&A, &A) -> Ordering,
+ {
+ let len = self.len();
+ if len > 1 {
+ sort::quicksort(self.focus_mut(), &cmp);
+ }
+ }
+
+ /// Verify the internal consistency of a vector.
+ ///
+ /// This method walks the RRB tree making up the current `Vector`
+ /// (if it has one) and verifies that all the invariants hold.
+ /// If something is wrong, it will panic.
+ ///
+ /// This method requires the `debug` feature flag.
+ #[cfg(any(test, feature = "debug"))]
+ pub fn assert_invariants(&self) {
+ if let Full(_, ref tree) = self.vector {
+ tree.assert_invariants();
+ }
+ }
+}
+
+// Implementation details
+
+impl<A: Clone> Rrb<A> {
+ fn new(pool: &RRBPool<A>) -> Self {
+ Rrb {
+ length: 0,
+ middle_level: 0,
+ outer_f: PoolRef::default(&pool.value_pool),
+ inner_f: PoolRef::default(&pool.value_pool),
+ middle: Ref::new(Node::new()),
+ inner_b: PoolRef::default(&pool.value_pool),
+ outer_b: PoolRef::default(&pool.value_pool),
+ }
+ }
+
+ #[cfg(any(test, feature = "debug"))]
+ fn assert_invariants(&self) {
+ let ml = self.middle.assert_invariants(self.middle_level);
+ assert_eq!(
+ self.length,
+ self.outer_f.len() + self.inner_f.len() + ml + self.inner_b.len() + self.outer_b.len()
+ );
+ }
+
+ fn prune(&mut self) {
+ if self.middle.is_empty() {
+ self.middle = Ref::new(Node::new());
+ self.middle_level = 0;
+ } else {
+ while self.middle_level > 0 && self.middle.is_single() {
+ // FIXME could be optimised, cloning the node is expensive
+ self.middle = Ref::new(self.middle.first_child().clone());
+ self.middle_level -= 1;
+ }
+ }
+ }
+
+ fn pop_front(&mut self, pool: &RRBPool<A>) -> Option<A> {
+ if self.length == 0 {
+ return None;
+ }
+ if self.outer_f.is_empty() {
+ if self.inner_f.is_empty() {
+ if self.middle.is_empty() {
+ if self.inner_b.is_empty() {
+ swap(&mut self.outer_f, &mut self.outer_b);
+ } else {
+ swap(&mut self.outer_f, &mut self.inner_b);
+ }
+ } else {
+ self.outer_f = self.pop_middle(pool, Side::Left).unwrap();
+ }
+ } else {
+ swap(&mut self.outer_f, &mut self.inner_f);
+ }
+ }
+ self.length -= 1;
+ let outer_f = PoolRef::make_mut(&pool.value_pool, &mut self.outer_f);
+ Some(outer_f.pop_front())
+ }
+
+ fn pop_back(&mut self, pool: &RRBPool<A>) -> Option<A> {
+ if self.length == 0 {
+ return None;
+ }
+ if self.outer_b.is_empty() {
+ if self.inner_b.is_empty() {
+ if self.middle.is_empty() {
+ if self.inner_f.is_empty() {
+ swap(&mut self.outer_b, &mut self.outer_f);
+ } else {
+ swap(&mut self.outer_b, &mut self.inner_f);
+ }
+ } else {
+ self.outer_b = self.pop_middle(pool, Side::Right).unwrap();
+ }
+ } else {
+ swap(&mut self.outer_b, &mut self.inner_b);
+ }
+ }
+ self.length -= 1;
+ let outer_b = PoolRef::make_mut(&pool.value_pool, &mut self.outer_b);
+ Some(outer_b.pop_back())
+ }
+
+ fn push_front(&mut self, pool: &RRBPool<A>, value: A) {
+ if self.outer_f.is_full() {
+ swap(&mut self.outer_f, &mut self.inner_f);
+ if !self.outer_f.is_empty() {
+ let mut chunk = PoolRef::new(&pool.value_pool, Chunk::new());
+ swap(&mut chunk, &mut self.outer_f);
+ self.push_middle(pool, Side::Left, chunk);
+ }
+ }
+ self.length = self.length.checked_add(1).expect("Vector length overflow");
+ let outer_f = PoolRef::make_mut(&pool.value_pool, &mut self.outer_f);
+ outer_f.push_front(value)
+ }
+
+ fn push_back(&mut self, pool: &RRBPool<A>, value: A) {
+ if self.outer_b.is_full() {
+ swap(&mut self.outer_b, &mut self.inner_b);
+ if !self.outer_b.is_empty() {
+ let mut chunk = PoolRef::new(&pool.value_pool, Chunk::new());
+ swap(&mut chunk, &mut self.outer_b);
+ self.push_middle(pool, Side::Right, chunk);
+ }
+ }
+ self.length = self.length.checked_add(1).expect("Vector length overflow");
+ let outer_b = PoolRef::make_mut(&pool.value_pool, &mut self.outer_b);
+ outer_b.push_back(value)
+ }
+
+ fn push_middle(&mut self, pool: &RRBPool<A>, side: Side, chunk: PoolRef<Chunk<A>>) {
+ if chunk.is_empty() {
+ return;
+ }
+ let new_middle = {
+ let middle = Ref::make_mut(&mut self.middle);
+ match middle.push_chunk(pool, self.middle_level, side, chunk) {
+ PushResult::Done => return,
+ PushResult::Full(chunk, _num_drained) => Ref::from({
+ match side {
+ Side::Left => Node::from_chunk(pool, self.middle_level, chunk)
+ .join_branches(pool, middle.clone(), self.middle_level),
+ Side::Right => middle.clone().join_branches(
+ pool,
+ Node::from_chunk(pool, self.middle_level, chunk),
+ self.middle_level,
+ ),
+ }
+ }),
+ }
+ };
+ self.middle_level += 1;
+ self.middle = new_middle;
+ }
+
+ fn pop_middle(&mut self, pool: &RRBPool<A>, side: Side) -> Option<PoolRef<Chunk<A>>> {
+ let chunk = {
+ let middle = Ref::make_mut(&mut self.middle);
+ match middle.pop_chunk(pool, self.middle_level, side) {
+ PopResult::Empty => return None,
+ PopResult::Done(chunk) => chunk,
+ PopResult::Drained(chunk) => {
+ middle.clear_node();
+ self.middle_level = 0;
+ chunk
+ }
+ }
+ };
+ Some(chunk)
+ }
+}
+
+#[inline]
+fn replace_pool_def<A: PoolDefault>(pool: &Pool<A>, dest: &mut PoolRef<A>) -> PoolRef<A> {
+ replace(dest, PoolRef::default(pool))
+}
+
+// Core traits
+
+impl<A: Clone> Default for Vector<A> {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl<A: Clone> Clone for Vector<A> {
+ /// Clone a vector.
+ ///
+ /// Time: O(1), or O(n) with a very small, bounded *n* for an inline vector.
+ fn clone(&self) -> Self {
+ Self {
+ vector: match &self.vector {
+ Inline(pool, chunk) => Inline(pool.clone(), chunk.clone()),
+ Single(pool, chunk) => Single(pool.clone(), chunk.clone()),
+ Full(pool, tree) => Full(pool.clone(), tree.clone()),
+ },
+ }
+ }
+}
+
+impl<A: Clone + Debug> Debug for Vector<A> {
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ f.debug_list().entries(self.iter()).finish()
+ // match self {
+ // Full(rrb) => {
+ // writeln!(f, "Head: {:?} {:?}", rrb.outer_f, rrb.inner_f)?;
+ // rrb.middle.print(f, 0, rrb.middle_level)?;
+ // writeln!(f, "Tail: {:?} {:?}", rrb.inner_b, rrb.outer_b)
+ // }
+ // Single(_) => write!(f, "nowt"),
+ // }
+ }
+}
+
+#[cfg(not(has_specialisation))]
+impl<A: Clone + PartialEq> PartialEq for Vector<A> {
+ fn eq(&self, other: &Self) -> bool {
+ self.len() == other.len() && self.iter().eq(other.iter())
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<A: Clone + PartialEq> PartialEq for Vector<A> {
+ default fn eq(&self, other: &Self) -> bool {
+ self.len() == other.len() && self.iter().eq(other.iter())
+ }
+}
+
+#[cfg(has_specialisation)]
+impl<A: Clone + Eq> PartialEq for Vector<A> {
+ fn eq(&self, other: &Self) -> bool {
+ fn cmp_chunk<A>(left: &PoolRef<Chunk<A>>, right: &PoolRef<Chunk<A>>) -> bool {
+ (left.is_empty() && right.is_empty()) || PoolRef::ptr_eq(left, right)
+ }
+
+ if std::ptr::eq(self, other) {
+ return true;
+ }
+
+ match (&self.vector, &other.vector) {
+ (Single(_, left), Single(_, right)) => {
+ if cmp_chunk(left, right) {
+ return true;
+ }
+ self.iter().eq(other.iter())
+ }
+ (Full(_, left), Full(_, right)) => {
+ if left.length != right.length {
+ return false;
+ }
+
+ if cmp_chunk(&left.outer_f, &right.outer_f)
+ && cmp_chunk(&left.inner_f, &right.inner_f)
+ && cmp_chunk(&left.inner_b, &right.inner_b)
+ && cmp_chunk(&left.outer_b, &right.outer_b)
+ && ((left.middle.is_empty() && right.middle.is_empty())
+ || Ref::ptr_eq(&left.middle, &right.middle))
+ {
+ return true;
+ }
+ self.iter().eq(other.iter())
+ }
+ _ => self.len() == other.len() && self.iter().eq(other.iter()),
+ }
+ }
+}
+
+impl<A: Clone + Eq> Eq for Vector<A> {}
+
+impl<A: Clone + PartialOrd> PartialOrd for Vector<A> {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ self.iter().partial_cmp(other.iter())
+ }
+}
+
+impl<A: Clone + Ord> Ord for Vector<A> {
+ fn cmp(&self, other: &Self) -> Ordering {
+ self.iter().cmp(other.iter())
+ }
+}
+
+impl<A: Clone + Hash> Hash for Vector<A> {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ for i in self {
+ i.hash(state)
+ }
+ }
+}
+
+impl<A: Clone> Sum for Vector<A> {
+ fn sum<I>(it: I) -> Self
+ where
+ I: Iterator<Item = Self>,
+ {
+ it.fold(Self::new(), |a, b| a + b)
+ }
+}
+
+impl<A: Clone> Add for Vector<A> {
+ type Output = Vector<A>;
+
+ /// Concatenate two vectors.
+ ///
+ /// Time: O(log n)
+ fn add(mut self, other: Self) -> Self::Output {
+ self.append(other);
+ self
+ }
+}
+
+impl<'a, A: Clone> Add for &'a Vector<A> {
+ type Output = Vector<A>;
+
+ /// Concatenate two vectors.
+ ///
+ /// Time: O(log n)
+ fn add(self, other: Self) -> Self::Output {
+ let mut out = self.clone();
+ out.append(other.clone());
+ out
+ }
+}
+
+impl<A: Clone> Extend<A> for Vector<A> {
+ /// Add values to the end of a vector by consuming an iterator.
+ ///
+ /// Time: O(n)
+ fn extend<I>(&mut self, iter: I)
+ where
+ I: IntoIterator<Item = A>,
+ {
+ for item in iter {
+ self.push_back(item)
+ }
+ }
+}
+
+impl<A: Clone> Index<usize> for Vector<A> {
+ type Output = A;
+ /// Get a reference to the value at index `index` in the vector.
+ ///
+ /// Time: O(log n)
+ fn index(&self, index: usize) -> &Self::Output {
+ match self.get(index) {
+ Some(value) => value,
+ None => panic!(
+ "Vector::index: index out of bounds: {} < {}",
+ index,
+ self.len()
+ ),
+ }
+ }
+}
+
+impl<A: Clone> IndexMut<usize> for Vector<A> {
+ /// Get a mutable reference to the value at index `index` in the
+ /// vector.
+ ///
+ /// Time: O(log n)
+ fn index_mut(&mut self, index: usize) -> &mut Self::Output {
+ match self.get_mut(index) {
+ Some(value) => value,
+ None => panic!("Vector::index_mut: index out of bounds"),
+ }
+ }
+}
+
+// Conversions
+
+impl<'a, A: Clone> IntoIterator for &'a Vector<A> {
+ type Item = &'a A;
+ type IntoIter = Iter<'a, A>;
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
+impl<A: Clone> IntoIterator for Vector<A> {
+ type Item = A;
+ type IntoIter = ConsumingIter<A>;
+ fn into_iter(self) -> Self::IntoIter {
+ ConsumingIter::new(self)
+ }
+}
+
+impl<A: Clone> FromIterator<A> for Vector<A> {
+ /// Create a vector from an iterator.
+ ///
+ /// Time: O(n)
+ fn from_iter<I>(iter: I) -> Self
+ where
+ I: IntoIterator<Item = A>,
+ {
+ let mut seq = Self::new();
+ for item in iter {
+ seq.push_back(item)
+ }
+ seq
+ }
+}
+
+impl<'s, 'a, A, OA> From<&'s Vector<&'a A>> for Vector<OA>
+where
+ A: ToOwned<Owned = OA>,
+ OA: Borrow<A> + Clone,
+{
+ fn from(vec: &Vector<&A>) -> Self {
+ vec.iter().map(|a| (*a).to_owned()).collect()
+ }
+}
+
+impl<'a, A: Clone> From<&'a [A]> for Vector<A> {
+ fn from(slice: &[A]) -> Self {
+ slice.iter().cloned().collect()
+ }
+}
+
+impl<A: Clone> From<Vec<A>> for Vector<A> {
+ /// Create a vector from a [`std::vec::Vec`][vec].
+ ///
+ /// Time: O(n)
+ ///
+ /// [vec]: https://doc.rust-lang.org/std/vec/struct.Vec.html
+ fn from(vec: Vec<A>) -> Self {
+ vec.into_iter().collect()
+ }
+}
+
+impl<'a, A: Clone> From<&'a Vec<A>> for Vector<A> {
+ /// Create a vector from a [`std::vec::Vec`][vec].
+ ///
+ /// Time: O(n)
+ ///
+ /// [vec]: https://doc.rust-lang.org/std/vec/struct.Vec.html
+ fn from(vec: &Vec<A>) -> Self {
+ vec.iter().cloned().collect()
+ }
+}
+
+// Iterators
+
+/// An iterator over vectors with values of type `A`.
+///
+/// To obtain one, use [`Vector::iter()`][iter].
+///
+/// [iter]: enum.Vector.html#method.iter
+pub struct Iter<'a, A> {
+ focus: Focus<'a, A>,
+ front_index: usize,
+ back_index: usize,
+}
+
+impl<'a, A: Clone> Iter<'a, A> {
+ fn new(seq: &'a Vector<A>) -> Self {
+ Iter {
+ focus: seq.focus(),
+ front_index: 0,
+ back_index: seq.len(),
+ }
+ }
+
+ fn from_focus(focus: Focus<'a, A>) -> Self {
+ Iter {
+ front_index: 0,
+ back_index: focus.len(),
+ focus,
+ }
+ }
+}
+
+impl<'a, A: Clone> Iterator for Iter<'a, A> {
+ type Item = &'a A;
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.front_index >= self.back_index {
+ return None;
+ }
+ #[allow(unsafe_code)]
+ let focus: &'a mut Focus<'a, A> = unsafe { &mut *(&mut self.focus as *mut _) };
+ let value = focus.get(self.front_index);
+ self.front_index += 1;
+ value
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ let remaining = self.back_index - self.front_index;
+ (remaining, Some(remaining))
+ }
+}
+
+impl<'a, A: Clone> DoubleEndedIterator for Iter<'a, A> {
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next_back(&mut self) -> Option<Self::Item> {
+ if self.front_index >= self.back_index {
+ return None;
+ }
+ self.back_index -= 1;
+ #[allow(unsafe_code)]
+ let focus: &'a mut Focus<'a, A> = unsafe { &mut *(&mut self.focus as *mut _) };
+ focus.get(self.back_index)
+ }
+}
+
+impl<'a, A: Clone> ExactSizeIterator for Iter<'a, A> {}
+
+impl<'a, A: Clone> FusedIterator for Iter<'a, A> {}
+
+/// A mutable iterator over vectors with values of type `A`.
+///
+/// To obtain one, use [`Vector::iter_mut()`][iter_mut].
+///
+/// [iter_mut]: enum.Vector.html#method.iter_mut
+pub struct IterMut<'a, A> {
+ focus: FocusMut<'a, A>,
+ front_index: usize,
+ back_index: usize,
+}
+
+impl<'a, A> IterMut<'a, A>
+where
+ A: Clone,
+{
+ fn new(seq: &'a mut Vector<A>) -> Self {
+ let focus = seq.focus_mut();
+ let len = focus.len();
+ IterMut {
+ focus,
+ front_index: 0,
+ back_index: len,
+ }
+ }
+
+ fn from_focus(focus: FocusMut<'a, A>) -> Self {
+ IterMut {
+ front_index: 0,
+ back_index: focus.len(),
+ focus,
+ }
+ }
+}
+
+impl<'a, A> Iterator for IterMut<'a, A>
+where
+ A: 'a + Clone,
+{
+ type Item = &'a mut A;
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.front_index >= self.back_index {
+ return None;
+ }
+ #[allow(unsafe_code)]
+ let focus: &'a mut FocusMut<'a, A> = unsafe { &mut *(&mut self.focus as *mut _) };
+ let value = focus.get_mut(self.front_index);
+ self.front_index += 1;
+ value
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ let remaining = self.back_index - self.front_index;
+ (remaining, Some(remaining))
+ }
+}
+
+impl<'a, A> DoubleEndedIterator for IterMut<'a, A>
+where
+ A: 'a + Clone,
+{
+ /// Remove and return an element from the back of the iterator.
+ ///
+ /// Time: O(1)*
+ fn next_back(&mut self) -> Option<Self::Item> {
+ if self.front_index >= self.back_index {
+ return None;
+ }
+ self.back_index -= 1;
+ #[allow(unsafe_code)]
+ let focus: &'a mut FocusMut<'a, A> = unsafe { &mut *(&mut self.focus as *mut _) };
+ focus.get_mut(self.back_index)
+ }
+}
+
+impl<'a, A: Clone> ExactSizeIterator for IterMut<'a, A> {}
+
+impl<'a, A: Clone> FusedIterator for IterMut<'a, A> {}
+
+/// A consuming iterator over vectors with values of type `A`.
+pub struct ConsumingIter<A> {
+ vector: Vector<A>,
+}
+
+impl<A: Clone> ConsumingIter<A> {
+ fn new(vector: Vector<A>) -> Self {
+ Self { vector }
+ }
+}
+
+impl<A: Clone> Iterator for ConsumingIter<A> {
+ type Item = A;
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ self.vector.pop_front()
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ let len = self.vector.len();
+ (len, Some(len))
+ }
+}
+
+impl<A: Clone> DoubleEndedIterator for ConsumingIter<A> {
+ /// Remove and return an element from the back of the iterator.
+ ///
+ /// Time: O(1)*
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.vector.pop_back()
+ }
+}
+
+impl<A: Clone> ExactSizeIterator for ConsumingIter<A> {}
+
+impl<A: Clone> FusedIterator for ConsumingIter<A> {}
+
+/// An iterator over the leaf nodes of a vector.
+///
+/// To obtain one, use [`Vector::chunks()`][chunks].
+///
+/// [chunks]: enum.Vector.html#method.chunks
+pub struct Chunks<'a, A> {
+ focus: Focus<'a, A>,
+ front_index: usize,
+ back_index: usize,
+}
+
+impl<'a, A: Clone> Chunks<'a, A> {
+ fn new(seq: &'a Vector<A>) -> Self {
+ Chunks {
+ focus: seq.focus(),
+ front_index: 0,
+ back_index: seq.len(),
+ }
+ }
+}
+
+impl<'a, A: Clone> Iterator for Chunks<'a, A> {
+ type Item = &'a [A];
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.front_index >= self.back_index {
+ return None;
+ }
+ #[allow(unsafe_code)]
+ let focus: &'a mut Focus<'a, A> = unsafe { &mut *(&mut self.focus as *mut _) };
+ let (range, value) = focus.chunk_at(self.front_index);
+ self.front_index = range.end;
+ Some(value)
+ }
+}
+
+impl<'a, A: Clone> DoubleEndedIterator for Chunks<'a, A> {
+ /// Remove and return an element from the back of the iterator.
+ ///
+ /// Time: O(1)*
+ fn next_back(&mut self) -> Option<Self::Item> {
+ if self.front_index >= self.back_index {
+ return None;
+ }
+ self.back_index -= 1;
+ #[allow(unsafe_code)]
+ let focus: &'a mut Focus<'a, A> = unsafe { &mut *(&mut self.focus as *mut _) };
+ let (range, value) = focus.chunk_at(self.back_index);
+ self.back_index = range.start;
+ Some(value)
+ }
+}
+
+impl<'a, A: Clone> FusedIterator for Chunks<'a, A> {}
+
+/// A mutable iterator over the leaf nodes of a vector.
+///
+/// To obtain one, use [`Vector::chunks_mut()`][chunks_mut].
+///
+/// [chunks_mut]: enum.Vector.html#method.chunks_mut
+pub struct ChunksMut<'a, A> {
+ focus: FocusMut<'a, A>,
+ front_index: usize,
+ back_index: usize,
+}
+
+impl<'a, A: Clone> ChunksMut<'a, A> {
+ fn new(seq: &'a mut Vector<A>) -> Self {
+ let len = seq.len();
+ ChunksMut {
+ focus: seq.focus_mut(),
+ front_index: 0,
+ back_index: len,
+ }
+ }
+}
+
+impl<'a, A: Clone> Iterator for ChunksMut<'a, A> {
+ type Item = &'a mut [A];
+
+ /// Advance the iterator and return the next value.
+ ///
+ /// Time: O(1)*
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.front_index >= self.back_index {
+ return None;
+ }
+ #[allow(unsafe_code)]
+ let focus: &'a mut FocusMut<'a, A> = unsafe { &mut *(&mut self.focus as *mut _) };
+ let (range, value) = focus.chunk_at(self.front_index);
+ self.front_index = range.end;
+ Some(value)
+ }
+}
+
+impl<'a, A: Clone> DoubleEndedIterator for ChunksMut<'a, A> {
+ /// Remove and return an element from the back of the iterator.
+ ///
+ /// Time: O(1)*
+ fn next_back(&mut self) -> Option<Self::Item> {
+ if self.front_index >= self.back_index {
+ return None;
+ }
+ self.back_index -= 1;
+ #[allow(unsafe_code)]
+ let focus: &'a mut FocusMut<'a, A> = unsafe { &mut *(&mut self.focus as *mut _) };
+ let (range, value) = focus.chunk_at(self.back_index);
+ self.back_index = range.start;
+ Some(value)
+ }
+}
+
+impl<'a, A: Clone> FusedIterator for ChunksMut<'a, A> {}
+
+// Proptest
+#[cfg(any(test, feature = "proptest"))]
+#[doc(hidden)]
+pub mod proptest {
+ #[deprecated(
+ since = "14.3.0",
+ note = "proptest strategies have moved to im::proptest"
+ )]
+ pub use crate::proptest::vector;
+}
+
+// Tests
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ use crate::proptest::vector;
+ use ::proptest::collection::vec;
+ use ::proptest::num::{i32, usize};
+ use ::proptest::proptest;
+
+ #[test]
+ fn macro_allows_trailing_comma() {
+ let vec1 = vector![1, 2, 3];
+ let vec2 = vector![1, 2, 3,];
+ assert_eq!(vec1, vec2);
+ }
+
+ #[test]
+ fn indexing() {
+ let mut vec = vector![0, 1, 2, 3, 4, 5];
+ vec.push_front(0);
+ assert_eq!(0, *vec.get(0).unwrap());
+ assert_eq!(0, vec[0]);
+ }
+
+ #[test]
+ fn large_vector_focus() {
+ let input = (0..100_000).collect::<Vector<_>>();
+ let vec = input.clone();
+ let mut sum: i64 = 0;
+ let mut focus = vec.focus();
+ for i in 0..input.len() {
+ sum += *focus.index(i);
+ }
+ let expected: i64 = (0..100_000).sum();
+ assert_eq!(expected, sum);
+ }
+
+ #[test]
+ fn large_vector_focus_mut() {
+ let input = (0..100_000).collect::<Vector<_>>();
+ let mut vec = input.clone();
+ {
+ let mut focus = vec.focus_mut();
+ for i in 0..input.len() {
+ let p = focus.index_mut(i);
+ *p += 1;
+ }
+ }
+ let expected: Vector<i32> = input.into_iter().map(|i| i + 1).collect();
+ assert_eq!(expected, vec);
+ }
+
+ #[test]
+ fn issue_55_fwd() {
+ let mut l = Vector::new();
+ for i in 0..4098 {
+ l.append(Vector::unit(i));
+ }
+ l.append(Vector::unit(4098));
+ assert_eq!(Some(&4097), l.get(4097));
+ assert_eq!(Some(&4096), l.get(4096));
+ }
+
+ #[test]
+ fn issue_55_back() {
+ let mut l = Vector::unit(0);
+ for i in 0..4099 {
+ let mut tmp = Vector::unit(i + 1);
+ tmp.append(l);
+ l = tmp;
+ }
+ assert_eq!(Some(&4098), l.get(1));
+ assert_eq!(Some(&4097), l.get(2));
+ let len = l.len();
+ l.slice(2..len);
+ }
+
+ #[test]
+ fn issue_55_append() {
+ let mut vec1 = (0..92).collect::<Vector<_>>();
+ let vec2 = (0..165).collect::<Vector<_>>();
+ vec1.append(vec2);
+ }
+
+ #[test]
+ fn issue_70() {
+ let mut x = Vector::new();
+ for _ in 0..262 {
+ x.push_back(0);
+ }
+ for _ in 0..97 {
+ x.pop_front();
+ }
+ for &offset in &[160, 163, 160] {
+ x.remove(offset);
+ }
+ for _ in 0..64 {
+ x.push_back(0);
+ }
+ // At this point middle contains three chunks of size 64, 64 and 1
+ // respectively. Previously the next `push_back()` would append another
+ // zero-sized chunk to middle even though there is enough space left.
+ match x.vector {
+ VectorInner::Full(_, ref tree) => {
+ assert_eq!(129, tree.middle.len());
+ assert_eq!(3, tree.middle.number_of_children());
+ }
+ _ => unreachable!(),
+ }
+ x.push_back(0);
+ match x.vector {
+ VectorInner::Full(_, ref tree) => {
+ assert_eq!(131, tree.middle.len());
+ assert_eq!(3, tree.middle.number_of_children())
+ }
+ _ => unreachable!(),
+ }
+ for _ in 0..64 {
+ x.push_back(0);
+ }
+ for _ in x.iter() {}
+ }
+
+ #[test]
+ fn issue_67() {
+ let mut l = Vector::unit(4100);
+ for i in (0..4099).rev() {
+ let mut tmp = Vector::unit(i);
+ tmp.append(l);
+ l = tmp;
+ }
+ assert_eq!(4100, l.len());
+ let len = l.len();
+ let tail = l.slice(1..len);
+ assert_eq!(1, l.len());
+ assert_eq!(4099, tail.len());
+ assert_eq!(Some(&0), l.get(0));
+ assert_eq!(Some(&1), tail.get(0));
+ }
+
+ #[test]
+ fn issue_74_simple_size() {
+ use crate::nodes::rrb::NODE_SIZE;
+ let mut x = Vector::new();
+ for _ in 0..(CHUNK_SIZE
+ * (
+ 1 // inner_f
+ + (2 * NODE_SIZE) // middle: two full Entry::Nodes (4096 elements each)
+ + 1 // inner_b
+ + 1
+ // outer_b
+ ))
+ {
+ x.push_back(0u32);
+ }
+ let middle_first_node_start = CHUNK_SIZE;
+ let middle_second_node_start = middle_first_node_start + NODE_SIZE * CHUNK_SIZE;
+ // This reduces the size of the second node to 4095.
+ x.remove(middle_second_node_start);
+ // As outer_b is full, this will cause inner_b (length 64) to be pushed
+ // to middle. The first element will be merged into the second node, the
+ // remaining 63 elements will end up in a new node.
+ x.push_back(0u32);
+ match x.vector {
+ VectorInner::Full(_, tree) => {
+ assert_eq!(3, tree.middle.number_of_children());
+ assert_eq!(
+ 2 * NODE_SIZE * CHUNK_SIZE + CHUNK_SIZE - 1,
+ tree.middle.len()
+ );
+ }
+ _ => unreachable!(),
+ }
+ }
+
+ #[test]
+ fn issue_77() {
+ let mut x = Vector::new();
+ for _ in 0..44 {
+ x.push_back(0);
+ }
+ for _ in 0..20 {
+ x.insert(0, 0);
+ }
+ x.insert(1, 0);
+ for _ in 0..441 {
+ x.push_back(0);
+ }
+ for _ in 0..58 {
+ x.insert(0, 0);
+ }
+ x.insert(514, 0);
+ for _ in 0..73 {
+ x.push_back(0);
+ }
+ for _ in 0..10 {
+ x.insert(0, 0);
+ }
+ x.insert(514, 0);
+ }
+
+ #[test]
+ fn issue_105() {
+ let mut v = Vector::new();
+
+ for i in 0..270_000 {
+ v.push_front(i);
+ }
+
+ while !v.is_empty() {
+ v = v.take(v.len() - 1);
+ }
+ }
+
+ #[test]
+ fn issue_107_split_off_causes_overflow() {
+ let mut vec = (0..4289).collect::<Vector<_>>();
+ let mut control = (0..4289).collect::<Vec<_>>();
+ let chunk = 64;
+
+ while vec.len() >= chunk {
+ vec = vec.split_off(chunk);
+ control = control.split_off(chunk);
+ assert_eq!(vec.len(), control.len());
+ assert_eq!(control, vec.iter().cloned().collect::<Vec<_>>());
+ }
+ }
+
+ #[test]
+ fn collect_crash() {
+ let _vector: Vector<i32> = (0..5953).collect();
+ // let _vector: Vector<i32> = (0..16384).collect();
+ }
+
+ #[test]
+ fn issue_116() {
+ let vec = (0..300).collect::<Vector<_>>();
+ let rev_vec: Vector<u32> = vec.clone().into_iter().rev().collect();
+ assert_eq!(vec.len(), rev_vec.len());
+ }
+
+ #[test]
+ fn issue_131() {
+ let smol = std::iter::repeat(42).take(64).collect::<Vector<_>>();
+ let mut smol2 = smol.clone();
+ assert!(smol.ptr_eq(&smol2));
+ smol2.set(63, 420);
+ assert!(!smol.ptr_eq(&smol2));
+
+ let huge = std::iter::repeat(42).take(65).collect::<Vector<_>>();
+ let mut huge2 = huge.clone();
+ assert!(huge.ptr_eq(&huge2));
+ huge2.set(63, 420);
+ assert!(!huge.ptr_eq(&huge2));
+ }
+
+ #[test]
+ fn ptr_eq() {
+ for len in 32..256 {
+ let input = std::iter::repeat(42).take(len).collect::<Vector<_>>();
+ let mut inp2 = input.clone();
+ assert!(input.ptr_eq(&inp2));
+ inp2.set(len - 1, 98);
+ assert_ne!(inp2.get(len - 1), input.get(len - 1));
+ assert!(!input.ptr_eq(&inp2));
+ }
+ }
+
+ proptest! {
+ #[test]
+ fn iter(ref vec in vec(i32::ANY, 0..1000)) {
+ let seq: Vector<i32> = vec.iter().cloned().collect::<Vector<_>>();
+ for (index, item) in seq.iter().enumerate() {
+ assert_eq!(&vec[index], item);
+ }
+ assert_eq!(vec.len(), seq.len());
+ }
+
+ #[test]
+ fn push_front_mut(ref input in vec(i32::ANY, 0..1000)) {
+ let mut vector = Vector::new();
+ for (count, value) in input.iter().cloned().enumerate() {
+ assert_eq!(count, vector.len());
+ vector.push_front(value);
+ assert_eq!(count + 1, vector.len());
+ }
+ let input2 = input.iter().rev().cloned().collect::<Vec<_>>();
+ assert_eq!(input2, vector.iter().cloned().collect::<Vec<_>>());
+ }
+
+ #[test]
+ fn push_back_mut(ref input in vec(i32::ANY, 0..1000)) {
+ let mut vector = Vector::new();
+ for (count, value) in input.iter().cloned().enumerate() {
+ assert_eq!(count, vector.len());
+ vector.push_back(value);
+ assert_eq!(count + 1, vector.len());
+ }
+ assert_eq!(input, &vector.iter().cloned().collect::<Vec<_>>());
+ }
+
+ #[test]
+ fn pop_back_mut(ref input in vec(i32::ANY, 0..1000)) {
+ let mut vector = input.iter().cloned().collect::<Vector<_>>();
+ assert_eq!(input.len(), vector.len());
+ for (index, value) in input.iter().cloned().enumerate().rev() {
+ match vector.pop_back() {
+ None => panic!("vector emptied unexpectedly"),
+ Some(item) => {
+ assert_eq!(index, vector.len());
+ assert_eq!(value, item);
+ }
+ }
+ }
+ assert_eq!(0, vector.len());
+ }
+
+ #[test]
+ fn pop_front_mut(ref input in vec(i32::ANY, 0..1000)) {
+ let mut vector = input.iter().cloned().collect::<Vector<_>>();
+ assert_eq!(input.len(), vector.len());
+ for (index, value) in input.iter().cloned().rev().enumerate().rev() {
+ match vector.pop_front() {
+ None => panic!("vector emptied unexpectedly"),
+ Some(item) => {
+ assert_eq!(index, vector.len());
+ assert_eq!(value, item);
+ }
+ }
+ }
+ assert_eq!(0, vector.len());
+ }
+
+ // #[test]
+ // fn push_and_pop(ref input in vec(i32::ANY, 0..1000)) {
+ // let mut vector = Vector::new();
+ // for (count, value) in input.iter().cloned().enumerate() {
+ // assert_eq!(count, vector.len());
+ // vector.push_back(value);
+ // assert_eq!(count + 1, vector.len());
+ // }
+ // for (index, value) in input.iter().cloned().rev().enumerate().rev() {
+ // match vector.pop_front() {
+ // None => panic!("vector emptied unexpectedly"),
+ // Some(item) => {
+ // assert_eq!(index, vector.len());
+ // assert_eq!(value, item);
+ // }
+ // }
+ // }
+ // assert_eq!(true, vector.is_empty());
+ // }
+
+ #[test]
+ fn split(ref vec in vec(i32::ANY, 1..2000), split_pos in usize::ANY) {
+ let split_index = split_pos % (vec.len() + 1);
+ let mut left = vec.iter().cloned().collect::<Vector<_>>();
+ let right = left.split_off(split_index);
+ assert_eq!(left.len(), split_index);
+ assert_eq!(right.len(), vec.len() - split_index);
+ for (index, item) in left.iter().enumerate() {
+ assert_eq!(& vec[index], item);
+ }
+ for (index, item) in right.iter().enumerate() {
+ assert_eq!(&vec[split_index + index], item);
+ }
+ }
+
+ #[test]
+ fn append(ref vec1 in vec(i32::ANY, 0..1000), ref vec2 in vec(i32::ANY, 0..1000)) {
+ let mut seq1 = vec1.iter().cloned().collect::<Vector<_>>();
+ let seq2 = vec2.iter().cloned().collect::<Vector<_>>();
+ assert_eq!(seq1.len(), vec1.len());
+ assert_eq!(seq2.len(), vec2.len());
+ seq1.append(seq2);
+ let mut vec = vec1.clone();
+ vec.extend(vec2);
+ assert_eq!(seq1.len(), vec.len());
+ for (index, item) in seq1.into_iter().enumerate() {
+ assert_eq!(vec[index], item);
+ }
+ }
+
+ #[test]
+ fn iter_mut(ref input in vector(i32::ANY, 0..10000)) {
+ let mut vec = input.clone();
+ {
+ for p in vec.iter_mut() {
+ *p = p.overflowing_add(1).0;
+ }
+ }
+ let expected: Vector<i32> = input.clone().into_iter().map(|i| i.overflowing_add(1).0).collect();
+ assert_eq!(expected, vec);
+ }
+
+ #[test]
+ fn focus(ref input in vector(i32::ANY, 0..10000)) {
+ let mut vec = input.clone();
+ {
+ let mut focus = vec.focus_mut();
+ for i in 0..input.len() {
+ let p = focus.index_mut(i);
+ *p = p.overflowing_add(1).0;
+ }
+ }
+ let expected: Vector<i32> = input.clone().into_iter().map(|i| i.overflowing_add(1).0).collect();
+ assert_eq!(expected, vec);
+ }
+
+ #[test]
+ fn focus_mut_split(ref input in vector(i32::ANY, 0..10000)) {
+ let mut vec = input.clone();
+
+ fn split_down(focus: FocusMut<'_, i32>) {
+ let len = focus.len();
+ if len < 8 {
+ for p in focus {
+ *p = p.overflowing_add(1).0;
+ }
+ } else {
+ let (left, right) = focus.split_at(len / 2);
+ split_down(left);
+ split_down(right);
+ }
+ }
+
+ split_down(vec.focus_mut());
+
+ let expected: Vector<i32> = input.clone().into_iter().map(|i| i.overflowing_add(1).0).collect();
+ assert_eq!(expected, vec);
+ }
+
+ #[test]
+ fn chunks(ref input in vector(i32::ANY, 0..10000)) {
+ let output: Vector<_> = input.leaves().flatten().cloned().collect();
+ assert_eq!(input, &output);
+ let rev_in: Vector<_> = input.iter().rev().cloned().collect();
+ let rev_out: Vector<_> = input.leaves().rev().map(|c| c.iter().rev()).flatten().cloned().collect();
+ assert_eq!(rev_in, rev_out);
+ }
+
+ #[test]
+ fn chunks_mut(ref mut input_src in vector(i32::ANY, 0..10000)) {
+ let mut input = input_src.clone();
+ #[allow(clippy::map_clone)]
+ let output: Vector<_> = input.leaves_mut().flatten().map(|v| *v).collect();
+ assert_eq!(input, output);
+ let rev_in: Vector<_> = input.iter().rev().cloned().collect();
+ let rev_out: Vector<_> = input.leaves_mut().rev().map(|c| c.iter().rev()).flatten().cloned().collect();
+ assert_eq!(rev_in, rev_out);
+ }
+
+ // The following two tests are very slow and there are unit tests above
+ // which test for regression of issue #55. It would still be good to
+ // run them occasionally.
+
+ // #[test]
+ // fn issue55_back(count in 0..10000, slice_at in usize::ANY) {
+ // let count = count as usize;
+ // let slice_at = slice_at % count;
+ // let mut l = Vector::unit(0);
+ // for _ in 0..count {
+ // let mut tmp = Vector::unit(0);
+ // tmp.append(l);
+ // l = tmp;
+ // }
+ // let len = l.len();
+ // l.slice(slice_at..len);
+ // }
+
+ // #[test]
+ // fn issue55_fwd(count in 0..10000, slice_at in usize::ANY) {
+ // let count = count as usize;
+ // let slice_at = slice_at % count;
+ // let mut l = Vector::new();
+ // for i in 0..count {
+ // l.append(Vector::unit(i));
+ // }
+ // assert_eq!(Some(&slice_at), l.get(slice_at));
+ // }
+ }
+}
diff --git a/vendor/im-rc/src/vector/pool.rs b/vendor/im-rc/src/vector/pool.rs
new file mode 100644
index 0000000..4d4edae
--- /dev/null
+++ b/vendor/im-rc/src/vector/pool.rs
@@ -0,0 +1,74 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use crate::config::POOL_SIZE;
+use crate::nodes::chunk::Chunk;
+use crate::nodes::rrb::Node;
+use crate::util::Pool;
+
+/// A memory pool for `Vector`.
+pub struct RRBPool<A> {
+ pub(crate) node_pool: Pool<Chunk<Node<A>>>,
+ pub(crate) value_pool: Pool<Chunk<A>>,
+ pub(crate) size_pool: Pool<Chunk<usize>>,
+}
+
+impl<A> RRBPool<A> {
+ /// Create a new memory pool with the given size.
+ pub fn new(size: usize) -> Self {
+ Self::with_sizes(size, size, size)
+ }
+
+ /// Create a new memory pool with the given sizes for each subpool.
+ pub fn with_sizes(
+ node_pool_size: usize,
+ leaf_pool_size: usize,
+ size_table_pool_size: usize,
+ ) -> Self {
+ Self {
+ node_pool: Pool::new(node_pool_size),
+ value_pool: Pool::new(leaf_pool_size),
+ size_pool: Pool::new(size_table_pool_size),
+ }
+ }
+
+ /// Fill the memory pool with preallocated chunks.
+ pub fn fill(&self) {
+ self.node_pool.fill();
+ self.value_pool.fill();
+ self.size_pool.fill();
+ }
+
+ /// Get the size of the node subpool.
+ pub fn node_pool_size(&self) -> usize {
+ self.node_pool.get_pool_size()
+ }
+
+ /// Get the size of the leaf node subpool.
+ pub fn leaf_pool_size(&self) -> usize {
+ self.value_pool.get_pool_size()
+ }
+
+ /// Get the size of the size table subpool.
+ pub fn size_table_pool_size(&self) -> usize {
+ self.size_pool.get_pool_size()
+ }
+}
+
+impl<A> Default for RRBPool<A> {
+ /// Construct a pool with a reasonable default pool size.
+ fn default() -> Self {
+ Self::new(POOL_SIZE)
+ }
+}
+
+impl<A> Clone for RRBPool<A> {
+ fn clone(&self) -> Self {
+ Self {
+ node_pool: self.node_pool.clone(),
+ value_pool: self.value_pool.clone(),
+ size_pool: self.size_pool.clone(),
+ }
+ }
+}
diff --git a/vendor/im-rc/src/vector/rayon.rs b/vendor/im-rc/src/vector/rayon.rs
new file mode 100644
index 0000000..054620d
--- /dev/null
+++ b/vendor/im-rc/src/vector/rayon.rs
@@ -0,0 +1,209 @@
+//! Parallel iterators.
+//!
+//! These are only available when using the `rayon` feature flag.
+
+use super::*;
+use ::rayon::iter::plumbing::{bridge, Consumer, Producer, ProducerCallback, UnindexedConsumer};
+use ::rayon::iter::{
+ IndexedParallelIterator, IntoParallelRefIterator, IntoParallelRefMutIterator, ParallelIterator,
+};
+
+impl<'a, A> IntoParallelRefIterator<'a> for Vector<A>
+where
+ A: Clone + Send + Sync + 'a,
+{
+ type Item = &'a A;
+ type Iter = ParIter<'a, A>;
+
+ fn par_iter(&'a self) -> Self::Iter {
+ ParIter {
+ focus: self.focus(),
+ }
+ }
+}
+
+impl<'a, A> IntoParallelRefMutIterator<'a> for Vector<A>
+where
+ A: Clone + Send + Sync + 'a,
+{
+ type Item = &'a mut A;
+ type Iter = ParIterMut<'a, A>;
+
+ fn par_iter_mut(&'a mut self) -> Self::Iter {
+ ParIterMut {
+ focus: self.focus_mut(),
+ }
+ }
+}
+
+/// A parallel iterator for [`Vector`][Vector].
+///
+/// [Vector]: ../struct.Vector.html
+pub struct ParIter<'a, A>
+where
+ A: Clone + Send + Sync,
+{
+ focus: Focus<'a, A>,
+}
+
+impl<'a, A> ParallelIterator for ParIter<'a, A>
+where
+ A: Clone + Send + Sync + 'a,
+{
+ type Item = &'a A;
+
+ fn drive_unindexed<C>(self, consumer: C) -> C::Result
+ where
+ C: UnindexedConsumer<Self::Item>,
+ {
+ bridge(self, consumer)
+ }
+}
+
+impl<'a, A> IndexedParallelIterator for ParIter<'a, A>
+where
+ A: Clone + Send + Sync + 'a,
+{
+ fn drive<C>(self, consumer: C) -> C::Result
+ where
+ C: Consumer<Self::Item>,
+ {
+ bridge(self, consumer)
+ }
+
+ fn len(&self) -> usize {
+ self.focus.len()
+ }
+
+ fn with_producer<CB>(self, callback: CB) -> CB::Output
+ where
+ CB: ProducerCallback<Self::Item>,
+ {
+ callback.callback(VectorProducer { focus: self.focus })
+ }
+}
+
+/// A mutable parallel iterator for [`Vector`][Vector].
+///
+/// [Vector]: ../struct.Vector.html
+pub struct ParIterMut<'a, A>
+where
+ A: Clone + Send + Sync,
+{
+ focus: FocusMut<'a, A>,
+}
+
+impl<'a, A> ParallelIterator for ParIterMut<'a, A>
+where
+ A: Clone + Send + Sync + 'a,
+{
+ type Item = &'a mut A;
+
+ fn drive_unindexed<C>(self, consumer: C) -> C::Result
+ where
+ C: UnindexedConsumer<Self::Item>,
+ {
+ bridge(self, consumer)
+ }
+}
+
+impl<'a, A> IndexedParallelIterator for ParIterMut<'a, A>
+where
+ A: Clone + Send + Sync + 'a,
+{
+ fn drive<C>(self, consumer: C) -> C::Result
+ where
+ C: Consumer<Self::Item>,
+ {
+ bridge(self, consumer)
+ }
+
+ fn len(&self) -> usize {
+ self.focus.len()
+ }
+
+ fn with_producer<CB>(self, callback: CB) -> CB::Output
+ where
+ CB: ProducerCallback<Self::Item>,
+ {
+ callback.callback(VectorMutProducer { focus: self.focus })
+ }
+}
+
+struct VectorProducer<'a, A>
+where
+ A: Clone + Send + Sync,
+{
+ focus: Focus<'a, A>,
+}
+
+impl<'a, A> Producer for VectorProducer<'a, A>
+where
+ A: Clone + Send + Sync + 'a,
+{
+ type Item = &'a A;
+ type IntoIter = Iter<'a, A>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.focus.into_iter()
+ }
+
+ fn split_at(self, index: usize) -> (Self, Self) {
+ let (left, right) = self.focus.split_at(index);
+ (
+ VectorProducer { focus: left },
+ VectorProducer { focus: right },
+ )
+ }
+}
+
+struct VectorMutProducer<'a, A>
+where
+ A: Clone + Send + Sync,
+{
+ focus: FocusMut<'a, A>,
+}
+
+impl<'a, A> Producer for VectorMutProducer<'a, A>
+where
+ A: Clone + Send + Sync + 'a,
+{
+ type Item = &'a mut A;
+ type IntoIter = IterMut<'a, A>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.focus.into_iter()
+ }
+
+ fn split_at(self, index: usize) -> (Self, Self) {
+ let (left, right) = self.focus.split_at(index);
+ (
+ VectorMutProducer { focus: left },
+ VectorMutProducer { focus: right },
+ )
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::super::*;
+ use super::proptest::vector;
+ use ::proptest::num::i32;
+ use ::proptest::proptest;
+ use ::rayon::iter::{IntoParallelRefIterator, IntoParallelRefMutIterator, ParallelIterator};
+
+ proptest! {
+ #[test]
+ fn par_iter(ref mut input in vector(i32::ANY, 0..10000)) {
+ assert_eq!(input.iter().max(), input.par_iter().max())
+ }
+
+ #[test]
+ fn par_mut_iter(ref mut input in vector(i32::ANY, 0..10000)) {
+ let mut vec = input.clone();
+ vec.par_iter_mut().for_each(|i| *i = i.overflowing_add(1).0);
+ let expected: Vector<i32> = input.clone().into_iter().map(|i| i.overflowing_add(1).0).collect();
+ assert_eq!(expected, vec);
+ }
+ }
+}