-
Notifications
You must be signed in to change notification settings - Fork 2
/
Opt.xtend
65 lines (55 loc) · 1.87 KB
/
Opt.xtend
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
package nl.kii.util
import org.eclipse.xtext.xbase.lib.Functions.Function0
abstract class Opt<T> implements Iterable<T> {
def T value() throws NoneException
def boolean hasSome()
def boolean hasNone()
def boolean hasError()
}
class None<T> extends Opt<T> {
override value() { throw new NoneException }
override hasSome() { false }
override hasNone() { true }
override hasError() { false }
override iterator() { newLinkedList.iterator }
override equals(Object obj) { obj instanceof None<?> }
override hashCode() { 0 }
override toString() '''None'''
}
class Err<T> extends Opt<T> implements Function0<Throwable> {
val Throwable exception
new() { exception = new Exception }
new(Throwable exception) { this.exception = exception }
def getException() { exception }
def getMessage() { exception.message }
def getStackTrace() { exception.stackTrace }
override apply() { exception }
override value() { throw new NoneException }
override hasSome() { false }
override hasNone() { false }
override hasError() { true }
override iterator() { newLinkedList.iterator }
override equals(Object obj) { obj instanceof Err<?> }
override hashCode() { -1 }
override toString() '''Error («exception.message»)'''
}
class Some<T> extends Opt<T> implements Function0<T> {
var T value
new(T value) {
if(value === null) throw new NullPointerException('cannot create new Some(null)')
this.value = value
}
override value() { value }
override apply() { value }
override hasSome() { true }
override hasNone() { false }
override hasError() { false }
override iterator() { newLinkedList(value).iterator }
override hashCode() { value.hashCode }
override equals(Object obj) { obj == value || (obj instanceof Some<?>) && (obj as Some<?>).value == value }
override toString() '''Some(«value»)'''
}
class NoneException extends Exception {
new() { }
new(String message) { super(message) }
}