View Javadoc
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     * join two {@link Traversal} with the same target
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    /** Compose methods between a {@link Traversal} and another Optics */
57    /***************************************************************/
58  
59    /**
60     * compose a {@link Traversal} with a {@link Setter}
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     * compose a {@link Traversal} with a {@link Traversal}
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    /** Transformation methods to view a {@link Traversal} as another Optics */
75    /*********************************************************************/
76  
77    /**
78     * view a {@link Traversal} as a {@link Setter}
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 }