-
Notifications
You must be signed in to change notification settings - Fork 0
/
option.go
65 lines (55 loc) · 1.18 KB
/
option.go
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
// SPDX-License-Identifier: 0BSD
package sx
var _ Container = &Optional[int]{}
var _ Container = NewOptional[int]()
var _ Container = NewOptionalFrom(1)
var _ Iterable[int, int] = &Optional[int]{}
var _ Iterable[int, int] = NewOptional[int]()
var _ Iterable[int, int] = NewOptionalFrom(1)
func NewOptional[V any]() Optional[V] {
var opt = Optional[V]{
valid: false,
}
return opt
}
func NewOptionalFrom[V any](value V) Optional[V] {
var opt = Optional[V]{
data: value,
valid: true,
}
return opt
}
type Optional[T any] struct {
data T
valid bool
}
func (opt Optional[T]) IsEmpty() bool {
return !opt.valid
}
func (opt Optional[T]) Length() int {
if opt.IsEmpty() {
return 0
}
return 1
}
func (opt Optional[T]) Value() T {
if opt.IsEmpty() {
Throw("Fatal error: accessing empty optional value")
}
return opt.data
}
func (opt Optional[T]) ValueOr(defaultValue T) T {
if !opt.IsEmpty() {
return opt.data
}
return defaultValue
}
func (opt Optional[T]) ValueOrDefault() (value T) {
return opt.ValueOr(value)
}
func (opt Optional[T]) NewIterator() Iterator[int, T] {
if !opt.IsEmpty() {
return NewArrayFrom(opt.data).NewIterator()
}
return NewArray[T]().NewIterator()
}