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