1 package io.atlassian.fugue.optic;
2
3 import io.atlassian.fugue.Either;
4 import io.atlassian.fugue.Monoid;
5 import io.atlassian.fugue.Option;
6 import io.atlassian.fugue.Pair;
7
8 import java.util.function.BiFunction;
9 import java.util.function.BinaryOperator;
10 import java.util.function.Function;
11 import java.util.function.Supplier;
12 import java.util.stream.Stream;
13
14 public final class Traversal<S, A> extends PTraversal<S, S, A, A> {
15
16 final PTraversal<S, S, A, A> pTraversal;
17
18 public Traversal(final PTraversal<S, S, A, A> pTraversal) {
19 this.pTraversal = pTraversal;
20 }
21
22 @Override public <C> Function<S, Function<C, S>> modifyFunctionF(final Function<A, Function<C, A>> f) {
23 return pTraversal.modifyFunctionF(f);
24 }
25
26 @Override public <L> Function<S, Either<L, S>> modifyEitherF(final Function<A, Either<L, A>> f) {
27 return pTraversal.modifyEitherF(f);
28 }
29
30 @Override public Function<S, Option<S>> modifyOptionF(final Function<A, Option<A>> f) {
31 return pTraversal.modifyOptionF(f);
32 }
33
34 @Override public Function<S, Iterable<S>> modifyIterableF(final Function<A, Iterable<A>> f) {
35 return pTraversal.modifyIterableF(f);
36 }
37
38 @Override public Function<S, Supplier<S>> modifySupplierF(final Function<A, Supplier<A>> f) {
39 return pTraversal.modifySupplierF(f);
40 }
41
42 @Override public Function<S, Pair<S, S>> modifyPairF(final Function<A, Pair<A, A>> f) {
43 return pTraversal.modifyPairF(f);
44 }
45
46 @Override public <M> Function<S, M> foldMap(final Monoid<M> monoid, final Function<A, M> f) {
47 return pTraversal.foldMap(monoid, f);
48 }
49
50
51
52
53 public final <S1> Traversal<Either<S, S1>, A> sum(final Traversal<S1, A> other) {
54 return new Traversal<>(pTraversal.sum(other.pTraversal));
55 }
56
57
58
59
60
61
62
63
64 public final <C> Setter<S, C> composeSetter(final Setter<A, C> other) {
65 return new Setter<>(pTraversal.composeSetter(other.pSetter));
66 }
67
68
69
70
71 public final <C> Traversal<S, C> composeTraversal(final Traversal<A, C> other) {
72 return new Traversal<>(pTraversal.composeTraversal(other.pTraversal));
73 }
74
75
76
77
78
79
80
81
82 @Override public final Setter<S, A> asSetter() {
83 return new Setter<>(pTraversal.asSetter());
84 }
85
86 public static <S> Traversal<S, S> id() {
87 return new Traversal<>(pId());
88 }
89
90 public static <S> Traversal<Either<S, S>, S> codiagonal() {
91 return new Traversal<>(pCodiagonal());
92 }
93
94 public static <S, A> Traversal<S, A> traversal(final Function<S, A> get1, final Function<S, A> get2, final BiFunction<A, A, Function<S, S>> set) {
95 return new Traversal<>(pTraversal(get1, get2, set));
96 }
97
98 public static <S, A> Traversal<S, A> traversal(final Function<S, A> get1, final Function<S, A> get2, final Function<S, A> get3,
99 final Function<A, Function<A, Function<A, Function<S, S>>>> set) {
100 return new Traversal<>(pTraversal(get1, get2, get3, set));
101 }
102
103 public static <S, A> Traversal<S, A> traversal(final Function<S, A> get1, final Function<S, A> get2, final Function<S, A> get3,
104 final Function<S, A> get4, final Function<A, Function<A, Function<A, Function<A, Function<S, S>>>>> set) {
105 return new Traversal<>(pTraversal(get1, get2, get3, get4, set));
106 }
107
108 public static <S, A> Traversal<S, A> traversal(final Function<S, A> get1, final Function<S, A> get2, final Function<S, A> get3,
109 final Function<S, A> get4, final Function<S, A> get5, final Function<A, Function<A, Function<A, Function<A, Function<A, Function<S, S>>>>>> set) {
110 return new Traversal<>(pTraversal(get1, get2, get3, get4, get5, set));
111 }
112
113 public static <S, A> Traversal<S, A> traversal(final Function<S, A> get1, final Function<S, A> get2, final Function<S, A> get3,
114 final Function<S, A> get4, final Function<S, A> get5, final Function<S, A> get6,
115 final Function<A, Function<A, Function<A, Function<A, Function<A, Function<A, Function<S, S>>>>>>> set) {
116 return new Traversal<>(pTraversal(get1, get2, get3, get4, get5, get6, set));
117 }
118
119 }