package com.codepoetics.octarine.functional.tuples;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Supplier;
public final class T1<A> implements Supplier<A> {
private final A a;
private T1(A a) {
this.a = a;
}
public static <S, A> Function<S, T1<A>> unpacker(Function<? super S, ? extends A> first) {
return s -> T1.of(first.apply(s));
}
public static <A> TupleLens<T1<A>, A> first() {
return TupleLens.of(
0,
T1::getFirst,
T1::withFirst
);
}
public static <A> T1<A> of(A a) {
return new T1<>(a);
}
public <R> R pack(Function<? super A, ? extends R> f) {
return f.apply(a);
}
@Override
public A get() {
return a;
}
public A getFirst() {
return a;
}
public <A2> T1<A2> withFirst(A2 a2) {
return T1.of(a2);
}
public T2<A, T0> pop() {
return Tuple.of(a, T0.INSTANCE);
}
public T2<A, T0> shift() {
return Tuple.of(a, T0.INSTANCE);
}
@Override
public boolean equals(Object o) {
if (!(o instanceof T1)) {
return false;
}
T1 other = (T1) o;
return Objects.equals(a, other.a);
}
@Override
public int hashCode() {
return a.hashCode();
}
@Override
public String toString() {
return String.format("(%s)", a);
}
}