Skip to content

Commit 000a4b4

Browse files
authored
add group function to Seq (#2687)
1 parent b85977b commit 000a4b4

File tree

12 files changed

+67
-4
lines changed

12 files changed

+67
-4
lines changed

src/main/java/io/vavr/collection/Array.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,11 @@ public <U> Array<U> flatMap(Function<? super T, ? extends Iterable<? extends U>>
883883
}
884884
}
885885

886+
@Override
887+
public Seq<Array<T>> group() {
888+
return Collections.group(this, Array::empty);
889+
}
890+
886891
@Override
887892
public <C> Map<C, Array<T>> groupBy(Function<? super T, ? extends C> classifier) {
888893
return io.vavr.collection.Collections.groupBy(this, classifier, Array::ofAll);

src/main/java/io/vavr/collection/CharSeq.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,11 @@ public CharSeq flatMapChars(CharFunction<? extends CharSequence> mapper) {
558558
}
559559
}
560560

561+
@Override
562+
public Seq<CharSeq> group() {
563+
return Collections.group(this, CharSeq::empty);
564+
}
565+
561566
@Override
562567
public <C> Map<C, CharSeq> groupBy(Function<? super Character, ? extends C> classifier) {
563568
return io.vavr.collection.Collections.groupBy(this, classifier, CharSeq::ofAll);

src/main/java/io/vavr/collection/Collections.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,13 @@ static <C extends Traversable<T>, T> C filterNot(C source, Predicate<? super T>
211211
}
212212
}
213213

214+
@SuppressWarnings("unchecked")
215+
static <T, S extends Seq<T>> Seq<S> group(S source, Supplier<S> supplier) {
216+
return source.foldLeft(HashMap.empty(), (Map<T, S> map, T value) ->
217+
map.put(value, (S) map.getOrElse(value, supplier.get()).append(value)))
218+
.map(entry -> entry._2);
219+
}
220+
214221
static <T, C, R extends Iterable<T>> Map<C, R> groupBy(Traversable<T> source, Function<? super T, ? extends C> classifier, Function<? super Iterable<T>, R> mapper) {
215222
Objects.requireNonNull(classifier, "classifier is null");
216223
Objects.requireNonNull(mapper, "mapper is null");

src/main/java/io/vavr/collection/IndexedSeq.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,15 @@ default boolean endsWith(Seq<? extends T> that) {
152152
@Override
153153
<U> IndexedSeq<U> flatMap(Function<? super T, ? extends Iterable<? extends U>> mapper);
154154

155+
@Override
156+
Seq<? extends IndexedSeq<T>> group();
157+
155158
@Override
156159
<C> Map<C, ? extends IndexedSeq<T>> groupBy(Function<? super T, ? extends C> classifier);
157160

161+
@Override
162+
Iterator<? extends IndexedSeq<T>> grouped(int size);
163+
158164
@Override
159165
default int indexWhere(Predicate<? super T> predicate, int from) {
160166
Objects.requireNonNull(predicate, "predicate is null");
@@ -163,9 +169,6 @@ default int indexWhere(Predicate<? super T> predicate, int from) {
163169
return (n >= length()) ? -1 : n;
164170
}
165171

166-
@Override
167-
Iterator<? extends IndexedSeq<T>> grouped(int size);
168-
169172
@Override
170173
default int indexOfSlice(Iterable<? extends T> that, int from) {
171174
Objects.requireNonNull(that, "that is null");

src/main/java/io/vavr/collection/LinearSeq.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ public boolean isDefinedAt(Integer index) {
129129
@Override
130130
<U> LinearSeq<U> flatMap(Function<? super T, ? extends Iterable<? extends U>> mapper);
131131

132+
@Override
133+
Seq<? extends LinearSeq<T>> group();
134+
132135
@Override
133136
<C> Map<C, ? extends LinearSeq<T>> groupBy(Function<? super T, ? extends C> classifier);
134137

src/main/java/io/vavr/collection/List.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,11 @@ public final T apply(Integer index) {
897897
return list.head();
898898
}
899899

900+
@Override
901+
public final Seq<List<T>> group() {
902+
return Collections.group(this, List::empty);
903+
}
904+
900905
@Override
901906
public final <C> Map<C, List<T>> groupBy(Function<? super T, ? extends C> classifier) {
902907
return Collections.groupBy(this, classifier, List::ofAll);

src/main/java/io/vavr/collection/Queue.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,11 @@ public T apply(Integer index) {
807807
}
808808
}
809809

810+
@Override
811+
public Seq<Queue<T>> group() {
812+
return Collections.group(this, Queue::empty);
813+
}
814+
810815
@Override
811816
public <C> Map<C, Queue<T>> groupBy(Function<? super T, ? extends C> classifier) {
812817
return io.vavr.collection.Collections.groupBy(this, classifier, Queue::ofAll);

src/main/java/io/vavr/collection/Seq.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,13 @@ default <U> U foldRight(U zero, BiFunction<? super T, ? super U, ? extends U> f)
11961196
return reverse().foldLeft(zero, (xs, x) -> f.apply(x, xs));
11971197
}
11981198

1199+
/**
1200+
* Groups subsequent equal elements.
1201+
*
1202+
* @return a new Seq of new instances containing the equal elements.
1203+
*/
1204+
Seq<? extends Seq<T>> group();
1205+
11991206
@Override
12001207
<C> Map<C, ? extends Seq<T>> groupBy(Function<? super T, ? extends C> classifier);
12011208

src/main/java/io/vavr/collection/Stream.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,11 @@ public final T getOrElse(int index, T defaultValue) {
10871087
return getOption(index).getOrElse(defaultValue);
10881088
}
10891089

1090+
@Override
1091+
public final Seq<Stream<T>> group() {
1092+
return Collections.group(this, Stream::empty);
1093+
}
1094+
10901095
@Override
10911096
public final <C> Map<C, Stream<T>> groupBy(Function<? super T, ? extends C> classifier) {
10921097
return io.vavr.collection.Collections.groupBy(this, classifier, Stream::ofAll);

src/main/java/io/vavr/collection/Vector.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,11 @@ public T head() {
738738
}
739739
}
740740

741+
@Override
742+
public Seq<Vector<T>> group() {
743+
return Collections.group(this, Vector::empty);
744+
}
745+
741746
@Override
742747
public <C> Map<C, Vector<T>> groupBy(Function<? super T, ? extends C> classifier) { return io.vavr.collection.Collections.groupBy(this, classifier, Vector::ofAll); }
743748

0 commit comments

Comments
 (0)