-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathEither.java
More file actions
104 lines (76 loc) · 2.07 KB
/
Either.java
File metadata and controls
104 lines (76 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.github.lokic.javaplus;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.io.Serializable;
import java.util.NoSuchElementException;
import java.util.function.Function;
public interface Either<L, R> {
static <L, R> Either<L, R> left(L left) {
return new Left<>(left);
}
static <L, R> Either<L, R> right(R right) {
return new Right<>(right);
}
L getLeft();
R getRight();
boolean isLeft();
boolean isRight();
@SuppressWarnings("unchecked")
default <U> Either<L, U> flatMap(Function<? super R, ? extends Either<L, ? extends U>> mapper) {
if (isRight()) {
return (Either<L, U>) mapper.apply(getRight());
} else {
return (Either<L, U>) this;
}
}
@ToString
@EqualsAndHashCode
final class Left<L, R> implements Either<L, R>, Serializable {
private static final long serialVersionUID = 1L;
private final L value;
private Left(L value) {
this.value = value;
}
@Override
public L getLeft() {
return value;
}
@Override
public R getRight() {
throw new NoSuchElementException("getRight() at Left");
}
@Override
public boolean isLeft() {
return true;
}
@Override
public boolean isRight() {
return false;
}
}
@ToString
@EqualsAndHashCode
final class Right<L, R> implements Either<L, R>, Serializable {
private static final long serialVersionUID = 1L;
private final R value;
private Right(R value) {
this.value = value;
}
@Override
public L getLeft() {
throw new NoSuchElementException("getLeft() at Right");
}
@Override
public R getRight() {
return value;
}
@Override
public boolean isLeft() {
return false;
}
@Override
public boolean isRight() {
return true;
}
}
}