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.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     * join two {@link Traversal} with the same target
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    /** Compose methods between a {@link Traversal} and another Optics */
59    /***************************************************************/
60  
61    /**
62     * compose a {@link Traversal} with a {@link Setter}
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     * compose a {@link Traversal} with a {@link Traversal}
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    /** Transformation methods to view a {@link Traversal} as another Optics */
77    /*********************************************************************/
78  
79    /**
80     * view a {@link Traversal} as a {@link Setter}
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 }