|
|
@@ -7,7 +7,6 @@
|
|
|
|
|
|
package net.ranides.assira.collection.lists;
|
|
|
|
|
|
-import java.util.AbstractList;
|
|
|
import java.util.List;
|
|
|
import java.util.ListIterator;
|
|
|
import java.util.function.Function;
|
|
|
@@ -15,6 +14,7 @@ import java.util.function.IntFunction;
|
|
|
import java.util.function.Predicate;
|
|
|
import java.util.stream.Collectors;
|
|
|
import net.ranides.assira.collection.CollectionUtils;
|
|
|
+import net.ranides.assira.functional.ProjectionFunction;
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
@@ -63,7 +63,7 @@ public final class ListUtils {
|
|
|
}
|
|
|
|
|
|
public static <S,T> List<T> map(List<S> values, Function<S,T> function) {
|
|
|
- return new AbstractList<T>() {
|
|
|
+ return new VirtualList<T>() {
|
|
|
@Override
|
|
|
public T get(int index) {
|
|
|
return function.apply(values.get(index));
|
|
|
@@ -75,6 +75,37 @@ public final class ListUtils {
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
+
|
|
|
+ public static <S,T> List<T> map(List<S> values, ProjectionFunction<S,T> function) {
|
|
|
+ return new VirtualList<T>() {
|
|
|
+ @Override
|
|
|
+ public T get(int index) {
|
|
|
+ return function.apply(values.get(index));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int size() {
|
|
|
+ return values.size();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public T set(int index, T element) {
|
|
|
+ S prev = values.set(index, function.invert(element));
|
|
|
+ return null==prev ? null : function.apply(prev);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void add(int index, T element) {
|
|
|
+ values.add(index, function.invert(element));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public T remove(int index) {
|
|
|
+ return function.apply(values.remove(index));
|
|
|
+ }
|
|
|
+
|
|
|
+ };
|
|
|
+ }
|
|
|
|
|
|
public static <Q> List<Q> produce(int size, IntFunction<Q> function) {
|
|
|
return new VirtualList<Q>() {
|