Implement movingGeometricMean(), movingGeometricMeanBy(), runningGeometricMean(), and runningGeometricMeanBy().
Implement filterNotNull(), which filters out null values from the input stream and is useful for lining up JSpecify annotations (from nullable to non-nullable).
Fix bug in movingProduct() and movingProductBy() where zero values were incorrectly handled. Addresses #184.
Change CrossGatherer, TypeFilteringGatherer, and FlattenSingleOrFail to use Greedy integrators.
Thank you to @Riggs333 for contributing code cleanups, making comparisons in FrequencyGatherer easier to understand!
Thank you to @Riggs333 for contributing changes to tests to use AssertJ’s type-specific exception assertions, which clarifies the intent of the code!
Fix and document behavior of window() when there are multiple partial groupings at the end. Addresses #135, thanks @paulk-asert!
Implement exponential moving averages with exponentialMovingAverageWithAlpha(), exponentialMovingAverageWithAlphaBy(),exponentialMovingAverageWithPeriod(), and exponentialMovingAverageWithPeriodBy().
Change index to be an int rather than a long in filterIndexed(), foldIndexed(), mapIndexed(), peekIndexed(), scanIndexed() and withIndex(). Addresses #140.
Optimize rotate(Left) to store a minimal set of elements instead of the entire stream. Addresses #141, thanks @paulk-asert!
Implement filterInstanceOf() to filter a stream by type more easily. Addresses #86, thanks @nipafx.
Implement groupOrdered(), and groupOrderedBy() to appropriately group elements in the input stream to lists in the output stream. Addresses #88, thanks @nipafx.
Implement ensureOrdered() and ensureOrderedBy() to ensure the given stream meets an ordering criteria, or fail exceptionally otherwise
Implement filterOrdered() and filterOrderedBy() to remove non-ordered elements from the input stream
Implement window() to provide more options to windowing functions, namely - ability to specify size, how many to skip each time, and whether to include partial windows
Implement repeat(n) and repeatInfinitely() to repeatedly emit the input stream to the output stream
Implement rotate(n) rotate the stream either left or right (consumes entire stream)
Renamed everyNth(n) to takeEveryNth(n) and added dropEveryNth(n) for completeness
Renamed filterWithIndex() to filterIndexed() to match other indexing Gatherers
Renamed cross() to crossWith() for consistency
Renamed interleave() to interleaveWith() for consistency
Renamed grouping() to group() and groupingBy() to groupBy() for consistency
Implement reverse() - Cause a stream to be emitted in reverse (stores entire stream in memory)
Implement maxBy(fn) and minBy(fn) - Finds the single maximum or minimum value in a stream as defined by the function given (stores entire stream in memory)
Implement exactSize(n) - Ensures a stream is precisely n elements long or throws an IllegalStateException (stores entire stream in memory)