1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.settings;
20
21 import java.util.AbstractList;
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.Objects;
25 import java.util.function.Consumer;
26 import java.util.function.Function;
27 import java.util.function.Supplier;
28
29 class WrapperList<T, U> extends AbstractList<T> {
30 private final Supplier<List<U>> getter;
31 private final Consumer<List<U>> setter;
32 private final Function<U, T> mapper;
33 private final Function<T, U> revMapper;
34
35 WrapperList(List<U> list, Function<U, T> mapper, Function<T, U> revMapper) {
36 this(() -> list, null, mapper, revMapper);
37 }
38
39 WrapperList(Supplier<List<U>> getter, Consumer<List<U>> setter, Function<U, T> mapper, Function<T, U> revMapper) {
40 this.getter = getter;
41 this.setter = setter;
42 this.mapper = mapper;
43 this.revMapper = revMapper;
44 }
45
46 @Override
47 public T get(int index) {
48 return mapper.apply(getter.get().get(index));
49 }
50
51 @Override
52 public int size() {
53 return getter.get().size();
54 }
55
56 @Override
57 public boolean add(T t) {
58 Objects.requireNonNull(t);
59 if (setter != null) {
60 List<U> list = new ArrayList<>(getter.get());
61 boolean ret = list.add(revMapper.apply(t));
62 setter.accept(list);
63 return ret;
64 } else {
65 return getter.get().add(revMapper.apply(t));
66 }
67 }
68
69 @Override
70 public T set(int index, T element) {
71 Objects.requireNonNull(element);
72 if (setter != null) {
73 List<U> list = new ArrayList<>(getter.get());
74 U ret = list.set(index, revMapper.apply(element));
75 setter.accept(list);
76 return mapper.apply(ret);
77 } else {
78 return mapper.apply(getter.get().set(index, revMapper.apply(element)));
79 }
80 }
81
82 @Override
83 public void add(int index, T element) {
84 Objects.requireNonNull(element);
85 if (setter != null) {
86 List<U> list = new ArrayList<>(getter.get());
87 list.add(index, revMapper.apply(element));
88 setter.accept(list);
89 } else {
90 getter.get().add(index, revMapper.apply(element));
91 }
92 }
93
94 @Override
95 public T remove(int index) {
96 if (setter != null) {
97 List<U> list = new ArrayList<>(getter.get());
98 U ret = list.remove(index);
99 setter.accept(list);
100 return mapper.apply(ret);
101 } else {
102 return mapper.apply(getter.get().remove(index));
103 }
104 }
105 }