Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package pcollections for openSUSE:Factory 
checked in at 2025-12-26 14:38:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/pcollections (Old)
 and      /work/SRC/openSUSE:Factory/.pcollections.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "pcollections"

Fri Dec 26 14:38:03 2025 rev:2 rq:1324434 version:5.0.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/pcollections/pcollections.changes        
2024-09-09 14:43:44.448957287 +0200
+++ /work/SRC/openSUSE:Factory/.pcollections.new.1928/pcollections.changes      
2025-12-26 14:38:22.900600425 +0100
@@ -1,0 +2,8 @@
+Wed Dec 24 22:17:55 UTC 2025 - Anton Shvetz <[email protected]>
+
+- Update to v5.0.0
+  * Faster OrderedPMap.containsKey() and OrderedPSet.contains()
+  * Dropped Java 8 support, as it was getting harder to maintain
+    the build system
+
+-------------------------------------------------------------------

Old:
----
  pcollections-4.0.2.pom
  pcollections-4.0.2.tar.gz

New:
----
  _scmsync.obsinfo
  build.specials.obscpio
  pcollections-5.0.0.pom
  pcollections-5.0.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ pcollections.spec ++++++
--- /var/tmp/diff_new_pack.EIx6t8/_old  2025-12-26 14:38:23.380620167 +0100
+++ /var/tmp/diff_new_pack.EIx6t8/_new  2025-12-26 14:38:23.384620332 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package pcollections
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           pcollections
-Version:        4.0.2
+Version:        5.0.0
 Release:        0
 Summary:        A Persistent Java Collections Library
 License:        MIT
@@ -46,15 +46,14 @@
 API documentation for %{name}.
 
 %prep
-%setup -q
+%autosetup
+
 cp %{SOURCE1} pom.xml
 
 %{mvn_file} : %{name}
 
 %build
-%{mvn_build} -f -- \
-       -Dproject.build.outputTimestamp=$(date -u -d 
@${SOURCE_DATE_EPOCH:-$(date +%%s)} +%%Y-%%m-%%dT%%H:%%M:%%SZ) \
-       -Dmaven.compiler.release=11
+%{mvn_build} -f -- -Dmaven.compiler.release=11
 
 %install
 %mvn_install

++++++ _scmsync.obsinfo ++++++
mtime: 1766614864
commit: 00ebb8c3ed06fd578f3d098a47b8fb46f7a978aa655f9b281eac5c5b2c581ef4
url: https://src.opensuse.org/java-packages/pcollections.git
revision: 00ebb8c3ed06fd578f3d098a47b8fb46f7a978aa655f9b281eac5c5b2c581ef4
projectscmsync: https://src.opensuse.org/java-packages/_ObsPrj

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2025-12-26 09:12:26.000000000 +0100
@@ -0,0 +1 @@
+.osc

++++++ pcollections-4.0.2.pom -> pcollections-5.0.0.pom ++++++
--- /work/SRC/openSUSE:Factory/pcollections/pcollections-4.0.2.pom      
2024-09-09 14:43:44.424956291 +0200
+++ /work/SRC/openSUSE:Factory/.pcollections.new.1928/pcollections-5.0.0.pom    
2025-12-26 14:38:22.816596970 +0100
@@ -9,7 +9,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.pcollections</groupId>
   <artifactId>pcollections</artifactId>
-  <version>4.0.2</version>
+  <version>5.0.0</version>
   <name>PCollections</name>
   <description>A Persistent Java Collections Library</description>
   <url>https://github.com/hrldcpr/pcollections</url>

++++++ pcollections-4.0.2.tar.gz -> pcollections-5.0.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pcollections-4.0.2/CHANGELOG.md 
new/pcollections-5.0.0/CHANGELOG.md
--- old/pcollections-4.0.2/CHANGELOG.md 2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/CHANGELOG.md 2025-07-23 06:11:33.000000000 +0200
@@ -1,74 +1,117 @@
 # Changelog
+
 All notable changes to this project will be documented in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic 
Versioning](https://semver.org/spec/v2.0.0.html).
 
 ## [Unreleased]
- - Serialization bug fix 
[[#115](https://github.com/hrldcpr/pcollections/pull/115) by 
[@tonivade](https://github.com/tonivade)]
- - …
+
+- Faster `OrderedPMap.containsKey()` and `OrderedPSet.contains()` 
[[#122](https://github.com/hrldcpr/pcollections/pull/122) 
[#123](https://github.com/hrldcpr/pcollections/pull/123) by 
[@oxbowlakes](https://github.com/oxbowlakes)]
+- Dropped Java 8 support, as it was getting harder to maintain the build system
+- ...
+
+## [4.0.2] - 2024-03-17
+
+- Serialization bug fix 
[[#115](https://github.com/hrldcpr/pcollections/pull/115) by 
[@tonivade](https://github.com/tonivade)]
 
 ## [4.0.1] - 2022-10-28
+
 ### Added
+
 - Java 9+ Module support 
[[#109](https://github.com/hrldcpr/pcollections/pull/109) by 
[@BomBardyGamer](https://github.com/BomBardyGamer)]
+
 ### Changed
+
 - More specific return types for each `PSet.intersect()` implementation 
[[#107](https://github.com/hrldcpr/pcollections/pull/107) by 
[@prdoyle](https://github.com/prdoyle)]
 
 ## [4.0.0] - 2022-10-18
+
 ### Added
+
 - `OrderedPMap` [[#102](https://github.com/hrldcpr/pcollections/pull/102)]
 - `PSet.intersect()` [[#99](https://github.com/hrldcpr/pcollections/pull/99) 
by [@prdoyle](https://github.com/prdoyle)]
+
 ### Changed
+
 - Mutator methods consistently throw `UnsupportedOperationException` 
[[#93](https://github.com/hrldcpr/pcollections/issues/93)] 
[[#97](https://github.com/hrldcpr/pcollections/pull/97) by 
[@prdoyle](https://github.com/prdoyle)]
 - `OrderedPSet.minus()` is faster—logarithmic instead of linear 
[[#101](https://github.com/hrldcpr/pcollections/pull/101)]
 - Null values are now supported 
[[#97](https://github.com/hrldcpr/pcollections/pull/97) by 
[@prdoyle](https://github.com/prdoyle)] 
[[7e2f912...6094912](https://github.com/hrldcpr/pcollections/compare/7e2f912...6094912)]
+
 ### Removed
+
 - ~`POrderedSet`~ interface, since it adds nothing beyond `PSet` 
[[#98](https://github.com/hrldcpr/pcollections/pull/98)]
 - ~`OrderedPSet.get()`~ and ~`OrderedPSet.indexOf()`~ 
[[#98](https://github.com/hrldcpr/pcollections/pull/98)]
 
 ## [3.2.0] - 2022-08-17
+
 ### Added
+
 - Sorted maps and sorted sets 
[[#92](https://github.com/hrldcpr/pcollections/pull/92) by 
[@ran-arigur](https://github.com/ran-arigur)]
+
 ### Changed
+
 - Only use one build system 
[[#64](https://github.com/hrldcpr/pcollections/issues/64)]
 
 ## [3.1.4] - 2020-09-13
+
 ### Fixed
+
 - Empty Iterator.next() throws `NoSuchElementException` 
[[#46](https://github.com/hrldcpr/pcollections/pull/46) by 
[@ilya-g](https://github.com/ilya-g)]
 
 ## [3.1.3] - 2020-01-28
+
 ### Fixed
+
 - `ConsPStack.listIterator()` indices and `ConsPStack.indexOf()` were broken
 - Stack overflows in `ConsPStack` 
[[#82](https://github.com/hrldcpr/pcollections/pull/82)]
+
 ### Changed
+
 - `ConsPStack.minusAll(list)` reuses existing structure when possible
 
 ## [3.1.2] - 2019-12-14
+
 ### Added
+
 - Config file for users of GraalVM native images 
[[#80](https://github.com/hrldcpr/pcollections/pull/80) by 
[@jkremser](https://github.com/jkremser)]
 
 ## [3.1.1] - 2019-12-11
+
 ### Fixed
+
 - Serialization crash for `IntTreePMap` and associated classes such as 
`HashTreePSet` and `TreePVector` 
[[#79](https://github.com/hrldcpr/pcollections/issues/79) reported by 
[@Maaartinus](https://github.com/Maaartinus)]
 
 ## [3.1.0] - 2019-08-02
+
 ### Added
+
 - `IntTreePMap.minusRange()`
+
 ### Changed
+
 - Faster `TreePVector.subList()` makes fewer calls to `TreePVector()`, 
`IntTreePMap()`, and `IntTreePMap.withKeysChangedAbove()` [suggested by 
[@Groostav](https://github.com/Groostav) in 
[#74](https://github.com/hrldcpr/pcollections/issues/74)]
 - Reformat with 
[google-java-format](https://github.com/google/google-java-format)
 
 ## [3.0.4] - 2019-07-24
+
 ### Fixed
+
 - Stack overflows for large stacks and vectors when calling 
`ConsPStack.subList()` and `TreePVector.subList()` 
[[#74](https://github.com/hrldcpr/pcollections/issues/74) reported by 
[@Groostav](https://github.com/Groostav)]
 
 ## [3.0.3] - 2018-09-12
+
 ### Fixed
+
 - HashPMap serialization no longer breaks after `.entrySet()` has been called 
[[#71](https://github.com/hrldcpr/pcollections/issues/71) reported by 
[@Noctune](https://github.com/Noctune)]
 
 ## [3.0.2] - 2018-05-14
+
 ### Added
+
 - This changelog!
+
 ### Changed
+
 - Compatibility with Java 1.6+, and Android 
[[#67](https://github.com/hrldcpr/pcollections/pull/67) by 
[@guenhter](https://github.com/guenhter)]
 - Use Gradle 4.7 [[#66](https://github.com/hrldcpr/pcollections/pull/66) by 
[@guenhter](https://github.com/guenhter)]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pcollections-4.0.2/CHANGING.md 
new/pcollections-5.0.0/CHANGING.md
--- old/pcollections-4.0.2/CHANGING.md  2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/CHANGING.md  2025-07-23 06:11:33.000000000 +0200
@@ -1,21 +1,25 @@
 First time setup:
-- create a `gradle.properties` a la 
https://central.sonatype.org/pages/gradle.html#credentials
+
+- **TODO** do we need to generate signing keys for Sonatype?
 - download `google-java-format-1.21.0-all-deps.jar` from 
https://github.com/google/google-java-format/releases
 
 To release:
+
 - run `java -jar google-java-format-1.21.0-all-deps.jar --replace src/**.java` 
(note this uses Fish Shell syntax, you'll need to do something else in other 
shells)
 - remove -SNAPSHOT from the version in build.gradle
 - commit with a tag
-- run `./gradlew test publish`
-
-Then follow the instructions at 
https://central.sonatype.org/pages/releasing-the-deployment.html
+- `./gradlew test publish`
+- `cd build/repo && tar cvzf archive.tgz org/`
+- go to https://central.sonatype.com/ and log in and click Publish
+- for Deployment Name use "org.pcollections:pcollections:4.3.2" (replace with 
actual version)
+- upload archive.tgz, and publish it once it's verified
 
 Finally, increment the version in build.gradle and add back -SNAPSHOT, and 
commit.
 
 Finally finally, once the new version is available in Maven Central (takes a 
few hours), update the version in the Maven and Gradle snippets in the README 
and update CHANGELOG.md.
 
-
 …also, if you want to run the benchmarks:
 (They're a bit janky and take forever, but you can always add your own and 
comment out the ones you don't want to run.)
+
 - `./gradlew --stop; rm -fr build/ && ./gradlew jmh`
-(Stopping the daemon and deleting build/ fixes issues when you're changing or 
commenting out benchmarks.)
+  (Stopping the daemon and deleting build/ fixes issues when you're changing 
or commenting out benchmarks.)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pcollections-4.0.2/README.md 
new/pcollections-5.0.0/README.md
--- old/pcollections-4.0.2/README.md    2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/README.md    2025-07-23 06:11:33.000000000 +0200
@@ -1,5 +1,4 @@
-PCollections
-============
+# PCollections
 
 A Persistent Java Collections Library
 
@@ -14,47 +13,52 @@
 
 ### Persistent versus Unmodifiable
 
-Note that these immutable collections are very different from the immutable 
collections returned by Java's 
[Collections.unmodifiableCollection()](https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Collections.html#unmodifiableCollection(java.util.Collection))
 and similar methods. The difference is that Java's unmodifiable collections 
have no producers, whereas PCollections have very efficient producers.
+Note that these immutable collections are very different from the immutable 
collections returned by Java's 
[Collections.unmodifiableCollection()](<https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Collections.html#unmodifiableCollection(java.util.Collection)>)
 and similar methods. The difference is that Java's unmodifiable collections 
have no producers, whereas PCollections have very efficient producers.
 
 Thus if you have an unmodifiable Collection `x` and you want a new Collection 
`x2` consisting of the elements of `x` in addition to some element `e`, you 
would have to do something like:
+
 ```Java
 Collection x2 = new HashSet(x);
 x2.add(e);
 ```
+
 which involves copying all of `x`, using linear time and space.
 
 If, on the other hand, you have a PCollection `y` you can simply say:
+
 ```Java
 PCollection y2 = y.plus(e);
 ```
+
 which still leaves `y` untouched but generally requires little or no copying, 
using time and space much more efficiently.
 
 ### Usage
 
-PCollections are created using producers and static factory methods. Some 
example static factory methods are 
[`HashTreePSet.empty()`](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/HashTreePSet.html#empty())
 which returns an empty 
[PSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PSet.html),
 while `HashTreePSet.singleton(e)` returns a PSet containing just the element 
`e`, and `HashTreePSet.from(collection)` returns a PSet containing the same 
elements as `collection`. See [Example Code](#example-code) below for an 
example of using producers.
+PCollections are created using producers and static factory methods. Some 
example static factory methods are 
[`HashTreePSet.empty()`](<https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/HashTreePSet.html#empty()>)
 which returns an empty 
[PSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PSet.html),
 while `HashTreePSet.singleton(e)` returns a PSet containing just the element 
`e`, and `HashTreePSet.from(collection)` returns a PSet containing the same 
elements as `collection`. See [Example Code](#example-code) below for an 
example of using producers.
 
 The same `empty()`, `singleton()`, and `from()` factory methods are found in 
each of the PCollections implementations, which currently include one concrete 
implementation for each abstract type:
-* 
[HashTreePMap](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/HashTreePMap.html)
 provides a 
[PMap](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PMap.html)
 implementation, analogous to Java's HashMap.
-* 
[TreePMap](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/TreePMap.html)
 provides a
-[PSortedMap](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PSortedMap.html)
 implementation,
-analogous to Java's TreeMap.
-* 
[ConsPStack](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/ConsPStack.html)
 provides a 
[PStack](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PStack.html)
 implementation, analogous to Java's LinkedList.
-* 
[TreePVector](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/TreePVector.html)
 provides a 
[PVector](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PVector.html)
 implementation, analogous to Java's ArrayList.
-* 
[HashTreePSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/HashTreePSet.html)
 provides a 
[PSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PSet.html)
 implementation, analogous to Java's HashSet.
-* 
[TreePSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/TreePSet.html)
 provides a
-[PSortedSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PSortedSet.html)
 implementation,
-analogous to Java's TreeSet.
-* 
[HashTreePBag](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/HashTreePBag.html)
 provides a 
[PBag](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PBag.html)
 implementation, which is unordered like a set but can contain duplicate 
elements.
+
+- 
[HashTreePMap](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/HashTreePMap.html)
 provides a 
[PMap](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PMap.html)
 implementation, analogous to Java's HashMap.
+- 
[TreePMap](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/TreePMap.html)
 provides a
+  
[PSortedMap](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PSortedMap.html)
 implementation,
+  analogous to Java's TreeMap.
+- 
[ConsPStack](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/ConsPStack.html)
 provides a 
[PStack](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PStack.html)
 implementation, analogous to Java's LinkedList.
+- 
[TreePVector](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/TreePVector.html)
 provides a 
[PVector](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PVector.html)
 implementation, analogous to Java's ArrayList.
+- 
[HashTreePSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/HashTreePSet.html)
 provides a 
[PSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PSet.html)
 implementation, analogous to Java's HashSet.
+- 
[TreePSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/TreePSet.html)
 provides a
+  
[PSortedSet](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PSortedSet.html)
 implementation,
+  analogous to Java's TreeSet.
+- 
[HashTreePBag](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/HashTreePBag.html)
 provides a 
[PBag](https://javadoc.io/doc/org.pcollections/pcollections/latest/org.pcollections/org/pcollections/PBag.html)
 implementation, which is unordered like a set but can contain duplicate 
elements.
 
 PCollections are highly interoperable with Java Collections:
 
-* Every PCollection is a java.util.Collection.
-* Every PMap is a java.util.Map.
-* Every PSequence is a java.util.List.
-    * This includes every PStack and every PVector.
-* Every PSet is a java.util.Set.
-* Every PSortedMap is a java.util.SortedMap and java.util.NavigableMap.
-* Every PSortedSet is a java.util.SortedSet and java.util.NavigableSet.
+- Every PCollection is a java.util.Collection.
+- Every PMap is a java.util.Map.
+- Every PSequence is a java.util.List.
+  - This includes every PStack and every PVector.
+- Every PSet is a java.util.Set.
+- Every PSortedMap is a java.util.SortedMap and java.util.NavigableMap.
+- Every PSortedSet is a java.util.SortedSet and java.util.NavigableSet.
 
 PCollections uses [Semantic Versioning](https://semver.org/), which 
establishes a strong correspondence between API changes and version numbering.
 
@@ -64,18 +68,20 @@
 <dependency>
     <groupId>org.pcollections</groupId>
     <artifactId>pcollections</artifactId>
-    <version>4.0.1</version>
+    <version>4.0.2</version>
 </dependency>
 ```
 
 or Gradle:
+
 ```groovy
-compile 'org.pcollections:pcollections:4.0.1'
+compile 'org.pcollections:pcollections:4.0.2'
 ```
 
 ### Example Code
 
 The following gives a very simple example of using PCollections, including the 
static factory method HashTreePSet.empty() and the producer plus(e):
+
 ```Java
 import org.pcollections.*;
 
@@ -90,7 +96,9 @@
   }
 }
 ```
+
 Running this program gives the following output:
+
 ```
 [something]
 [something else, something]
@@ -98,8 +106,9 @@
 ```
 
 ### Building from source
+
 To build the project from source [clone the 
repository](https://github.com/hrldcpr/pcollections) and then run `./gradlew`
 
 ### Related Work
 
-[Clojure](https://clojure.org/reference/data_structures), 
[Scala](https://docs.scala-lang.org/overviews/collections-2.13/introduction.html),
 and 
[kotlinx.collections.immutable](https://github.com/Kotlin/kotlinx.collections.immutable)
 also provide persistent collections on the JVM, but they are less 
interoperable with Java. Both 
[Guava](https://guava.dev/releases/19.0/api/docs/com/google/common/collect/ImmutableCollection.html)
 and 
[java.util.Collections](https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Collections.html#unmodifiableCollection(java.util.Collection))
 provide immutable collections but they are not persistent—that is, they do not 
provide efficient producers—so they are not nearly as useful. See [Persistent 
versus Unmodifiable](#persistent-versus-unmodifiable) above.
+[Clojure](https://clojure.org/reference/data_structures), 
[Scala](https://docs.scala-lang.org/overviews/collections-2.13/introduction.html),
 and 
[kotlinx.collections.immutable](https://github.com/Kotlin/kotlinx.collections.immutable)
 also provide persistent collections on the JVM, but they are less 
interoperable with Java. Both 
[Guava](https://guava.dev/releases/19.0/api/docs/com/google/common/collect/ImmutableCollection.html)
 and 
[java.util.Collections](<https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Collections.html#unmodifiableCollection(java.util.Collection)>)
 provide immutable collections but they are not persistent—that is, they do not 
provide efficient producers—so they are not nearly as useful. See [Persistent 
versus Unmodifiable](#persistent-versus-unmodifiable) above.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pcollections-4.0.2/build.gradle 
new/pcollections-5.0.0/build.gradle
--- old/pcollections-4.0.2/build.gradle 2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/build.gradle 2025-07-23 06:11:33.000000000 +0200
@@ -1,6 +1,5 @@
 plugins {
-    id 'me.champeau.jmh' version '0.6.8'
-    id 'org.javamodularity.moduleplugin' version '1.8.12'
+    id 'me.champeau.jmh' version '0.7.3'
     id 'java'
     id 'maven-publish'
     id 'signing'
@@ -9,7 +8,7 @@
 defaultTasks 'build'
 
 group = 'org.pcollections'
-version = '4.0.2'
+version = '5.0.0'
 
 description = """PCollections"""
 
@@ -23,6 +22,7 @@
     testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
     testImplementation "org.junit.jupiter:junit-jupiter-params:5.9.0"
     testImplementation 'org.junit.vintage:junit-vintage-engine:5.9.0'
+    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
     testImplementation 'org.assertj:assertj-core:3.23.1'
 }
 
@@ -31,6 +31,12 @@
 }
 
 java {
+    toolchain {
+        // our code works with Java 8, but module-info.java only works with 
Java 9+
+        // we used to use `modularity.mixedJavaRelease 8` to deal with this,
+        // but Java 8 is old enough now that simpler build process wins
+        languageVersion = JavaLanguageVersion.of(9)
+    }
     withSourcesJar()
     withJavadocJar()
 }
@@ -49,14 +55,7 @@
 publishing {
   repositories {
     maven {
-      def releasesRepoUrl = 
'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
-      def snapshotsRepoUrl = 
'https://oss.sonatype.org/content/repositories/snapshots/'
-      url version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
-
-      credentials {
-        username providers.gradleProperty('ossrhUsername').getOrElse('dummy')
-        password providers.gradleProperty('ossrhPassword').getOrElse('dummy')
-      }
+      url = layout.buildDirectory.dir("repo")
     }
   }
   publications {
@@ -98,5 +97,3 @@
 signing {
     sign(publishing.publications.mavenJava)
 }
-
-modularity.mixedJavaRelease 8
Binary files old/pcollections-4.0.2/gradle/wrapper/gradle-wrapper.jar and 
new/pcollections-5.0.0/gradle/wrapper/gradle-wrapper.jar differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pcollections-4.0.2/gradle/wrapper/gradle-wrapper.properties 
new/pcollections-5.0.0/gradle/wrapper/gradle-wrapper.properties
--- old/pcollections-4.0.2/gradle/wrapper/gradle-wrapper.properties     
2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/gradle/wrapper/gradle-wrapper.properties     
2025-07-23 06:11:33.000000000 +0200
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pcollections-4.0.2/gradlew 
new/pcollections-5.0.0/gradlew
--- old/pcollections-4.0.2/gradlew      2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/gradlew      2025-07-23 06:11:33.000000000 +0200
@@ -1,78 +1,129 @@
-#!/usr/bin/env sh
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
 
 ##############################################################################
-##
-##  Gradle start up script for UN*X
-##
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       
https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
 ##############################################################################
 
 # Attempt to set APP_HOME
+
 # Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no 
leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
 done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
 
 APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+APP_BASE_NAME=${0##*/}
 
 # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to 
pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
 
 # Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
 
 warn () {
     echo "$*"
-}
+} >&2
 
 die () {
     echo
     echo "$*"
     echo
     exit 1
-}
+} >&2
 
 # OS specific support (must be 'true' or 'false').
 cygwin=false
 msys=false
 darwin=false
 nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
 esac
 
 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 
+
 # Determine the Java command to use to start the JVM.
 if [ -n "$JAVA_HOME" ] ; then
     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
         # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
+        JAVACMD=$JAVA_HOME/jre/sh/java
     else
-        JAVACMD="$JAVA_HOME/bin/java"
+        JAVACMD=$JAVA_HOME/bin/java
     fi
     if [ ! -x "$JAVACMD" ] ; then
         die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -81,7 +132,7 @@
 location of your Java installation."
     fi
 else
-    JAVACMD="java"
+    JAVACMD=java
     which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 
'java' command could be found in your PATH.
 
 Please set the JAVA_HOME variable in your environment to match the
@@ -89,84 +140,101 @@
 fi
 
 # Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; 
then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
 fi
 
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" 
\"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
 
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
     # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### 
Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### 
Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with 
options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX 
filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
         fi
-        i=$((i+1))
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
     done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" 
"$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" 
"$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" 
"$args6" "$args7" "$args8" ;;
-    esac
 fi
 
-# Escape application args
-save () {
-    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; 
done
-    echo " "
-}
-APP_ARGS=$(save "$@")
-
-# Collect all arguments for the java command, following the shell quoting and 
substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 
"\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" 
org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-
-# by default we should be in the correct project dir, but when run from Finder 
on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
-  cd "$(dirname "$0")"
+# Collect all arguments for the java command;
+#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+#     shell script including quotes and variable substitutions, so put them in
+#     double quotes to make sure that they get re-expanded; and
+#   * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
+        -classpath "$CLASSPATH" \
+        org.gradle.wrapper.GradleWrapperMain \
+        "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+    die "xargs is not available"
 fi
 
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes 
removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
+
 exec "$JAVACMD" "$@"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pcollections-4.0.2/gradlew.bat 
new/pcollections-5.0.0/gradlew.bat
--- old/pcollections-4.0.2/gradlew.bat  2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/gradlew.bat  2025-07-23 06:11:33.000000000 +0200
@@ -1,4 +1,20 @@
-@if "%DEBUG%" == "" @echo off
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
 @rem ##########################################################################
 @rem
 @rem  Gradle startup script for Windows
@@ -9,19 +25,22 @@
 if "%OS%"=="Windows_NT" setlocal
 
 set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
 set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
 @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS 
to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
 
 @rem Find java.exe
 if defined JAVA_HOME goto findJavaFromJavaHome
 
 set JAVA_EXE=java.exe
 %JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if %ERRORLEVEL% equ 0 goto execute
 
 echo.
 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your 
PATH.
@@ -35,7 +54,7 @@
 set JAVA_HOME=%JAVA_HOME:"=%
 set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
 
 echo.
 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,38 +64,26 @@
 
 goto fail
 
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
 :execute
 @rem Setup the command line
 
 set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 
+
 @rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% 
"-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" 
org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% 
"-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" 
org.gradle.wrapper.GradleWrapperMain %*
 
 :end
 @rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
 
 :fail
 rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code 
instead of
 rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
 
 :mainEnd
 if "%OS%"=="Windows_NT" endlocal
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pcollections-4.0.2/settings.gradle 
new/pcollections-5.0.0/settings.gradle
--- old/pcollections-4.0.2/settings.gradle      2024-03-15 19:59:07.000000000 
+0100
+++ new/pcollections-5.0.0/settings.gradle      2025-07-23 06:11:33.000000000 
+0200
@@ -1 +1,5 @@
+plugins {
+    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
+}
+
 rootProject.name = 'pcollections'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pcollections-4.0.2/src/main/java/org/pcollections/OrderedPMap.java 
new/pcollections-5.0.0/src/main/java/org/pcollections/OrderedPMap.java
--- old/pcollections-4.0.2/src/main/java/org/pcollections/OrderedPMap.java      
2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/src/main/java/org/pcollections/OrderedPMap.java      
2025-07-23 06:11:33.000000000 +0200
@@ -66,6 +66,11 @@
   }
 
   @Override
+  public boolean containsKey(Object key) {
+    return ids.containsKey(key);
+  }
+
+  @Override
   public OrderedPMap<K, V> plus(final K k, final V v) {
     Long id = ids.get(k);
     final PMap<K, Long> newIds;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pcollections-4.0.2/src/main/java/org/pcollections/OrderedPSet.java 
new/pcollections-5.0.0/src/main/java/org/pcollections/OrderedPSet.java
--- old/pcollections-4.0.2/src/main/java/org/pcollections/OrderedPSet.java      
2024-03-15 19:59:07.000000000 +0100
+++ new/pcollections-5.0.0/src/main/java/org/pcollections/OrderedPSet.java      
2025-07-23 06:11:33.000000000 +0200
@@ -53,6 +53,11 @@
   }
 
   @Override
+  public boolean contains(Object o) {
+    return ids.containsKey(o);
+  }
+
+  @Override
   public OrderedPSet<E> plus(final E e) {
     if (ids.containsKey(e)) return this;
     final Long id = elements.isEmpty() ? Long.MIN_VALUE : (elements.lastKey() 
+ 1);

Reply via email to